範例:使用持久化磁碟區部署 WordPress 和 MySQL
本教學課程示範如何使用 Minikube 部署 WordPress 網站和 MySQL 資料庫。這兩個應用程式都使用 PersistentVolumes 和 PersistentVolumeClaims 來儲存資料。
PersistentVolume (PV) 是叢集中的一塊儲存空間,由管理員手動佈建,或由 Kubernetes 使用 StorageClass 動態佈建。PersistentVolumeClaim (PVC) 是使用者對儲存空間的請求,可以由 PV 滿足。PersistentVolumes 和 PersistentVolumeClaims 獨立於 Pod 生命周期,並在重新啟動、重新排程,甚至刪除 Pod 時保留資料。
警告
此部署不適用於生產使用案例,因為它使用單一實例 WordPress 和 MySQL Pod。請考慮使用 WordPress Helm Chart 在生產環境中部署 WordPress。注意
本教學課程中提供的檔案使用 GA 部署 API,並且特定於 Kubernetes 1.9 及更新版本。如果您希望將本教學課程用於 Kubernetes 的早期版本,請適當地更新 API 版本,或參考本教學課程的早期版本。目標
- 建立 PersistentVolumeClaims 和 PersistentVolumes
- 使用以下項目建立
kustomization.yaml
- 密鑰產生器
- MySQL 資源組態
- WordPress 資源組態
- 透過
kubectl apply -k ./
套用 kustomization 目錄 - 清理
開始之前
您需要有一個 Kubernetes 叢集,並且必須設定 kubectl 命令列工具以與您的叢集通訊。建議在至少有兩個節點且未充當控制平面主機的叢集上執行本教學課程。如果您還沒有叢集,可以使用 minikube 建立一個叢集,或者您可以使用以下 Kubernetes playground 之一
若要檢查版本,請輸入kubectl version
。本頁面顯示的範例適用於 kubectl
1.27 及更高版本。
下載以下組態檔
建立 PersistentVolumeClaims 和 PersistentVolumes
MySQL 和 Wordpress 各自需要一個 PersistentVolume 來儲存資料。它們的 PersistentVolumeClaims 將在部署步驟中建立。
許多叢集環境預設已安裝 StorageClass。當 PersistentVolumeClaim 中未指定 StorageClass 時,將會改為使用叢集的預設 StorageClass。
當建立 PersistentVolumeClaim 時,系統會根據 StorageClass 的組態動態佈建 PersistentVolume。
警告
在本機叢集中,預設的 StorageClass 使用hostPath
佈建器。hostPath
磁碟區僅適用於開發和測試。使用 hostPath
磁碟區時,您的資料會儲存在 Pod 排程節點上的 `/tmp` 中,且不會在節點之間移動。如果 Pod 停止運作並排程到叢集中的另一個節點,或者節點重新啟動,則資料將會遺失。注意
如果您要啟動需要使用hostPath
佈建器的叢集,則必須在 controller-manager
元件中設定 --enable-hostpath-provisioner
旗標。注意
如果您的 Kubernetes 叢集在 Google Kubernetes Engine 上執行,請依照本指南操作。建立 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
下載 MySQL deployment 組態檔。
curl -LO https://k8s.io/examples/application/wordpress/mysql-deployment.yaml
下載 WordPress 組態檔。
curl -LO https://k8s.io/examples/application/wordpress/wordpress-deployment.yaml
將它們新增到
kustomization.yaml
檔案中。cat <<EOF >>./kustomization.yaml resources: - mysql-deployment.yaml - wordpress-deployment.yaml EOF
套用並驗證
kustomization.yaml
包含用於部署 WordPress 網站和 MySQL 資料庫的所有資源。您可以使用以下指令套用目錄:
kubectl apply -k ./
現在您可以驗證所有物件都存在。
執行以下指令以驗證 Secret 是否存在
kubectl get secrets
回應應如下所示
NAME TYPE DATA AGE mysql-pass-c57bb4t7mf Opaque 1 9s
驗證是否已動態佈建 PersistentVolume。
kubectl get pvc
注意
PV 的佈建和繫結可能需要幾分鐘的時間。回應應如下所示
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
執行以下指令以驗證 Pod 是否正在執行
kubectl get pods
注意
Pod 的狀態變為RUNNING
可能需要幾分鐘的時間。回應應如下所示
NAME READY STATUS RESTARTS AGE wordpress-mysql-1894417608-x5dzt 1/1 Running 0 40s
執行以下指令以驗證 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
注意
Minikube 只能透過NodePort
公開 Service。EXTERNAL-IP 始終處於擱置狀態。執行以下指令以取得 WordPress Service 的 IP 位址
minikube service wordpress --url
回應應如下所示
http://1.2.3.4:32406
複製 IP 位址,並在瀏覽器中載入頁面以檢視您的網站。
您應該會看到類似以下螢幕截圖的 WordPress 設定頁面。
警告
請勿將 WordPress 安裝停留在這個頁面。如果其他使用者找到它,他們可以在您的執行個體上設定網站,並使用它來提供惡意內容。
您可以選擇安裝 WordPress 並建立使用者名稱和密碼,或刪除您的執行個體。
清理
執行以下指令以刪除您的 Secret、Deployments、Services 和 PersistentVolumeClaims
kubectl delete -k ./
接下來
- 深入瞭解內省與除錯
- 深入瞭解Jobs
- 深入瞭解Port Forwarding
- 學習如何進入容器的 Shell