加入收藏 | 设为首页 | 会员中心 | 我要投稿 均轻资讯网 (https://www.ijunqing.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

K8s——MySQL实现数据持久化

发布时间:2022-10-29 16:08:59 所属栏目:MySql教程 来源:
导读:  1、搭建nfs存储

  [root@docker-k8s01 ~]# yum -y install nfs-utils
  [root@docker-k8s01 ~]# mkdir /nfsdata/mysql -p
  [root@docker-k8s01 ~]# cat /etc/exports
  /nfsdata *(rw,sync,no_r
  1、搭建nfs存储
 
  [root@docker-k8s01 ~]# yum -y install nfs-utils
  [root@docker-k8s01 ~]# mkdir /nfsdata/mysql -p
  [root@docker-k8s01 ~]# cat /etc/exports
  /nfsdata *(rw,sync,no_root_squash)
  [root@docker-k8s01 ~]# systemctl restart nfs-server
  [root@docker-k8s01 ~]# systemctl enable rpcbind
  [root@docker-k8s01 ~]# systemctl enable nfs-server
  [root@docker-k8s01 ~]# showmount -e
  Export list for docker-k8s01:
  /nfsdata *
  复制
 
  2、创建PV
 
  //编写pv的yaml文件
  kind: PersistenVolume
  apiVersion: v1
  metadata:
    name: mysql-pv
  spec:
    accessModes:
      - ReadWriteOnce
    capacity:
      storage: 1Gi
    persistentVolumeReclaimPolicy: Retain
    storageClassName: nfs
    nfs:
      path: /nfsdata/mysql
      server: 192.168.171.151
  //执行yaml文件
  [root@docker-k8s01 mysql]# kubectl apply -f mysql-pv.yaml
  复制
 
  3、创建PVC
 
  //编写PVC的yaml文件
  kind: PersistentVolumeClaim
  apiVersion:  v1
  metadata:
    name: mysql-pvc
  spec:
    accessModes:
      - ReadWriteOnce             //访问模式定义为只能以读写的方式挂载到单个节点
    resources:
      requests:
        storage: 1Gi
    storageClassName: nfs             //这里指定关联的PV名称
  [root@docker-k8s01 mysql]# kubectl apply -f mysql-pvc.yaml
  复制
 
  4、确认pv及pvc的状态
 
  //可以看到pv及pvc的状态都是Bound
  [root@docker-k8s01 mysql]# kubectl get pv
  NAME       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM               STORAGECLASS   REASON   AGE
  mysql-pv   1Gi        RWO            Retain           Bound    default/mysql-pvc   nfs                     6m21s
  [root@docker-k8s01 mysql]# kubectl get pvc
  NAME        STATUS   VOLUME     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
  mysql-pvc   Bound    mysql-pv   1Gi        RWO            nfs            2m4s
  复制
 
  5、创建pod+svc(service)这个pod是提供的MySQL服务,并将其映射到宿主机,可以做和client端通信
 
  //编写deployment及service的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名称
  ---
  apiVersion: v1
  kind: Service
  metadata:
    name: mysql
  spec:
    type: NodePort
    ports:
    - port: 3306
      targetPort: 31111
    selector:
      app: mysql
  [root@docker-k8s01 mysql]# kubectl apply -f mysql-pod.yaml
  //确定pod运行正常
  [root@docker-k8s01 mysql]# kubectl get pod -w
  NAME                     READY   STATUS    RESTARTS   AGE
  mysql-6d898f8bcb-fc7bb   1/1     Running   0          60s
  复制
 
  6、进入MySQL数据库mysql持久化,添加测试数据
 
  mysql> create database test;
  mysql> use test
  mysql> create table my_id(id int(11));
  mysql> insert my_id values(1234);
  mysql> select * from test.my_id;               //确定数据添加成功
  wdcp 无法连接mysql,请检查mysql是否已启动及用_redhat mysql源码安装mysql_mysql持久化
 
 
  +------+
  | id   |
  +------+
  | 1234 |
  +------+
  复制
 
  7、手动删除节点上的容器,验证数据库内的数据是否还存在
 
  //查看Pod运行在哪个节点
  [root@docker-k8s01 mysql]# kubectl get pod -o wide
  NAME                     READY   STATUS    RESTARTS   AGE    IP           NODE           NOMINATED NODE   READINESS GATES
  mysql-6d898f8bcb-fc7bb   1/1     Running   0          7m6s   10.244.1.2   docker-k8s02              
  [root@docker-k8s02 ~]# docker ps             // 查看mysql容器的id
  //删除mysql容器
  [root@docker-k8s02 ~]# docker rm -f 7ba3f9d9ad35
  //由于Deployment的保护策略,当删除容器后,它会根据pod的yaml文件生成一个新的容器,但新容器的ID号就变了
  //回到master节点,登录到数据库,查看数据是否还存在
  [root@docker-k8s01 mysql]# kubectl exec -it mysql-6d898f8bcb-fc7bb -- mysql -uroot -p123.com
  mysql> select * from test.my_id;
  +------+
  | id   |
  +------+
  | 1234 |
  +------+
  1 row in set (0.01 sec)
  复制
 
  证明:当使用PV来做数据持久化的话,容器的新陈代谢并不会造成丢失数据的。
 
  8、模拟MySQL容器所在的节点宕机,验证数据是否会丢失
 
  //查看容器所在节点
  [root@docker-k8s01 mysql]# kubectl get pod -o wide
  NAME                     READY   STATUS    RESTARTS   AGE   IP           NODE           NOMINATED NODE   READINESS GATES
  mysql-6d898f8bcb-fc7bb   1/1     Running   0          13m   10.244.1.2   docker-k8s02              
  //将docker-k8s02节点宕机,动态查看Pod的状态
  //大概node01关机五分钟左右,可以看到pod就被转移到node02上运行了
  [root@docker-k8s01 ~]# kubectl get pod -w
  NAME                     READY   STATUS    RESTARTS   AGE
  mysql-6d898f8bcb-fc7bb   1/1     Running   0          22m
  mysql-6d898f8bcb-fc7bb   1/1     Running   0          22m
  mysql-6d898f8bcb-fc7bb   1/1     Terminating   0          27m
  mysql-6d898f8bcb-2h47v   0/1     Pending       0          0s
  mysql-6d898f8bcb-2h47v   0/1     Pending       0          0s
  mysql-6d898f8bcb-2h47v   0/1     ContainerCreating   0          0s
  mysql-6d898f8bcb-2h47v   1/1     Running             0          33s
  复制
 
  9、client端访问MySQL数据库因为我们在创建pod的yaml文件中,将其svc的端口映射类型是nodeport,所以,我们是可以通过访问群集内的任意主机的31111端口(yaml文件中自定义的端口)来登录到数据库的。
 
  [root@docker-k8s01 ~]# mysql -uroot -p123.com -h 192.168.171.151 -P 31111
  MySQL [(none)]> select * from test.my_id;    #查看数据
  +------+
  | id   |
  +------+
  | 1234 |
  +------+
  1 row in set (0.01 sec)
  复制
 

(编辑:均轻资讯网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!