PV和PVC實現Pod自動遷移、MySQL數據持久化

MySQL基於PV和PVC實現數據持久化

演示如何爲 MySQL 數據庫提供持久化存儲,步驟爲:mysql

  1. 建立 PV 和 PVC。
  2. 部署 MySQL。
  3. 向 MySQL 添加數據。
  4. 模擬節點宕機故障,Kubernetes 將 MySQL 自動遷移到其餘節點。
  5. 驗證數據一致性。

第一步:控制節點部署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 服務恢復,數據也完整無缺。

相關文章
相關標籤/搜索