这里使用nfs为PV&PVC做后端存储
准备NFS
[root@node1 ~]# yum -y install nfs-utils rpcbind
[root@node1 ~]# mkdir /nfsdata/mysql_pv
[root@node1 ~]# vim /etc/exports
/nfsdata *(rw,no_root_squash,sync)
[root@node1 ~]# exportfs -r
[root@node1 ~]# systemctl start rpcbind nfs-server
[root@node1 ~]# systemctl enable rpcbind nfs-server
查看共享是否成功
[root@node2 ~]# showmount -e 192.168.1.11
Export list for 192.168.1.11:
/nfsdata *
创建MySQL使用的PV
编写PV的yml文件
[root@node1 ~]# vim 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: 192.168.1.11
运行该PV
[root@node1 ~]# kubectl apply -f mysql-pv.yml
persistentvolume/mysql-pv created
创建MySQL使用的PVC
编写PVC的yml文件
[root@node1 ~]# vim mysql-pvc.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: nfs
运行PVC
[root@node1 ~]# kubectl apply -f mysql-pvc.yml
persistentvolumeclaim/mysql-pvc created
查看PV和PVC,已经绑定和申请资源成功
[root@node1 ~]# kubectl get pv,pvc
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
persistentvolume/mysql-pv 1Gi RWO Retain Bound default/mysql-pvc nfs 3m35s
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/mysql-pvc Bound mysql-pv 1Gi RWO nfs 37s
部署MySQL的Pod容器
编写容器的yml
[root@node1 ~]# vim mysql.yml
apiVersion: v1 # 将mysql端口可以被Service间访问
kind: Service
metadata:
name: mysql
spec:
ports:
- port: 3306
selector:
app: mysql
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
spec:
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.6
env: # 设置mysql的root密码
- name: MYSQL_ROOT_PASSWORD
value: 123.com
ports:
- containerPort: 3306
name: mysql
volumeMounts: # 将PVC申请到PV的nfs目录挂载到/var/lib/mysql
- name: mysql-persistent-storage # 名字必须与下面的volumes对应
mountPath: /var/lib/mysql
volumes: # 指定使用名为mysql-pvc的PVC
- name: mysql-persistent-storage # 名字必须与上面的volumeMounts对应
persisteneVolumeClaim:
claimName: mysql-pvc # pvc指定的name
运行MySQL的Pod容器
[root@node1 ~]# kubectl apply -f mysql.yml
service/mysql created
deployment.apps/mysql created
查看运行的Pod
[root@node1 ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
mysql-55dc599d95-kfmpt 1/1 Running 0 39s 10.244.2.88 node3
登录MySQL创建数据
MySQL被部署到了node3
通过一个临时的mysql容器作为客户端去远程登录mysql使用
[root@node1 ~]# kubectl run --rm -it --image=mysql:5.6 --restart=Never \
mysql-client -- mysql -h mysql -p123.com
# -h后面的mysql是代表容器的ip,因为在创建mysql是如下设置
# containers:
# - name: mysql
If you don't see a command prompt, try pressing enter.
mysql>
登录之后进行创建数据库及表的操作,使NFS的目录中可以有数据
mysql> create database cyj;
Query OK, 1 row affected (0.01 sec)
mysql> use cyj;
Database changed
mysql> create table test(id int, name char(10));
Query OK, 0 rows affected (0.12 sec)
mysql> insert test values(1,'cyj');
Query OK, 1 row affected (0.00 sec)
mysql> select * from test;
+------+------+
| id | name |
+------+------+
| 1 | cyj |
+------+------+
查看NFS目录数据
[root@node1 ~]# ls /nfsdata/mysql_pv/
auto.cnf cyj ibdata1 ib_logfile0 ib_logfile1 mysql performance_schema
模拟故障验证数据一致性
现在将mysql容器所在节点(node3)关机模拟故障
一段时间后,会将mysql容器迁移到另一个集群节点,因为master不参与部署Pod,所以会被迁移到node2中。
再次使用临时mysql容器进行登录,查看数据是否存在