?
一、配置:
環境:
CentOS7?
VMware
筆者配置了四臺虛擬機:
K8S-Master節點: 3GB內存? ?2核CPU ? 20GB硬盤空間
K8S-node1節點:? 2GB內存? ?2核CPU ? 30GB硬盤空間
K8S-node2節點:? 2GB內存? ?2核CPU ? 30GB硬盤空間
鏡像倉庫節點:? ? ? 2GB內存? ?2核CPU ? 50GB硬盤空間
二、節點規劃:
使用三臺虛擬機搭建K8S集群,使用一臺虛擬機搭建鏡像倉庫。
每臺虛擬機配置兩塊網卡,其中一塊為“NAT模式”,用于拉取鏡像等功能。
另外一塊網卡為“僅主機模式”,用于集群節點間的通信。歸劃如下:
K8s-master節點:
僅主機模式:10.10.10.200
NAT模式: ?192.168.200.130
K8S-node1節點:
僅主機模式:10.10.10.201
NAT模式: ?192.168.200.131
K8S-node2節點:
僅主機模式:10.10.10.202
NAT模式: ?192.168.200.132
鏡像倉庫節點:
僅主機模式:10.10.10.101
NAT模式: ?192.168.200.150
三、版本信息
Linux內核版本:
Linux version 3.10.0-862.el7.x86_64 (builder@kbuilder.dev.centos.org)
(gcc version 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC) )
?#1 SMP Fri Apr 20 16:44:24 UTC 2018
K8s集群版本為1.15.0版本:
四、基于StatefulSet與PV/PVC的MySql持久化存儲實驗
1. 在每個節點安裝nfs服務
在“鏡像倉庫”節點,執行以下命令:
yum install -y nfs-common nfs-utils rpcbind
在k8s集群,執行以下命令:
yum install -y nfs-utils rpcbind
2. 在“鏡像倉庫”節點下,配置nfs服務器
mkdir /nfs_mysql
Chmod?777?/nfs_mysql/
(在測試環境中,為了不考慮用戶屬性,暫時賦予777權限,但在生產環境不推薦這樣做)
Chown?nfsnobody?/nfs_mysql/
echo “/nfs_mysql *(rw,no_root_squash,no_all_squash,sync)”?>> /etc/exports
cat /etc/exports
/nfs_mysql?*(rw,no_root_squash,no_all_squash,sync)
systemctl start rpcbind
systemctl start nfs
3. 測試nfs服務是否可用
mkdir /test
showmount -e 10.10.10.101
可見/nfs_mysql *已暴露于共享目錄,接下來測試掛載是否可用:
在master節點下執行:
mount -t nfs 10.10.10.101:/nfs_mysql /test/
echo "hello-world">>/test/1.txt
在鏡像倉庫節點下查看1.txt是否存在,若存在則掛載成功:
可見nfs服務可以正常使用,接下來刪除test目錄和1.txt
在鏡像倉庫下:
[root@hub nfs_mysql]# rm -f 1.txt
在Master節點下:
[root@k8s-master ~]# umount /test/
[root@k8s-master ~]# rm -rf /test/
同理,依照以上步驟同時創建:(提供多個mysql副本進行掛載)
nfs_mysql1
nfs_mysql2
完成后需要重啟nfs服務
systemctl restart rpcbind
systemctl restart nfs
最終效果:
4. 將nfs封裝成pv
創建mysql_test文件夾,將yaml文件統一保存在此目錄下
mkdir mysql_test
cd mysql_test
vim mysql-pv.yml
mysql-pv.yml配置如下:
apiVersion: v1
kind: PersistentVolume
metadata:
??name: mysql-pv
spec:
??capacity:
????storage: 5Gi
??accessModes:
????- ?ReadWriteOnce
??persistentVolumeReclaimPolicy: Retain
??storageClassName: nfs
??nfs:
????path: /nfs_mysql
????server: 10.10.10.101
---
apiVersion: v1
kind: PersistentVolume
metadata:
??name: mysql-pv1
spec:
??capacity:
????storage: 5Gi
??accessModes:
????- ?ReadWriteOnce
??persistentVolumeReclaimPolicy: Retain
??storageClassName: nfs
??nfs:
????path: /nfs_mysql1
????server: 10.10.10.101
---
apiVersion: v1
kind: PersistentVolume
metadata:
??name: mysql-pv2
spec:
??capacity:
????storage: 5Gi
??accessModes:
????- ?ReadWriteOnce
??persistentVolumeReclaimPolicy: Retain
??storageClassName: nfs
??nfs:
????path: /nfs_mysql2
????server: 10.10.10.101
注意:
在k8s集群15版本中recycle回收策略已被刪除,只能用retain策略或者Delete策略。這里我們使用persistentVolumeReclaimPolicy: Retain
?
執行命令:
kubectl create -f mysql-pv.yml
kubectl get pv
如圖所示,即為Pv創建成功。
5. 部署MySQL,在mysql_test目錄下編寫mysql.yml,配置文件如下
apiVersion: v1
kind: Service
metadata:
??name: mysql
??labels:
????app: mysql
spec:
??ports:
??- port: 3306
????name: mysql
??clusterIP: None
??selector:
????app: mysql
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
??name: mysql
spec:
??selector:
????matchLabels:
??????app: mysql
??serviceName: "mysql"
??replicas: 3
??template:
????metadata:
??????labels:
????????app: mysql
????spec:
??????containers:
??????- name: mysql
????????image: mysql:5.6
????????env:
????????- name: MYSQL_ROOT_PASSWORD
??????????value: password
????????ports:
????????- containerPort: 3306
??????????name: mysql
????????volumeMounts:
????????- name: mysql-persistent-storage
??????????mountPath: /var/lib/mysql
??volumeClaimTemplates:
??- metadata:
??????name: mysql-persistent-storage
????spec:
??????accessModes: ["ReadWriteOnce"]
??????storageClassName: "nfs"
??????resources:
????????requests:
??????????storage: 1Gi ?
執行以下命令,部署mysql服務:
kubectl create -f mysql.yml
如圖可知,mysql按StatefulSet依次創建了mysql-0 mysql-1 mysql-2
查看各個Pod部在哪個節點:
6. 通過創建臨時容器,使用MySQL客戶端發送測試請求給MySQL master節點
注意:
主機名為mysql-0.mysql;跨命名空間的話,主機名請使用mysql-0.mysql.[NAMESPACE_NAME].如果沒有指定命名空間,默認為default,即mysql-0.mysql.default。
??
這里筆者打算關閉node2節點來模擬node2宕機,來測試是否實現數據的持久化存儲,
所以我們向node2上的mysql1寫入數據。
?
執行以下命令,訪問mysql1:
kubectl run mysql-client --image=mysql:5.6 -it --rm --restart=Never -- mysql -h mysql-1.mysql.default -p?password
創建數據庫demo,并向messages表中寫入hello-world
CREATE DATABASE demo;?
CREATE TABLE demo.messages (message VARCHAR(250));?
INSERT INTO demo.messages VALUES ('hello-world');
如圖所示
接下來我們來關閉k8s-node2虛擬機,模擬宕機
查看nodes的運行狀態,可知node2的狀態已轉變為NotReady
一段時間后,k8s將Pod MySql -1遷移到節點k8s-node1
由于時間過長,筆者把三個Pod都刪除重啟后,驗證數據:
MySQL服務恢復,數據完好無損!