K8s之MySQL實現數據持久化

這個是一個只寫配置及驗證的博文。。。。。。node

博文大綱:
一、搭建nfs存儲
二、建立PV
三、建立PVC
四、確認pv及pvc的狀態
五、建立pod+svc(service)
六、進入MySQL數據庫,添加測試數據
七、手動刪除節點上的容器,驗證數據庫內的數據是否還存在
八、模擬MySQL容器所在的節點宕機,驗證數據是否會丟失
九、client端訪問MySQL數據庫mysql

k8s集羣環境以下:sql

  • master節點IP:192.168.20.6
  • node01節點IP:192.168.20.7
  • node02節點IP:192.168.20.8

k8s集羣的搭建能夠參考博文:K8s(Kubernetes)簡介及安裝部署docker

一、搭建nfs存儲

爲了方便操做,我直接在master上搭建nfs存儲。數據庫

[root@master ~]# yum -y install nfs-utils
[root@master ~]# 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 *

二、建立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文件

三、建立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文件

四、確認pv及pvc的狀態

至此,PV和PVC的狀態類應該都是Bound。vim

[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

五、建立pod+svc(service)

這個pod是提供的MySQL服務,並將其映射到宿主機,能夠作和client端通訊。api

這裏我將pod和svc的yaml文件寫在同一個文件中。app

[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

六、進入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;            #確認有數據存在

七、手動刪除節點上的容器,驗證數據庫內的數據是否還存在

[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來作數據持久化的話,容器的新陳代謝並不會形成丟失數據的。ide

八、模擬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>

九、client端訪問MySQL數據庫

由於咱們在建立pod的yaml文件中,將其svc的端口映射類型是nodeport,因此,咱們是能夠經過訪問羣集內的任意主機的31111端口(yaml文件中自定義的端口)來登陸到數據庫的。以下:測試

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

———————— 本文至此結束,感謝閱讀 ————————

相關文章
相關標籤/搜索