Este tutorial de ejemplo describe cómo implementar la aplicación de WordPress mediante pods de vSphere en el entorno de vSphere with Tanzu.

La implementación de WordPress incluye contenedores para el front-end de WordPress y el back-end de MySQL, así como servicios para ambos. También se requieren objetos secretos.

En este tutorial, se utiliza un objeto deployment. En el entorno de producción, debe utilizar StatefulSets para los contenedores de WordPress y MySQL.

Requisitos previos

Implementar WordPress

Utilice este flujo de trabajo para implementar la aplicación de WordPress mediante pods de vSphere.

Parte 1. Acceder al espacio de nombres

Siga estos pasos para acceder al espacio de nombres.

Procedimiento

  1. Inicie sesión en el supervisor.
     kubectl vsphere login --server=SVC-IP-ADDRESS --vsphere-username wcp-user@vsphere.local 
  2. Cambie al espacio de nombres de vSphere.
     kubectl config use-context VSPHERE-PODS-NAMESPACE
  3. Compruebe que la directiva de almacenamiento que creó, vwt-storage-policy, esté disponible en el espacio de nombres como una clase de almacenamiento.

Parte 2. Crear PVC de WordPress

Utilice estos comandos para crear PVC de WordPress.

Procedimiento

  1. Cree la PVC de MySQL.
     kubectl apply -f mysql-pvc.yaml
  2. Cree la PVC de WordPress.
     kubectl apply -f wordpress-pvc.yaml
  3. Verifique la PVC.
     kubectl get pvc,pv

Parte 3. Crear secretos

Docker Hub público es el registro de contenedor predeterminado para Kubernetes. Docker Hub ahora limita la extracción de imágenes. Debe tener una cuenta de pago y agregar la clave de cuenta al YAML secreto en el campo data.dockerconfigjson.

Procedimiento

  1. Cree un secreto de registro de Docker Hub.
     kubectl apply -f regcred.yaml
  2. Cree el secreto de contraseña de mysql.
    Se requiere la contraseña de la base de datos MySQL. Dentro del secreto, la contraseña debe estar codificada en base64.
    kubectl apply -f mysql-pass.yaml
  3. Verifique los secretos.
    kubectl get secrets

Parte 4. Crear servicios

Siga estos pasos para crear servicios.

Procedimiento

  1. Cree el servicio MySQL.
    kubectl apply -f mysql-service.yaml
  2. Cree el servicio WordPress.
    kubectl apply -f wordpress-service.yaml
  3. Verifique los servicios.
    kubectl get services

Parte 5. Crear implementaciones de pods

Utilice esta tarea para crear implementaciones de pods.

En este tutorial se utilizan objetos de implementación. En el entorno de producción debe utilizar StatefulSets para los contenedores de WordPress y MySQL.

Procedimiento

  1. Cree la implementación de MySQL.
    kubectl apply -f mysql-deployment-vsphere-pod.yaml
    Nota: Cuando se crea una instancia de pod de vSphere, el sistema crea una máquina virtual para los contenedores del pod. De forma predeterminada, la máquina virtual tiene un límite de 512 MB de RAM. El contenedor MySQL requiere más memoria. La especificación de implementación del pod mysql-deployment-vsphere-pod.yaml incluye una sección que aumenta la memoria que se otorga a la máquina virtual de pod de vSphere. Si no incluye esta sección, se produce un error en la implementación del pod con una excepción de memoria agotada (OOM). No es necesario aumentar la RAM al implementar un pod MySQL en un clúster de TKG.
  2. Cree la implementación de WordPress.
    kubectl apply -f wordpress-deployment.yaml
  3. Verifique su implementación.
    kubectl get deployments	

Parte 6. Probar WordPress

Siga estos pasos para probar la implementación de WordPress.

Procedimiento

  1. Compruebe que todos los objetos se crearon y se están ejecutando.
    kubectl get pv,pvc,secrets,rolebinding,services,deployments,pods
  2. Obtenga la dirección IP externa del servicio WordPress.
    kubectl get service wordpress
    
    NAME        TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)        AGE
    wordpress   LoadBalancer   10.96.9.180   10.197.154.73   80:30941/TCP   87s
  3. Desplácese hasta la dirección IP externa.
  4. Configure la instancia de WordPress.
    Nombre de usuario: administrador
    Contraseña: utilice la contraseña segura proporcionada

Ejemplo de archivos YAML para la implementación de WordPress

Utilice estos archivos YAML de ejemplo cuando implemente la aplicación de WordPress con pods de vSphere.

mysql-pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc
  labels:
    app: wordpress
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: vwt-storage-policy
  resources:
    requests:
      storage: 20Gi

namepress-pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: wordpress-pvc
  labels:
    app: wordpress
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: vwt-storage-policy  
  resources:
    requests:
      storage: 20Gi

regcred.yaml

apiVersion: v1
kind: Secret
metadata:
  name: regcred
data:
  .dockerconfigjson: ewoJImF1dGhzIjog....zZG1KcE5WUmtXRUozWpc
type: kubernetes.io/dockerconfigjson

mysql-pass.yaml

apiVersion: v1
data:
  password: YWRtaW4=  #admin base64 encoded
kind: Secret
metadata:
  name: mysql-pass

mysql-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress
spec:
  ports:
    - port: 3306
  selector:
    app: wordpress
    tier: mysql
  clusterIP: None

namepress-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: wordpress
  labels:
    app: wordpress
spec:
  ports:
    - port: 80
  selector:
    app: wordpress
    tier: frontend
  type: LoadBalancer

mysql-deployment-vsphere-pod.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress
spec:
  replicas: 1
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: wordpress
      tier: mysql
  template:
    metadata:
      labels:
        app: wordpress
        tier: mysql
    spec:
      containers:
      - image: mysql:5.6
        name: mysql
        #increased resource limits required for this pod vm
        #default pod VM RAM is 512MB; MySQL container needs more 
        #without extra RAM OOM error prevents deployment
        #extra RAM not required for Kuberentes cluster
        resources:
          limits:
            memory: 1024Mi
            cpu: 1
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              key: password
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pvc
      imagePullSecrets:
      - name: regcred  

namepress-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress
  labels:
    app: wordpress
spec:
  selector:
    matchLabels:
      app: wordpress
      tier: frontend
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress
        tier: frontend
    spec:
      containers:
      - image: wordpress:4.8-apache
        name: wordpress
        env:
        - name: WORDPRESS_DB_HOST
          value: wordpress-mysql
        - name: WORDPRESS_DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              key: password
        ports:
        - containerPort: 80
          name: wordpress
        volumeMounts:
        - name: wordpress-persistent-storage
          mountPath: /var/www/html
      volumes:
      - name: wordpress-persistent-storage
        persistentVolumeClaim:
          claimName: wordpress-pvc
      imagePullSecrets:
      - name: regcred