zoukankan      html  css  js  c++  java
  • K8s之MySQL实现数据持久化

    这个是一个只写配置及验证的博文:

    实现过程:

      1. 搭建nfs存储

      2. 创建PV

      3. 确认PVC

      4. 确认PV与PVC的状态

      5. 创建pod+svc (service)

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

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

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

      9. clinet端访问MySQL数据库

    k8s集群环境如下:

      master: 192.168.33.157

      node:       192.68.33.244

    1、搭建nfs存储

    master节点搭建nfs存储,node节点安装nfs服务

    [root@master ~]# yum -y install nfs-utils rpcbind
    [root@master ~]# systemctl start rpcbind && systemctl enable rpcbind && systemctl status 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 && systemctl enable nfs-server && systemctl status 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

      

  • 相关阅读:
    C#开源框架
    8 种 NoSQL 数据库系统对比
    安装补丁“此更新不适用于你的计算机”解决办法
    .net开源资料
    winform程序退出
    jquery.chained与jquery.chained.remote使用以及区别
    存储过程使用回滚
    C# Panel中绘图如何出现滚动条
    C#结构体的特点浅析
    如何用堆栈和循环结构代替递归调用--递归转换为非递归的10条军规
  • 原文地址:https://www.cnblogs.com/fengyuanfei/p/14665411.html
Copyright © 2011-2022 走看看