WordPress 是最受歡迎的內容管理系統之一,用於在網際網路上部署部落格和網站。它也可以作為 Docker 映像檔,位於 DockerHub 登錄檔中。您可以使用此 Docker 映像檔在 Kubernetes 叢集上建立可靠且具擴充性的網站平台。在 Kubernetes 上部署 WordPress 將有助於您實作 CI/CD 管線,並縮短發布新更新所需的時間。您還可以啟用 WordPress 網站的水平擴充,以因應網站流量的激增。
本指南將向您展示如何部署 WordPress 和 MySQL,並在 Kubernetes 叢集上使用 Persistent Volume。
先決條件
- 對 Kubernetes (k8s) 及其物件有基本的瞭解。請參閱本指南以獲取 Kubernetes 生態系統的詳細概述.
- Kubernetes 叢集已啟動並執行。按照本教學來 在 Ubuntu 20.04 上安裝 Kubernetes 叢集.
驗證 Kubernetes 叢集
在開始之前,建議先驗證 Kubernetes 叢集的狀態。您可以使用 kubectl 指令來驗證 Kubernetes。
|
1 |
kubectl get nodes |
如果一切正常,您應該會得到以下輸出。

為 MySQL 建立 Secret
一個 Secret 是一個允許您儲存敏感資料(如密碼或金鑰)的物件。在本文中,我們將使用 Secret 來儲存 MySQL 密碼。
首先,建立一個 base64 編碼的密碼,使用以下指令。
|
1 |
echo -n 'your_secure_password' | base64 |
您將在以下輸出中得到您的加密密碼。
|
1 |
eW91cl9zZWN1cmVfcGFzc3dvcmQ= |
接下來,建立一個 secret.yaml 檔案用於 MySQL 和 WordPress。
|
1 |
nano secret.yaml |
新增以下設定。
|
1 2 3 4 5 6 7 |
apiVersion: v1 kind: Secret metadata: name: mysql-pass type: Opaque data: password: eW91cl9zZWN1cmVfcGFzc3dvcmQ= |
儲存並關閉檔案。然後,使用以下指令將上述設定套用到 Kubernetes 叢集。
|
1 |
kubectl apply -f secret.yaml |
您將得到以下輸出。
|
1 |
secret/mysql-pass created |
為 MySQL 和 WordPress 建立 PersistentVolume
您還需要建立一個 PersistentVolume 來儲存 MySQL 和 WordPress 的資料。
讓我們建立一個 pvc-mysql-wp.yaml 檔案。
|
1 |
nano pvc-mysql-wp.yaml |
新增以下設定。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mysql-pv-claim labels: app: wordpress spec: accessModes: - ReadWriteOnce resources: requests: storage: 40Gi --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: wp-pv-claim labels: app: wordpress spec: accessModes: - ReadWriteOnce resources: requests: storage: 40Gi |
完成後儲存並關閉檔案。
接下來,使用以下指令在 Kubernetes 叢集上為 MySQL 和 WordPress 建立 PersistentVolume。
|
1 |
kubectl apply -f pvc-mysql-wp.yaml |
您應該會在以下輸出中看到這兩個 PersistentVolume。
|
1 2 |
persistentvolumeclaim/mysql-pv-claim created persistentvolumeclaim/wp-pv-claim created |
您現在可以使用以下指令驗證這兩個 PersistentVolume。
|
1 |
kubectl get pv |
您應該會看到以下輸出。
|
1 2 3 |
名稱 容量 存取模式 回收策略 狀態 宣告 儲存類別 原因 時間 pvc-873a458352594103 40Gi RWO Delete Bound default/wp-pv-claim your-block-storage 3s pvc-de7d7de5e53a40e8 40Gi RWO Delete Bound default/mysql-pv-claim your-block-storage 3s |
建立 MySQL 部署
接下來,建立一個 MySQL 部署設定檔以下載 MySQL Docker 映像檔、建立容器並將 PersistentVolume 掛載於 /var/lib/mysql.
|
1 |
nano mysql-deployment.yaml |
新增以下設定。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
apiVersion: v1 kind: Service metadata: name: wordpress-mysql labels: app: wordpress spec: ports: - port: 3306 selector: app: wordpress tier: mysql clusterIP: None --- 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:5.6 name: mysql 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-pv-claim |
完成後儲存並關閉檔案。然後,將上述設定部署到 Kubernetes 叢集。
|
1 |
kubectl apply -f mysql-deployment.yaml |
您應該會看到以下輸出。

