这里使用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容器进行登录,查看数据是否存在

评论




正在载入...
PoweredHexo
HostedAliyun
DNSAliyun
ThemeVolantis
UV
PV
BY-NC-SA 4.0