好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

K8s之MySQL实现数据持久化

~ ]# systemctl enable rpcbind [root@master lv]# mkdir -p /nfsdata/ mysql [root@master ~]# vim /etc/ exports /nfsdata * (rw,sync,no_root_squash) [root@master ~]# systemctl start nfs- server [root@master ~]# systemctl enable nfs- server [root@master ~]# showmount - e Export list for master: /nfsdata *

2、创建PV

[root@master lv] #   vim mysql-pv.yaml      #编写pv的yaml文件 
 kind: PersistentVolume
apiVersion: v1
metadata:
  name: mysql - pv
spec:
  accessModes:
     - ReadWriteOnce         #  访问模式定义为只能以读写的方式挂载到单个节点 
   capacity:
    storage: 1Gi
  persistentVolumeReclaimPolicy: Retain
  storageClassName: nfs
  nfs:
    path:  /nfsdata/ mysql
    server:  192.168.20.6 
[root@master lv]  #   kubectl apply -f mysql-pv.yaml  #执行yaml文件 

3、创建PVC

[root@master lv] #   vim mysql-pvc.yaml       #编写pvc的yaml文件 
 kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: mysql - pvc
spec:
  accessModes:
     -  ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: nfs        #  这里指定关联的PV名称 
[root@master lv] #   kubectl apply -f mysql-pvc.yaml       #执行yaml文件 

4、确认pv及pvc的状态

  至此,PV和PVC的状态类应该都是Bound

[root@master lv] #   kubectl get pv      
 NAME       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM               STORAGECLASS   REASON   AGE
mysql -pv   1Gi        RWO            Retain           Bound    default/mysql- pvc   nfs                     5m8s
[root@master lv]  #   kubectl get pvc 
 NAME        STATUS   VOLUME     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
mysql -pvc   Bound    mysql-pv   1Gi        RWO            nfs            60s

5、创建pod+svc (service)

  这个pod是提供的MySQL服务,并将其映射到宿主机,可以做和clinet端通信。

[root@master lv] #   vim mysql-pod.yaml     #编写pod的yaml文件 
  
apiVersion: extensions / v1beta1
kind: Deployment
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
       -  name: mysql
        image: mysql: 5.7 
        env:                          #  以下是设置MySQL数据库的密码 
        -  name: MYSQL_ROOT_PASSWORD
          value:  123 .com
        ports:
         - containerPort: 3306 
        volumeMounts:
         - name: mysql-persistent- storage
          mountPath:  /var/lib/mysql           #  MySQL容器的数据都是存在这个目录的,要对这个目录做数据持久化 
       volumes:
       - name: mysql-persistent- storage
        persistentVolumeClaim:
          claimName: mysql -pvc        #  指定pvc的名称 
 
---           #  以下是创建svc的yaml文件 
 apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  type: NodePort
  ports:
   - port: 3306 
    targetPort:  3306 
    nodePort:  31111 
  selector:
    app: mysql
  selector:
    app: mysql
[root@master lv]  #   kubectl apply -f mysql-pod.yaml     #执行yaml文件 
[root@master lv] #   kubectl get pod        #确定pod运行正常 
 NAME                     READY   STATUS    RESTARTS   AGE
mysql -6d898f8bcb-lhqxb   1/1     Running   0          51s

6、进入MySQL数据库,添加测试数据

[root@master lv] #   kubectl exec -it mysql-6d898f8bcb-lhqxb -- mysql -uroot -p123.com 
mysql>  create database test;
mysql >  use test;
mysql > create table my_id(id int(4 ));
mysql > insert my_id values(9527 );
mysql > select *  from  my_id;             #  确认有数据存在 

7、手动删除节点上的容器,验证数据库内的数据是否还存在

[root@master lv] #   kubectl get pod -o wide          #查看pod运行在哪个节点 
 NAME                     READY   STATUS    RESTARTS   AGE   IP           NODE     NOMINATED NODE   
mysql -6d898f8bcb-cz8gr   1/1     Running   0          10m   10.244.1.3    node01   
  #  我这是运行在node01节点,现在去node01节点手动将其容器删除 
[root@node01 ~] #   docker ps       #查看MySQL容器的ID 
[root@node01 ~] #   docker rm -f 1a524e001732    #将MySQL的容器删除  
#  由于Deployment的保护策略,当删除容器后,它会根据pod的yaml文件生成一个新的容器,但新容器的ID号就变了  
#  回到master节点,登录到数据库,查看数据是否还存在 
[root@master lv] #   kubectl exec -it mysql-6d898f8bcb-cz8gr -- mysql -uroot -p123.com 
mysql> select *  from  test.my_id;            #  数据还在,OK 
+------+
| id   |
+------+
| 1996 |
+------+
1 row  in  set (0.01 sec)

至此,即可整明,当使用PV来做持久化的话,容器的新陈代谢并不会造成丢失数据的。

8、模拟MySQL容器所在的节点宕机,验证数据是否会丢失

[root@master lv] #   kubectl get pod -o wide   #查看容器所在节点,我这里还是在node01  
#  然后我这里将node01关机,然后动态查看pod的状态 
[root@master lv] #   kubectl get pod -o wide -w    #动态查看pod的状态  
#  大概node01关机五分钟左右,可以看到pod就被转移到node02上运行了。 
 NAME                     READY   STATUS    RESTARTS   AGE   IP           NODE     NOMINATED NODE   READINESS GATES
mysql -6d898f8bcb-cz8gr   1/1     Running   0          20m   10.244.1.3   node01   <none>           <none> 
 
mysql -6d898f8bcb-cz8gr   1/1     Running   0          20m   10.244.1.3   node01   <none>           <none> 
mysql -6d898f8bcb-cz8gr   1/1     Terminating   0          25m   10.244.1.3   node01   <none>           <none> 
mysql -6d898f8bcb-gp4t5   0/1     Pending       0          0s    <none>       <none>   <none>           <none> 
mysql -6d898f8bcb-gp4t5   0/1     Pending       0          0s    <none>       node02   <none>           <none> 
mysql -6d898f8bcb-gp4t5   0/1     ContainerCreating   0          0s    <none>       node02   <none>           <none> 
mysql -6d898f8bcb-gp4t5   1/1     Running             0          1s    10.244.2.4   node02   <none>           <none>

9、client端访问MySQL数据库

  因为我们在创建pod的yaml文件中,将其svc的端口映射类型是nodeport,所以,我们是可以通过访问集群内的任意主机的31111端口(yaml文件中自定义的端口)来登陆到数据库。

[root@master lv] #   mysql -uroot -p123.com -h 192.168.33.244 -P 31111 
MySQL [(none)]> select *  from  test.my_id;     #  查看数据 
+------+
| id   |
+------+
| 1996 |
+------+
1 row  in  set (0.01 sec

 

  

K8s之MySQL实现数据持久化

标签:match   persist   default   实现   port   登陆   mina   mode   term   

查看更多关于K8s之MySQL实现数据持久化的详细内容...

  阅读:24次