MySQL基於PV和PVC實現數據持久化
演示如何爲 MySQL 數據庫提供持久化存儲,步驟爲:mysql
- 建立 PV 和 PVC。
- 部署 MySQL。
- 向 MySQL 添加數據。
- 模擬節點宕機故障,Kubernetes 將 MySQL 自動遷移到其餘節點。
- 驗證數據一致性。
第一步:控制節點部署NFSsql
[root@ken1 ~]# cat /etc/exports
/ken/mysql *(rw,no_root_squash)
注意:這裏必須加入no_root_squash意思是不下降root的權限,不加這個報錯以下:docker
chown: changing ownership of '/var/lib/mysql/': Operation not permitted
no_root_squash 訪問共享目錄時,用戶若是是root權限,對共享目錄也具備root權限數據庫
root_squash 若是訪問共享目錄是root的權限用戶,對共享目錄的權限會被壓縮爲nfsnobody用戶的權api
all_squash 無論你訪問共享目錄的用戶是誰,都必須壓縮爲nfsnobody用戶的權限bash
第二步:首先建立 PV 和 PVC,配置以下:app
pv.ymlide
[root@ken1 ~]# cat pv.yml
apiVersion: v1
kind: PersistentVolume
metadata:
name: mypv
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
nfs:
path: /ken
server: 192.168.64.11
pvc.ymlui
[root@ken1 ~]# cat pvc.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mypvc
spec:
volumeName: mypv
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
第三步:建立pv和pvcspa
[root@ken1 ~]# kubectl apply -f pv.yml
persistentvolume/mypv unchanged
[root@ken1 ~]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
mypv 1Gi RWX Retain Available 8d
[root@ken1 ~]# kubectl apply -f pvc.yml
persistentvolumeclaim/mypvc created
[root@ken1 ~]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
mypvc Bound mypv 1Gi RWX 3s
第四步:接下來部署 MySQL,配置文件以下
[root@ken1 ~]# cat mysql.yml
apiVersion: v1
kind: Service
metadata:
name: mysql-svc
spec:
type: NodePort
selector:
run: mysql
ports:
- port: 80
targetPort: 3306
NodePort: 3306
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: mysql
spec:
template:
metadata:
labels:
run: mysql
spec:
containers:
- name: mysql
image: mysql
imagePullPolicy: IfNotPresent
env:
- name: MYSQL_ROOT_PASSWORD
value: ken
ports:
- name: mysql
containerPort: 3306
volumeMounts:
- name: mysql
mountPath: /var/lib/mysql
volumes:
- name: mysql
persistentVolumeClaim:
claimName: mypvc
第五步:查看pod
[root@ken1 ~]# kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mysql-587dbd4dd6-79tn5 1/1 Running 0 9m20s 10.244.1.60 ken2 <none> <none>
第六步:登入數據庫建立數據庫ken
[root@ken1 ~]# kubectl exec -it mysql-587dbd4dd6-79tn5 bash
root@mysql-587dbd4dd6-79tn5:/# mysql -uroot -pken
mysql> create database ken;
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| ken |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
第七步:關閉運行該pod的ken2節點,模擬故障
poweroff
第八步:一段時間後k8s把pod移動到ken3節點
[root@ken1 ~]# kubectl get po -o wide -w
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mysql-587dbd4dd6-79tn5 1/1 Running 0 14m 10.244.1.60 ken2 <none> <none>
mysql-587dbd4dd6-79tn5 1/1 Terminating 0 18m 10.244.1.60 ken2 <none> <none>
mysql-587dbd4dd6-gxnpq 0/1 Pending 0 0s <none> <none> <none> <none>
mysql-587dbd4dd6-gxnpq 0/1 Pending 0 0s <none> ken3 <none> <none>
mysql-587dbd4dd6-gxnpq 0/1 ContainerCreating 0 0s <none> ken3 <none> <none>
mysql-587dbd4dd6-gxnpq 1/1 Running 0 3s 10.244.2.139 ken3 <none> <none>
第九步:在ken3節點登陸數據庫驗證數據一致性
[root@ken3 ~]# docker exec -it 2aaf1b234ebf bash
root@mysql-587dbd4dd6-gxnpq:/# mysql -uroot -pken
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| ken |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.02 sec)
MySQL 服務恢復,數據也完整無缺。