示例:使用持久卷部署 WordPress 和 MySQL
本教程演示如何使用 Minikube 部署 WordPress 站點和 MySQL 資料庫。這兩個應用程式都使用 PersistentVolume 和 PersistentVolumeClaim 來儲存資料。
PersistentVolume (PV) 是叢集中由管理員手動或 Kubernetes 使用 StorageClass 動態提供的儲存。 PersistentVolumeClaim (PVC) 是使用者對儲存的請求,可以由 PV 來滿足。PersistentVolume 和 PersistentVolumeClaim 獨立於 Pod 生命週期,並透過 Pod 的重啟、重新排程甚至刪除來保留資料。
警告
此部署不適用於生產環境,因為它使用單例項的 WordPress 和 MySQL Pod。建議使用 WordPress Helm Chart 在生產環境中部署 WordPress。注意
本教程中提供的檔案使用的是 GA 部署 API,並且專用於 Kubernetes 1.9 及更高版本。如果你希望在更早版本的 Kubernetes 中使用本教程,請相應地更新 API 版本,或者參考本教程的早期版本。目標
- 建立 PersistentVolumeClaim 和 PersistentVolume
- 使用以下內容建立
kustomization.yaml
:- 一個 Secret 生成器
- MySQL 資源配置
- WordPress 資源配置
- 透過
kubectl apply -k ./
應用 kustomization 目錄 - 清理
準備工作
你需要擁有一個 Kubernetes 叢集,並且 kubectl 命令列工具已配置為與你的叢集通訊。建議在至少有兩個不作為控制平面主機的節點的叢集上執行本教程。如果你還沒有叢集,可以使用 minikube 建立一個,或者使用這些 Kubernetes 遊樂場之一:
要檢查版本,請輸入 kubectl version
。
本頁所示示例適用於 kubectl
1.27 及更高版本。
下載以下配置檔案
建立 PersistentVolumeClaim 和 PersistentVolume
MySQL 和 WordPress 各自需要一個 PersistentVolume 來儲存資料。它們的 PersistentVolumeClaim 將在部署步驟中建立。
許多叢集環境都安裝了預設的 StorageClass。當 PersistentVolumeClaim 中未指定 StorageClass 時,將使用叢集的預設 StorageClass。
建立 PersistentVolumeClaim 時,會根據 StorageClass 配置動態提供 PersistentVolume。
警告
在本地叢集中,預設的 StorageClass 使用hostPath
供應器。hostPath
卷僅適用於開發和測試。使用 hostPath
卷時,你的資料位於 Pod 排程到的節點上的 /tmp
中,並且不會在節點之間移動。如果 Pod 死亡並被排程到叢集中的另一個節點,或者節點重啟,資料將丟失。注意
如果你要啟動一個需要使用hostPath
供應器的叢集,則必須在 controller-manager
元件中設定 --enable-hostpath-provisioner
標誌。注意
如果你在 Google Kubernetes Engine 上執行 Kubernetes 叢集,請按照本指南操作。建立 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
下載 MySQL 部署配置檔案。
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 始終處於 Pending 狀態。執行以下命令獲取 WordPress Service 的 IP 地址
minikube service wordpress --url
響應應如下所示:
http://1.2.3.4:32406
複製 IP 地址,然後在瀏覽器中載入該頁面以檢視你的站點。
你應該會看到類似於以下截圖的 WordPress 設定頁面。
警告
不要將你的 WordPress 安裝留在該頁面上。如果其他使用者發現它,他們可能會在你的例項上設定一個網站並將其用於提供惡意內容。
請透過建立使用者名稱和密碼來安裝 WordPress,或者刪除你的例項。
清理
執行以下命令刪除你的 Secret、Deployment、Service 和 PersistentVolumeClaim:
kubectl delete -k ./
下一步
- 瞭解有關內省和除錯的更多資訊
- 瞭解有關Job的更多資訊
- 瞭解有關埠轉發的更多資訊
- 瞭解如何獲取容器的 Shell