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 服务恢复,数据也完好无损,

 

 

 

 

 

 

 

 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部