目录
一、规划
我们接着之前的文档的架构规划进行下面的操作。
IP | 角色 |
---|---|
192.168.1.200 | k8s-master |
192.168.1.201 | k8s-node01 |
192.168.1.202 | k8s-node02 |
192.168.1.203 | k8s-store |
我们演示如何为 MySQL 数据库提供持久化存储,主要分为下面几个步骤:
- 创建 PV 和 PVC。
- 部署 MySQL。
- 向 MySQL 添加数据。
- 模拟节点宕机故障,Kubernetes 将 MySQL 自动迁移到其他节点。
- 验证数据一致性。
二、部署
1、创建 PV 和 PVC
我们 PV 的配置文件mysql-pv.yaml
如下:
apiVersion: v1kind: PersistentVolumemetadata: name: mysql-pvspec: capacity: storage: 1Gi accessModes: - ReadWriteOnce nfs: path: /data/volumes/mysql-pv server: 192.168.1.203
创建 PV。
[root@master ~]# kubectl apply -f mysql-pv.yaml persistentvolume/mysql-pv created[root@master ~]# kubectl get pvNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGEmysql-pv 1Gi RWO Retain Available 7s
PVC 的配置文件mysql-pvc.yaml
内容如下:
apiVersion: v1kind: PersistentVolumeClaimmetadata: name: mysql-pvcspec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi
创建 PVC。
[root@master ~]# kubectl apply -f mysql-pvc.yaml persistentvolumeclaim/mysql-pvc created[root@master ~]# kubectl get pvcNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGEmysql-pvc Bound mysql-pv 1Gi RWO 7s
2、部署 MySQL
MySQL 的配置文件mysql.yaml
如下:
apiVersion: v1kind: Servicemetadata: name: mysqlspec: ports: - port: 3306 selector: app: mysql---apiVersion: extensions/v1beta1kind: Deploymentmetadata: name: mysqlspec: selector: matchLabels: app: mysql template: metadata: labels: app: mysql spec: containers: - name: mysql image: mysql:5.6 env: - name: MYSQL_ROOT_PASSWORD value: password ports: - name: mysql containerPort: 3306 volumeMounts: - name: mysql-persistent-storage mountPath: /var/lib/mysql volumes: - name: mysql-persistent-storage persistentVolumeClaim: claimName: mysql-pvc
PVC mysql-pvc
Bound 的 PV mysql-pv
将被 mount 到 MySQL 的数据目录 /var/lib/mysql
。
[root@master ~]# kubectl apply -f mysql.yaml service/mysql createddeployment.extensions/mysql created[root@master ~]# kubectl get pod -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESmysql-7686899cf9-d4m42 1/1 Running 0 62s 10.244.2.17 node02
3、更新 MySQL 数据
MySQL 被部署到 k8s-node02
,下面通过客户端访问 Service mysql:
[root@master ~]# kubectl run -it --rm --image=mysql:5.6 --restart=Never mysql-client -- mysql -h mysql -ppasswordIf you don't see a command prompt, try pressing enter.mysql>
我们在mysql
库中创建一个表myid
,然后在表里新增几条数据。
mysql> use mysqlReading table information for completion of table and column namesYou can turn off this feature to get a quicker startup with -ADatabase changedmysql> create table myid( id int(4) );Query OK, 0 rows affected (0.04 sec)mysql> insert myid values( 111 );Query OK, 1 row affected (0.00 sec)mysql> select * from myid;+------+| id |+------+| 111 |+------+1 row in set (0.00 sec)
4、故障转移
我们现在把 node02 机器关机,模拟节点宕机故障。
一段时间之后,Kubernetes 将 MySQL 迁移到 k8s-node01
。
[root@master ~]# kubectl get pod -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESmysql-7686899cf9-8z6tc 1/1 Running 0 21s 10.244.1.19 node01mysql-7686899cf9-d4m42 1/1 Terminating 0 23m 10.244.2.17 node02
验证数据的一致性。
[root@master ~]# kubectl run -it --rm --image=mysql:5.6 --restart=Never mysql-client -- mysql -h mysql -ppasswordIf you don't see a command prompt, try pressing enter.mysql> use mysqlReading table information for completion of table and column namesYou can turn off this feature to get a quicker startup with -ADatabase changedmysql> select * from myid;+------+| id |+------+| 111 |+------+1 row in set (0.00 sec)
MySQL 服务恢复,数据也完好无损,我们可以可以在存储节点上面查看一下生成的数据库文件。
[root@datanode03 mysql-pv]# ll总用量 110604-rw-rw---- 1 systemd-bus-proxy ssh_keys 56 12月 14 09:53 auto.cnf-rw-rw---- 1 systemd-bus-proxy ssh_keys 12582912 12月 14 10:15 ibdata1-rw-rw---- 1 systemd-bus-proxy ssh_keys 50331648 12月 14 10:15 ib_logfile0-rw-rw---- 1 systemd-bus-proxy ssh_keys 50331648 12月 14 09:53 ib_logfile1drwx------ 2 systemd-bus-proxy ssh_keys 4096 12月 14 10:05 mysqldrwx------ 2 systemd-bus-proxy ssh_keys 4096 12月 14 09:53 performance_schema