k8s中的Mysql數(shù)據(jù)庫持久化存儲

?

一、配置:

環(huán)境:

CentOS7?

VMware

筆者配置了四臺虛擬機:

K8S-Master節(jié)點: 3GB內(nèi)存? ?2核CPU ? 20GB硬盤空間

K8S-node1節(jié)點:? 2GB內(nèi)存? ?2核CPU ? 30GB硬盤空間

K8S-node2節(jié)點:? 2GB內(nèi)存? ?2核CPU ? 30GB硬盤空間

鏡像倉庫節(jié)點:? ? ? 2GB內(nèi)存? ?2核CPU ? 50GB硬盤空間


二、節(jié)點規(guī)劃:

使用三臺虛擬機搭建K8S集群,使用一臺虛擬機搭建鏡像倉庫。

每臺虛擬機配置兩塊網(wǎng)卡,其中一塊為“NAT模式”,用于拉取鏡像等功能。

另外一塊網(wǎng)卡為“僅主機模式”,用于集群節(jié)點間的通信。歸劃如下:

K8s-master節(jié)點:

僅主機模式:10.10.10.200

NAT模式: ?192.168.200.130

K8S-node1節(jié)點:

僅主機模式:10.10.10.201

NAT模式: ?192.168.200.131

K8S-node2節(jié)點:

僅主機模式:10.10.10.202

NAT模式: ?192.168.200.132

鏡像倉庫節(jié)點:

僅主機模式:10.10.10.101

NAT模式: ?192.168.200.150


三、版本信息

Linux內(nèi)核版本:

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. 在每個節(jié)點安裝nfs服務



在“鏡像倉庫”節(jié)點,執(zhí)行以下命令:

yum install -y nfs-common nfs-utils rpcbind

在k8s集群,執(zhí)行以下命令:

yum install -y nfs-utils rpcbind


2. 在“鏡像倉庫”節(jié)點下,配置nfs服務器

mkdir /nfs_mysql

Chmod?777?/nfs_mysql/

(在測試環(huán)境中,為了不考慮用戶屬性,暫時賦予777權(quán)限,但在生產(chǎn)環(huán)境不推薦這樣做)

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節(jié)點下執(zhí)行:

mount -t nfs 10.10.10.101:/nfs_mysql /test/

echo "hello-world">>/test/1.txt




在鏡像倉庫節(jié)點下查看1.txt是否存在,若存在則掛載成功:


可見nfs服務可以正常使用,接下來刪除test目錄和1.txt


在鏡像倉庫下:

[root@hub nfs_mysql]# rm -f 1.txt

在Master節(jié)點下:

[root@k8s-master ~]# umount /test/

[root@k8s-master ~]# rm -rf /test/


同理,依照以上步驟同時創(chuàng)建:(提供多個mysql副本進行掛載)

nfs_mysql1

nfs_mysql2

完成后需要重啟nfs服務

systemctl restart rpcbind

systemctl restart nfs

最終效果:



4. 將nfs封裝成pv

創(chuàng)建mysql_test文件夾,將yaml文件統(tǒng)一保存在此目錄下

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

?


執(zhí)行命令:

kubectl create -f mysql-pv.yml

kubectl get pv



如圖所示,即為Pv創(chuàng)建成功。


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 ?


執(zhí)行以下命令,部署mysql服務:

kubectl create -f mysql.yml


如圖可知,mysql按StatefulSet依次創(chuàng)建了mysql-0 mysql-1 mysql-2

查看各個Pod部在哪個節(jié)點:



6. 通過創(chuàng)建臨時容器,使用MySQL客戶端發(fā)送測試請求給MySQL master節(jié)點


注意:

主機名為mysql-0.mysql;跨命名空間的話,主機名請使用mysql-0.mysql.[NAMESPACE_NAME].如果沒有指定命名空間,默認為default,即mysql-0.mysql.default。

??

這里筆者打算關(guān)閉node2節(jié)點來模擬node2宕機,來測試是否實現(xiàn)數(shù)據(jù)的持久化存儲,

所以我們向node2上的mysql1寫入數(shù)據(jù)。

?

執(zhí)行以下命令,訪問mysql1:

kubectl run mysql-client --image=mysql:5.6 -it --rm --restart=Never -- mysql -h mysql-1.mysql.default -p?password





創(chuàng)建數(shù)據(jù)庫demo,并向messages表中寫入hello-world

CREATE DATABASE demo;?

CREATE TABLE demo.messages (message VARCHAR(250));?

INSERT INTO demo.messages VALUES ('hello-world');

如圖所示



接下來我們來關(guān)閉k8s-node2虛擬機,模擬宕機




查看nodes的運行狀態(tài),可知node2的狀態(tài)已轉(zhuǎn)變?yōu)镹otReady



一段時間后,k8s將Pod MySql -1遷移到節(jié)點k8s-node1



由于時間過長,筆者把三個Pod都刪除重啟后,驗證數(shù)據(jù):



MySQL服務恢復,數(shù)據(jù)完好無損!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容