天天看點

k8s mysql 彈性_K8s——MySQL實作資料持久化

1、搭建nfs存儲

[[email protected] ~]# yum -y install nfs-utils

[[email protected] ~]# mkdir /nfsdata/mysql -p

[[email protected] ~]# cat /etc/exports

/nfsdata *(rw,sync,no_root_squash)

[[email protected] ~]# systemctl restart nfs-server

[[email protected] ~]# systemctl enable rpcbind

[[email protected] ~]# systemctl enable nfs-server

[[email protected] ~]# showmount -e

Export list for docker-k8s01:

/nfsdata *

2、建立PV

//編寫pv的yaml檔案

kind: PersistenVolume

apiVersion: v1

metadata:

name: mysql-pv

spec:

accessModes:

- ReadWriteOnce

capacity:

storage: 1Gi

persistentVolumeReclaimPolicy: Retain

storageClassName: nfs

nfs:

path: /nfsdata/mysql

server: 192.168.171.151

//執行yaml檔案

[[email protected] mysql]# kubectl apply -f mysql-pv.yaml

3、建立PVC

//編寫PVC的yaml檔案

kind: PersistentVolumeClaim

apiVersion: v1

metadata:

name: mysql-pvc

spec:

accessModes:

- ReadWriteOnce //通路模式定義為隻能以讀寫的方式挂載到單個節點

resources:

requests:

storage: 1Gi

storageClassName: nfs //這裡指定關聯的PV名稱

[[email protected] mysql]# kubectl apply -f mysql-pvc.yaml

4、确認pv及pvc的狀态

//可以看到pv及pvc的狀态都是Bound

[[email protected] mysql]# kubectl get pv

NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE

mysql-pv 1Gi RWO Retain Bound default/mysql-pvc nfs 6m21s

[[email protected] mysql]# kubectl get pvc

NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE

mysql-pvc Bound mysql-pv 1Gi RWO nfs 2m4s

5、建立pod+svc(service)

這個pod是提供的MySQL服務,并将其映射到主控端,可以做和client端通信

//編寫deployment及service的yaml檔案

---

apiVersion: extensions/v1beta1

kind: Deployment

metadata:

name: mysql

spec:

selector:

matchLabels:

app: mysql

template:

metadata:

labels:

app: mysql

spec:

containers:

- name: mysql

image: mysql:5.7

env: //配置變量,設定mysql的密碼

- name: MYSQL_ROOT_PASSWORD

value: 123.com

ports:

- containerPort: 3306

volumeMounts:

- name: mysql-persistent-storage

mountPath: /var/lib/mysql //MySQL容器的資料都是存在這個目錄的,要對這個目錄做資料持久化

volumes:

- name: mysql-persistent-storage

persistentVolumeClaim:

claimName: mysql-pvc //指定pvc名稱

---

apiVersion: v1

kind: Service

metadata:

name: mysql

spec:

type: NodePort

ports:

- port: 3306

targetPort: 31111

selector:

app: mysql

[[email protected] mysql]# kubectl apply -f mysql-pod.yaml

//确定pod運作正常

[[email protected] mysql]# kubectl get pod -w

NAME READY STATUS RESTARTS AGE

mysql-6d898f8bcb-fc7bb 1/1 Running 0 60s

6、進入MySQL資料庫,添加測試資料

mysql> create database test;

mysql> use test

mysql> create table my_id(id int(11));

mysql> insert my_id values(1234);

mysql> select * from test.my_id; //确定資料添加成功

+------+

| id |

+------+

| 1234 |

+------+

7、手動删除節點上的容器,驗證資料庫内的資料是否還存在

//檢視Pod運作在哪個節點

[[email protected] mysql]# kubectl get pod -o wide

NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES

mysql-6d898f8bcb-fc7bb 1/1 Running 0 7m6s 10.244.1.2 docker-k8s02

[[email protected] ~]# docker ps // 檢視mysql容器的id

//删除mysql容器

[[email protected] ~]# docker rm -f 7ba3f9d9ad35

//由于Deployment的保護政策,當删除容器後,它會根據pod的yaml檔案生成一個新的容器,但新容器的ID号就變了

//回到master節點,登入到資料庫,檢視資料是否還存在

[[email protected] mysql]# kubectl exec -it mysql-6d898f8bcb-fc7bb -- mysql -uroot -p123.com

mysql> select * from test.my_id;

+------+

| id |

+------+

| 1234 |

+------+

1 row in set (0.01 sec)

證明:當使用PV來做資料持久化的話,容器的新陳代謝并不會造成丢失資料的。

8、模拟MySQL容器所在的節點當機,驗證資料是否會丢失

//檢視容器所在節點

[[email protected] mysql]# kubectl get pod -o wide

NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES

mysql-6d898f8bcb-fc7bb 1/1 Running 0 13m 10.244.1.2 docker-k8s02

//将docker-k8s02節點當機,動态檢視Pod的狀态

//大概node01關機五分鐘左右,可以看到pod就被轉移到node02上運作了

[[email protected] ~]# kubectl get pod -w

NAME READY STATUS RESTARTS AGE

mysql-6d898f8bcb-fc7bb 1/1 Running 0 22m

mysql-6d898f8bcb-fc7bb 1/1 Running 0 22m

mysql-6d898f8bcb-fc7bb 1/1 Terminating 0 27m

mysql-6d898f8bcb-2h47v 0/1 Pending 0 0s

mysql-6d898f8bcb-2h47v 0/1 Pending 0 0s

mysql-6d898f8bcb-2h47v 0/1 ContainerCreating 0 0s

mysql-6d898f8bcb-2h47v 1/1 Running 0 33s

9、client端通路MySQL資料庫

因為我們在建立pod的yaml檔案中,将其svc的端口映射類型是nodeport,是以,我們是可以通過通路群集内的任意主機的31111端口(yaml檔案中自定義的端口)來登入到資料庫的。

[[email protected] ~]# mysql -uroot -p123.com -h 192.168.171.151 -P 31111

MySQL [(none)]> select * from test.my_id; #檢視資料

+------+

| id |

+------+

| 1234 |

+------+

1 row in set (0.01 sec)