MySQL如何使用PV和PVC
本節演示如何為 MySQL 數據庫提供持久化存儲,步驟為:
- 創建 PV 和 PVC。
- 部署 MySQL。
- 向 MySQL 添加數據。
- 模擬節點宕機故障,Kubernetes 將 MySQL 自動遷移到其他節點。
- 驗證數據一致性。
首先創建 PV 和 PVC,配置如下:
mysql-pv.yml
apiVersion: v1 kind: PersistentVolume metadata: name: mysql-pv spec: capacity: storage: 1Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: nfs nfs: path: /nfsdata/mysql-pv server: 172.28.2.210

mysql-pvc.yml
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mysql-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi storageClassName: nfs

創建 mysql-pv 和 mysql-pvc:

接下來部署 MySQL,配置文件如下:
apiVersion: v1 kind: Service metadata: name: mysql spec: ports: - port: 3306 selector: app: mysql --- apiVersion: apps/v1beta1 kind: Deployment metadata: name: mysql spec: selector: matchLabels: app: mysql template: metadata: labels: app: mysql spec: containers: - name: mysql image: mysql:5.6 env: - name: MYSQL_ROOT_PASSWORD value: password ports: - containerPort: 3306 name: mysql volumeMounts: - name: mysql-persistent-storage mountPath: /var/lib/mysql volumes: - name: mysql-persistent-storage persistentVolumeClaim: claimName: mysql-pvc

PVC mysql-pvc Bound 的 PV mysql-pv 將被 mount 到 MySQL 的數據目錄 var/lib/mysql。

MySQL 被部署到 k8s-node2,下面通過客戶端訪問 Service mysql:
kubectl run -it --rm --image=mysql:5.6 --restart=Never mysql-client -- mysql -h mysql -ppassword

更新數據庫:

① 切換到數據庫 mysql。
② 創建數據庫表 my_id。
③ 插入一條數據。
④ 確認數據已經寫入。
關閉 k8s-node2,模擬節點宕機故障。

一段時間后,Kubernetes 將 MySQL 遷移到 k8s-node1。

驗證數據的一致性:

MySQL 服務恢復,數據也完好無損。
小結
本章我們討論了 Kubernetes 如何管理存儲資源。
emptyDir 和 hostPath 類型的 Volume 很方便,但可持久性不強,Kubernetes 支持多種外部存儲系統的 Volume。
PV 和 PVC 分離了管理員和普通用戶的職責,更適合生產環境。
我們還學習了如何通過 StorageClass 實現更高效的動態供給。
最后,我們演示了如何在 MySQL 中使用 PersistentVolume 實現數據持久性。
