示例:使用持久卷部署 WordPress 和 MySQL

本教程演示如何使用 Minikube 部署 WordPress 站點和 MySQL 資料庫。這兩個應用程式都使用 PersistentVolume 和 PersistentVolumeClaim 來儲存資料。

PersistentVolume (PV) 是叢集中由管理員手動或 Kubernetes 使用 StorageClass 動態提供的儲存。 PersistentVolumeClaim (PVC) 是使用者對儲存的請求,可以由 PV 來滿足。PersistentVolume 和 PersistentVolumeClaim 獨立於 Pod 生命週期,並透過 Pod 的重啟、重新排程甚至刪除來保留資料。

目標

  • 建立 PersistentVolumeClaim 和 PersistentVolume
  • 使用以下內容建立 kustomization.yaml
    • 一個 Secret 生成器
    • MySQL 資源配置
    • WordPress 資源配置
  • 透過 kubectl apply -k ./ 應用 kustomization 目錄
  • 清理

準備工作

你需要擁有一個 Kubernetes 叢集,並且 kubectl 命令列工具已配置為與你的叢集通訊。建議在至少有兩個不作為控制平面主機的節點的叢集上執行本教程。如果你還沒有叢集,可以使用 minikube 建立一個,或者使用這些 Kubernetes 遊樂場之一:

要檢查版本,請輸入 kubectl version

本頁所示示例適用於 kubectl 1.27 及更高版本。

下載以下配置檔案

  1. mysql-deployment.yaml

  2. wordpress-deployment.yaml

建立 PersistentVolumeClaim 和 PersistentVolume

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

許多叢集環境都安裝了預設的 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 新增資源配置

以下清單描述了一個單例項 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

以下清單描述了一個單例項 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 部署配置檔案。

    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、Deployment、Service 和 PersistentVolumeClaim:

    kubectl delete -k ./
    

下一步

最後修改於 2023 年 8 月 24 日下午 6:38 PST:使用 code_sample 簡碼代替 code 簡碼 (e8b136c3b3)