您可以使用以下命令驗證 MySQL 部署。
|
1 |
kubectl get deployments |
您應該會在以下輸出中看到 MySQL 部署的狀態。

建立 WordPress 部署
現在,建立一個 WordPress 部署設定檔案以下載 WordPress 映像檔、建立容器,並將 PersistentVolume 掛載於 /var/www/html 以存放網站資料檔案。此檔案也將建立 WORDPRESS_DB_HOST 和 WORDPRESS_DB_PASSWORD 環境變數以存取資料庫。
|
1 |
nano wordpress-deployment.yaml |
新增以下設定。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
apiVersion: v1 kind: Service metadata: name: wordpress labels: app: wordpress spec: ports: - port: 80 selector: app: wordpress tier: frontend type: LoadBalancer --- apiVersion: apps/v1 # 對於 1.9.0 之前的版本,請使用 apps/v1beta2 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: wp-pv-claim |
完成後儲存檔案。然後,使用以下命令將上述配置套用到 Kubernetes 叢集。
|
1 |
kubectl apply -f wordpress-deployment.yaml |
您應該會在以下輸出中看到部署成功的訊息。
|
1 2 |
service/wordpress created deployment.apps/wordpress created |
若要驗證 WordPress 部署,請執行以下命令。
|
1 |
kubectl get deployments |
您應該會在以下輸出中看到 WordPress 部署的狀態。

存取 WordPress Web UI
若要存取 WordPress 儀表板,您需要 LoadBalancer 的外部 IP 和連接埠號碼。您可以使用以下命令獲取此資訊。
|
1 |
kubectl get svc |
您將在以下輸出中取得 LoadBalancer 的 IP 和連接埠。
|
1 2 3 4 |
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 29m wordpress LoadBalancer 10.100.80.70 78.141.194.181 80:31624/TCP 3m6s wordpress-mysql ClusterIP None <none> 3306/TCP 4m14s |
若要獲取有關 WordPress Pod 的詳細資訊,請執行以下命令。
|
1 |
kubectl describe svc wordpress |
您應該會在以下輸出中獲得 WordPress 的詳細資訊。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Name: wordpress Namespace: default Labels: app=wordpress Annotations: <none> Selector: app=wordpress,tier=frontend Type: LoadBalancer IP Family Policy: SingleStack IP Families: IPv4 IP: 10.100.80.70 IPs: 10.100.80.70 LoadBalancer Ingress: 78.141.194.181 Port: <unset> 80/TCP TargetPort: 80/TCP NodePort: <unset> 31624/TCP Endpoints: 10.244.23.66:80 Session Affinity: None External Traffic Policy: Cluster |
現在,打開您的網頁瀏覽器並使用以下 URL 存取 WordPress 安裝頁面: http://78.141.194.181:3162。您應該會在以下畫面中看到 WordPress 安裝頁面。

選擇您的語言並完成所需的步驟以完成安裝程序。
結論
在這篇文章中,我們說明了如何在 Kubernetes 叢集上部署具有永續磁碟卷的 MySQL 和 WordPress。您還可以根據網站流量來調整 WordPress 部署的規模。現在,您可以根據您的開發需求來使用上述部署。
此外,您可以查看我們部落格上其他專注於 Docker 和 Kubernetes 的教學課程:
留言
目前尚無留言。成為第一個留言的人吧。