範例:使用持久化磁碟區部署 WordPress 和 MySQL

本教學課程示範如何使用 Minikube 部署 WordPress 網站和 MySQL 資料庫。這兩個應用程式都使用 PersistentVolumes 和 PersistentVolumeClaims 來儲存資料。

PersistentVolume (PV) 是叢集中的一塊儲存空間,由管理員手動佈建,或由 Kubernetes 使用 StorageClass 動態佈建。PersistentVolumeClaim (PVC) 是使用者對儲存空間的請求,可以由 PV 滿足。PersistentVolumes 和 PersistentVolumeClaims 獨立於 Pod 生命周期,並在重新啟動、重新排程,甚至刪除 Pod 時保留資料。

目標

  • 建立 PersistentVolumeClaims 和 PersistentVolumes
  • 使用以下項目建立 kustomization.yaml
    • 密鑰產生器
    • MySQL 資源組態
    • WordPress 資源組態
  • 透過 kubectl apply -k ./ 套用 kustomization 目錄
  • 清理

開始之前

您需要有一個 Kubernetes 叢集,並且必須設定 kubectl 命令列工具以與您的叢集通訊。建議在至少有兩個節點且未充當控制平面主機的叢集上執行本教學課程。如果您還沒有叢集,可以使用 minikube 建立一個叢集,或者您可以使用以下 Kubernetes playground 之一

若要檢查版本,請輸入 kubectl version

本頁面顯示的範例適用於 kubectl 1.27 及更高版本。

下載以下組態檔

  1. mysql-deployment.yaml

  2. wordpress-deployment.yaml

建立 PersistentVolumeClaims 和 PersistentVolumes

MySQL 和 Wordpress 各自需要一個 PersistentVolume 來儲存資料。它們的 PersistentVolumeClaims 將在部署步驟中建立。

許多叢集環境預設已安裝 StorageClass。當 PersistentVolumeClaim 中未指定 StorageClass 時,將會改為使用叢集的預設 StorageClass。

當建立 PersistentVolumeClaim 時,系統會根據 StorageClass 的組態動態佈建 PersistentVolume。

建立 kustomization.yaml

新增 Secret 產生器

Secret 是一種物件,用於儲存敏感資料,例如密碼或金鑰。自 1.14 版起,kubectl 支援使用 kustomization 檔案管理 Kubernetes 物件。您可以在 kustomization.yaml 中透過產生器建立 Secret。

從以下指令在 kustomization.yaml 中新增 Secret 產生器。您需要將 YOUR_PASSWORD 替換為您想使用的密碼。

cat <<EOF >./kustomization.yaml
secretGenerator:
- name: mysql-pass
  literals:
  - password=YOUR_PASSWORD
EOF

為 MySQL 和 WordPress 新增資源組態

以下的 manifest 描述了單一執行個體 MySQL Deployment。MySQL 容器將 PersistentVolume 掛載到 /var/lib/mysql。MYSQL_ROOT_PASSWORD 環境變數從 Secret 設定資料庫密碼。

apiVersion: v1
kind: Service
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress
spec:
  ports:
    - port: 3306
  selector:
    app: wordpress
    tier: mysql
  clusterIP: None
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
  labels:
    app: wordpress
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress
spec:
  selector:
    matchLabels:
      app: wordpress
      tier: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress
        tier: mysql
    spec:
      containers:
      - image: mysql:8.0
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              key: password
        - name: MYSQL_DATABASE
          value: wordpress
        - name: MYSQL_USER
          value: wordpress
        - name: MYSQL_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-pv-claim

以下的 manifest 描述了單一執行個體 WordPress Deployment。WordPress 容器將 PersistentVolume 掛載到 /var/www/html 以存放網站資料檔案。WORDPRESS_DB_HOST 環境變數設定了上述定義的 MySQL Service 名稱,WordPress 將透過 Service 存取資料庫。WORDPRESS_DB_PASSWORD 環境變數從 kustomize 產生的 Secret 設定資料庫密碼。

apiVersion: v1
kind: Service
metadata:
  name: wordpress
  labels:
    app: wordpress
spec:
  ports:
    - port: 80
  selector:
    app: wordpress
    tier: frontend
  type: LoadBalancer
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: wp-pv-claim
  labels:
    app: wordpress
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi
---
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:6.2.1-apache
        name: wordpress
        env:
        - name: WORDPRESS_DB_HOST
          value: wordpress-mysql
        - name: WORDPRESS_DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              key: password
        - name: WORDPRESS_DB_USER
          value: wordpress
        ports:
        - containerPort: 80
          name: wordpress
        volumeMounts:
        - name: wordpress-persistent-storage
          mountPath: /var/www/html
      volumes:
      - name: wordpress-persistent-storage
        persistentVolumeClaim:
          claimName: wp-pv-claim
  1. 下載 MySQL deployment 組態檔。

    curl -LO https://k8s.io/examples/application/wordpress/mysql-deployment.yaml
    
  2. 下載 WordPress 組態檔。

    curl -LO https://k8s.io/examples/application/wordpress/wordpress-deployment.yaml
    
  3. 將它們新增到 kustomization.yaml 檔案中。

    cat <<EOF >>./kustomization.yaml
    resources:
      - mysql-deployment.yaml
      - wordpress-deployment.yaml
    EOF
    

套用並驗證

kustomization.yaml 包含用於部署 WordPress 網站和 MySQL 資料庫的所有資源。您可以使用以下指令套用目錄:

kubectl apply -k ./

現在您可以驗證所有物件都存在。

  1. 執行以下指令以驗證 Secret 是否存在

    kubectl get secrets
    

    回應應如下所示

    NAME                    TYPE                                  DATA   AGE
    mysql-pass-c57bb4t7mf   Opaque                                1      9s
    
  2. 驗證是否已動態佈建 PersistentVolume。

    kubectl get pvc
    

    回應應如下所示

    NAME             STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS       AGE
    mysql-pv-claim   Bound     pvc-8cbd7b2e-4044-11e9-b2bb-42010a800002   20Gi       RWO            standard           77s
    wp-pv-claim      Bound     pvc-8cd0df54-4044-11e9-b2bb-42010a800002   20Gi       RWO            standard           77s
    
  3. 執行以下指令以驗證 Pod 是否正在執行

    kubectl get pods
    

    回應應如下所示

    NAME                               READY     STATUS    RESTARTS   AGE
    wordpress-mysql-1894417608-x5dzt   1/1       Running   0          40s
    
  4. 執行以下指令以驗證 Service 是否正在執行

    kubectl get services wordpress
    

    回應應如下所示

    NAME        TYPE            CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
    wordpress   LoadBalancer    10.0.0.89    <pending>     80:32406/TCP   4m
    
  5. 執行以下指令以取得 WordPress Service 的 IP 位址

    minikube service wordpress --url
    

    回應應如下所示

    http://1.2.3.4:32406
    
  6. 複製 IP 位址,並在瀏覽器中載入頁面以檢視您的網站。

    您應該會看到類似以下螢幕截圖的 WordPress 設定頁面。

    wordpress-init

清理

  1. 執行以下指令以刪除您的 Secret、Deployments、Services 和 PersistentVolumeClaims

    kubectl delete -k ./
    

接下來

上次修改時間:2023 年 8 月 24 日下午 6:38 PST:Use code_sample shortcode instead of code shortcode (e8b136c3b3)