12、PV 动态供给、MySQL 使用 PV 和 PVC
PV 动态供给
前面的例子中,我们提前创建了 PV,然后通过 PVC 申请 PV 并在 Pod 中使用,这种方式叫做静态供给(Static Provision)。
与之对应的是动态供给(Dynamical Provision),即如果没有满足 PVC 条件的 PV,会动态创建 PV。相比静态供给,动态供给有明显的优势:不需要提前创建 PV,减少了管理员的工作量,效率高。
动态供给是通过 StorageClass 实现的,StorageClass 定义了如何创建 PV,下面是两个例子。
StorageClass standard:

StorageClass slow:

这两个 StorageClass 都会动态创建 AWS EBS,不同在于 standard 创建的是 gp2 类型的 EBS,而 slow 创建的是 io1 类型的 EBS。不同类型的 EBS 支持的参数可参考 AWS 官方文档。
StorageClass 支持 Delete 和 Retain 两种 reclaimPolicy,默认是 Delete。
与之前一样,PVC 在申请 PV 时,只需要指定 StorageClass 和容量以及访问模式,比如:与之前一样,PVC 在申请 PV 时,只需要指定 StorageClass 和容量以及访问模式,比如:

除了 AWS EBS,Kubernetes 支持其他多种动态供给 PV 的 Provisioner,完整列表请参考 https://kubernetes.io/docs/concepts/storage/storage-classes/#provisioner
MySQL 使用 PV 和 PVC
本节演示如何为 MySQL 数据库提供持久化存储,步骤为:
1、创建 PV 和 PVC。
2、部署 MySQL。
3、向 MySQL 添加数据。
4、模拟节点宕机故障,Kubernetes 将 MySQL 自动迁移到其他节点。
5、验证数据一致性。
首先创建 PV 和 PVC,配置如下:
mysql-pv.yml
[root@master old]# cd /nfsdata
[root@master nfsdata]# mkdir /mysql-pv #新建一个目录 不然后面会提示mountPath 找不到目录
[root@master old]# vim mysql-pv.yml
apiVersion: v1
kind: PersistentVolume
metadata:name: mysql-pv
spec:capacity:storage: 1GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RetainstorageClassName: nfsnfs:path: /nfsdata/mysql-pvserver: 10.70.36.250
mysql-pvc.yml
[root@master old]# vim mysql-pvc.yml kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: mysql-pvc
spec:accessModes:- ReadWriteOnceresources:requests:storage: 1GistorageClassName: nfs
创建 mysql-pv 和 mysql-pvc:
[root@master old]# kubectl apply -f mysql-pv.yml
persistentvolume/mysql-pv created
[root@master old]# kubectl apply -f mysql-pvc.yml
persistentvolumeclaim/mysql-pvc created
[root@master old]# 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 15sNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/mysql-pvc Bound mysql-pv 1Gi RWO nfs 7s
接下来部署 MySQL,配置文件如下:
[root@master old]# vim mysql.yml apiVersion: v1
kind: Service
metadata:name: mysql
spec:ports:- port: 3306selector:app: mysql---
apiVersion: apps/v1
kind: Deployment
metadata:name: mysql
spec:selector:matchLabels:app: mysqltemplate:metadata:labels:app: mysqlspec:containers:- image: mysql:5.6name: mysqlenv:- name: MYSQL_ROOT_PASSWORDvalue: passwordports:- containerPort: 3306name: mysqlvolumeMounts:- name: mysql-persistent-storagemountPath: /var/log/mysqlvolumes:- name: mysql-persistent-storagepersistentVolumeClaim:claimName: mysql-pvc
PVC mysql-pvc Bound 的 PV mysql-pv 将被 mount 到 MySQL 的数据目录 var/lib/mysql。
service/mysql created
deployment.apps/mysql created
[root@master old]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mysql-5cf5bdc55f-jbwlx 1/1 Running 0 8s 10.244.1.252 node1
MySQL 被部署到 node21,下面通过客户端访问 Service mysql:
Error: unknown flag: --mysql
See 'kubectl run --help' for usage.
[root@master old]# kubectl run -it --rm --image=mysql:5.6 --restart=Never mysql-client -- mysql -h mysql -ppassword
If you don't see a command prompt, try pressing enter.mysql>
更新数据库:
ysql> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -ADatabase changed
mysql> create table my_id( id int(4) );
Query OK, 0 rows affected (0.00 sec)mysql> insert my_id values( 111 );
Query OK, 1 row affected (0.00 sec)mysql> select * from my_id;
+------+
| id |
+------+
| 111 |
+------+
1 row in set (0.00 sec)mysql> exit
Bye
pod "mysql-client" deleted
[root@master old]#
① 切换到数据库 mysql。
② 创建数据库表 my_id。
③ 插入一条数据。
④ 确认数据已经写入。
关闭node1,模拟节点宕机故障。
root@node1 ~]#
[root@node1 ~]# shutdown now
Connection closing...Socket close.Connection closed by foreign host.Disconnected from remote host(10.70.36.251:22) at 15:31:34.
一段时间后,Kubernetes 将 MySQL 迁移到 node2。
[root@master old]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mysql-5cf5bdc55f-jbwlx 1/1 Terminating 0 42m 10.244.1.252 node1
mysql-5cf5bdc55f-l2n6m 1/1 Running 0 62s 10.244.2.16 node2
验证数据的一致性:
mysql>
mysql> use mysql;
Reading table information for completion of table and column name
You can turn off this feature to get a quicker startup with -ADatabase changed
mysql> select * from my_id;
+------+
| id |
+------+
| 111 |
+------+
1 row in set (0.00 sec)
MySQL 服务恢复,数据也完好无损,
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
