In questo esempio viene descritto come distribuire l'applicazione WordPress utilizzando Pod vSphere nell'ambiente vSphere IaaS control plane.

La distribuzione di WordPress include container per il front-end WordPress e il back-end MySQL e i servizi per entrambi. Sono necessari anche gli oggetti segreti.

Questo tutorial utilizza gli oggetti di distribuzione. Nell'ambiente di produzione si utilizza in genere StatefulSets per entrambi i container WordPress e MySQL.

Prerequisiti

Distribuzione di WordPress

Utilizzare questo workflow per distribuire l'applicazione WordPress utilizzando Pod vSphere.

Parte 1. Accesso al proprio spazio dei nomi

Utilizzare questi passaggi per accedere al proprio spazio dei nomi.

Procedura

  1. Accedere al Supervisore.
     kubectl vsphere login --server=SVC-IP-ADDRESS --vsphere-username [email protected] 
  2. Passare allo spazio dei nomi vSphere.
     kubectl config use-context VSPHERE-PODS-NAMESPACE
  3. Verificare che il criterio di storage creato, vwt-storage-policy, sia disponibile nello spazio dei nomi come classe di storage.

Parte 2. Creazione di PVC WordPress

Utilizzare questi comandi per creare PVC WordPress.

Procedura

  1. Creare la PVC MySQL.
     kubectl apply -f mysql-pvc.yaml
  2. Creare la PVC WordPress.
     kubectl apply -f wordpress-pvc.yaml
  3. Verificare le PVC.
     kubectl get pvc,pv

Parte 3. Creazione dei segreti

Il Docker Hub pubblico è il registro di container predefinito per Kubernetes. Docker Hub ora limita il pull delle immagini. È necessario disporre di un account a pagamento e aggiungere la chiave dell'account al YAML del segreto nel campo data.dockerconfigjson.

Procedura

  1. Creare il segreto del registro Docker Hub.
     kubectl apply -f regcred.yaml
  2. Creare il segreto della password mysql.
    La password del DB MySQL è obbligatoria. All'interno del segreto, la password deve essere codificata in base64.
    kubectl apply -f mysql-pass.yaml
  3. Verificare i segreti.
    kubectl get secrets

Parte 4. Creazione dei servizi

Per creare servizi, attenersi alla seguente procedura.

Procedura

  1. Creare il servizio MySQL.
    kubectl apply -f mysql-service.yaml
  2. Creare il servizio WordPress.
    kubectl apply -f wordpress-service.yaml
  3. Verificare i servizi.
    kubectl get services

Parte 5. Creazione di distribuzioni di pod

Utilizzare questa attività per creare distribuzioni di pod.

Questo tutorial utilizza gli oggetti di distribuzione. Nell'ambiente di produzione è consigliabile utilizzare StatefulSets per entrambi i container WordPress e MySQL.

Procedura

  1. Creare la distribuzione MySQL.
    kubectl apply -f mysql-deployment-vsphere-pod.yaml
    Nota: Quando viene creato un Pod vSphere, il sistema crea una macchina virtuale per i container nel pod. Per impostazione predefinita, la macchina virtuale ha un limite di 512 MB di RAM. Il contenitore MySQL richiede più memoria. La specifica di distribuzione del pod mysql-deployment-vsphere-pod.yaml include una sezione che incrementa la memoria fornita alla macchina virtuale del Pod vSphere. Se non si include questa sezione, la distribuzione del pod non viene completata correttamente e genera un'eccezione di memoria esaurita (OOM, Out di Memory). Quando si distribuisce un pod MySQL in un cluster TKG, non è necessario incrementare la RAM.
  2. Creare la distribuzione WordPress.
    kubectl apply -f wordpress-deployment.yaml
  3. Verificare la propria distribuzione.
    kubectl get deployments	

Parte 6. Test di WordPress

Per testare la distribuzione di WordPress, attenersi alla seguente procedura.

Procedura

  1. Verificare che tutti gli oggetti siano creati e in esecuzione.
    kubectl get pv,pvc,secrets,rolebinding,services,deployments,pods
  2. Ottenere l'indirizzo IP ESTERNO dal servizio 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. Passare all'indirizzo IP ESTERNO.
  4. Configurare l'istanza di WordPress.
    Nome utente: amministratore
    Password: utilizzare la password complessa fornita

Esempi di file YAML per la distribuzione di WordPress

Utilizzare questi file YAML di esempio quando si distribuisce l'applicazione WordPress con Pod 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

wordpress-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

wordpress-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  

wordpress-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