這個是一個只寫配置及驗證的博文。。。。。。node
博文大綱:
一、搭建nfs存儲
二、建立PV
三、建立PVC
四、確認pv及pvc的狀態
五、建立pod+svc(service)
六、進入MySQL數據庫,添加測試數據
七、手動刪除節點上的容器,驗證數據庫內的數據是否還存在
八、模擬MySQL容器所在的節點宕機,驗證數據是否會丟失
九、client端訪問MySQL數據庫mysqlk8s集羣環境以下:sql
- master節點IP:192.168.20.6
- node01節點IP:192.168.20.7
- node02節點IP:192.168.20.8
k8s集羣的搭建能夠參考博文:K8s(Kubernetes)簡介及安裝部署。docker
爲了方便操做,我直接在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 *
[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文件
[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的狀態類應該都是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是提供的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
[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
[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>
由於咱們在建立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)
———————— 本文至此結束,感謝閱讀 ————————