此範例教學課程介紹了如何在 vSphere with Tanzu 環境中使用 vSphere 網繭部署 WordPress 應用程式。

WordPress 部署包括用於 WordPress 前端和 MySQL 後端的容器以及同時用於這兩者的服務。此外,還需要密碼物件。

本教學課程使用部署物件。在生產環境中,通常針對 WordPress 和 MySQL 容器使用 StatefulSet。

必要條件

部署 WordPress

使用此工作流程可使用 vSphere 網繭 來部署 WordPress 應用程式。

第 1 部分.存取命名空間

使用以下步驟存取命名空間。

程序

  1. 登入主管。
     kubectl vsphere login --server=SVC-IP-ADDRESS --vsphere-username wcp-user@vsphere.local 
  2. 切換到 vSphere 命名空間。
     kubectl config use-context VSPHERE-PODS-NAMESPACE
  3. 確認您建立的儲存區原則 (vwt-storage-policy) 在此命名空間中可用作儲存區類別。

第 2 部分.建立 WordPress PVC

使用以下命令建立 WordPress PVC。

程序

  1. 建立 MySQL PVC。
     kubectl apply -f mysql-pvc.yaml
  2. 建立 WordPress PVC。
     kubectl apply -f wordpress-pvc.yaml
  3. 驗證 PVC。
     kubectl get pvc,pv

第 3 部分.建立秘密金鑰

公有 Docker Hub 是 Kubernetes 的預設容器登錄。Docker Hub 現在會限制映像提取。您需要擁有一個付費帳戶,並將帳戶金鑰新增到秘密金鑰 YAML 中的 data.dockerconfigjson 欄位。

程序

  1. 建立 Docker Hub 登錄秘密金鑰。
     kubectl apply -f regcred.yaml
  2. 建立 mysql 密碼秘密金鑰。
    MySQL 資料庫密碼是必填項。在秘密金鑰中,密碼需要以 base64 格式編碼。
    kubectl apply -f mysql-pass.yaml
  3. 驗證秘密金鑰。
    kubectl get secrets

第 4 部分.建立服務

按照以下步驟建立服務。

程序

  1. 建立 MySQL 服務。
    kubectl apply -f mysql-service.yaml
  2. 建立 WordPress 服務。
    kubectl apply -f wordpress-service.yaml
  3. 驗證服務。
    kubectl get services

第 5 部分.建立網繭部署

使用此工作可建立網繭部署。

本教學課程使用部署物件。在生產環境中,應將 StatefulSet 同時用於 WordPress 和 MySQL 容器。

程序

  1. 建立 MySQL 部署。
    kubectl apply -f mysql-deployment-vsphere-pod.yaml
    備註: 建立 vSphere 網繭 時,系統會為網繭中的容器建立一個虛擬機器。依預設,虛擬機器具有 512 MB RAM 的限制。MySQL 容器需要更多記憶體。網繭部署規格 mysql-deployment-vsphere-pod.yaml 包括一個區段,透過此區段可增加為 vSphere 網繭 虛擬機器提供的記憶體。如果不包括此區段,網繭部署將失敗,並顯示記憶體不足 (OOM) 例外狀況。將 MySQL 網繭部署到 TKG 叢集時,不需要增加 RAM。
  2. 建立 WordPress 部署。
    kubectl apply -f wordpress-deployment.yaml
  3. 驗證部署。
    kubectl get deployments	

第 6 部分.測試 WordPress

按照以下步驟測試 WordPress 部署。

程序

  1. 驗證所有物件是否均已建立且正在執行。
    kubectl get pv,pvc,secrets,rolebinding,services,deployments,pods
  2. 從 WordPress 服務取得 EXTERNAL-IP 位址。
    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. 瀏覽到 EXTERNAL-IP 位址。
  4. 設定 WordPress 執行個體。
    使用者名稱:administrator
    密碼:使用提供的強式密碼

WordPress 部署的範例 YAML 檔案

使用 vSphere 網繭 部署 WordPress 應用程式時,請使用以下範例 YAML 檔案。

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