zoukankan      html  css  js  c++  java
  • Kubernetes 之 MySQL 持久存储和故障转移(十一)

    一、规划

    我们接着之前的文档的架构规划进行下面的操作。

    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 数据库提供持久化存储,主要分为下面几个步骤:

    1. 创建 PV 和 PVC。
    2. 部署 MySQL。
    3. 向 MySQL 添加数据。
    4. 模拟节点宕机故障,Kubernetes 将 MySQL 自动迁移到其他节点。
    5. 验证数据一致性。

    二、部署

    1、创建 PV 和 PVC

    我们 PV 的配置文件mysql-pv.yaml如下:

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: mysql-pv
    spec:
      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 pv
    NAME       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
    mysql-pv   1Gi        RWO            Retain           Available                                   7s
    

    PVC 的配置文件mysql-pvc.yaml内容如下:

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: mysql-pvc
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 1Gi
    

    创建 PVC。

    [root@master ~]# kubectl apply -f mysql-pvc.yaml 
    persistentvolumeclaim/mysql-pvc created
    [root@master ~]# kubectl get pvc
    NAME        STATUS   VOLUME     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    mysql-pvc   Bound    mysql-pv   1Gi        RWO                           7s
    

    2、部署 MySQL

    MySQL 的配置文件mysql.yaml如下:

    apiVersion: v1
    kind: Service
    metadata:
      name: mysql
    spec:
      ports:
      - port: 3306
      selector:
        app: mysql
    ---
    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.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 created
    deployment.extensions/mysql created
    [root@master ~]# kubectl get pod -o wide
    NAME                     READY   STATUS    RESTARTS   AGE   IP            NODE     NOMINATED NODE   READINESS GATES
    mysql-7686899cf9-d4m42   1/1     Running   0          62s   10.244.2.17   node02   <none>           <none>
    

    3、更新 MySQL 数据

    MySQL 被部署到 k8s-node02,下面通过客户端访问 Service mysql:

    [root@master ~]# 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>
    

    我们在mysql库中创建一个表myid,然后在表里新增几条数据。

    mysql> use mysql
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    
    Database changed
    mysql> 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 wide
    NAME                     READY   STATUS        RESTARTS   AGE   IP            NODE     NOMINATED NODE   READINESS GATES
    mysql-7686899cf9-8z6tc   1/1     Running       0          21s   10.244.1.19   node01   <none>           <none>
    mysql-7686899cf9-d4m42   1/1     Terminating   0          23m   10.244.2.17   node02   <none>           <none>
    

    验证数据的一致性。

    [root@master ~]# 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> use mysql
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    
    Database changed
    mysql> 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_logfile1
    drwx------ 2 systemd-bus-proxy ssh_keys     4096 12月 14 10:05 mysql
    drwx------ 2 systemd-bus-proxy ssh_keys     4096 12月 14 09:53 performance_schema
    
  • 相关阅读:
    c#自动更新+安装程序的制作
    VS2013项目受源代码管理向源代码管理注册此项目时出错
    WinDbg配置和使用基础
    InstallShield Limited Edition for Visual Studio 2013 图文教程(教你如何打包.NET程序)
    PowerDesigner 如何生成数据库更新脚本
    用户故事(User Story)
    Troubleshooting Record and Playback issues in Coded UI Test
    Coded UI
    compare two oracle database schemas
    How to: Use Schema Compare to Compare Different Database Definitions
  • 原文地址:https://www.cnblogs.com/wzlinux/p/10159328.html
Copyright © 2011-2022 走看看