環(huán)境準(zhǔn)備
首先你需要一個(gè)k8s環(huán)境,可以參考我寫的文章:https://blog.csdn.net/m0_51510236/article/details/130842122
什么是PV和PVC
我們可以簡(jiǎn)單看一下官網(wǎng)的描述:https://kubernetes.io/zh-cn/docs/concepts/storage/persistent-volumes/#introduction
持久卷(PersistentVolume,PV) 是集群中的一塊存儲(chǔ),可以由管理員事先制備, 或者使用存儲(chǔ)類(Storage Class)來動(dòng)態(tài)制備。 持久卷是集群資源,就像節(jié)點(diǎn)也是集群資源一樣。PV 持久卷和普通的 Volume 一樣, 也是使用卷插件來實(shí)現(xiàn)的,只是它們擁有獨(dú)立于任何使用 PV 的 Pod 的生命周期。 此 API 對(duì)象中記述了存儲(chǔ)的實(shí)現(xiàn)細(xì)節(jié),無(wú)論其背后是 NFS、iSCSI 還是特定于云平臺(tái)的存儲(chǔ)系統(tǒng)。
持久卷申領(lǐng)(PersistentVolumeClaim,PVC) 表達(dá)的是用戶對(duì)存儲(chǔ)的請(qǐng)求。概念上與 Pod 類似。 Pod 會(huì)耗用節(jié)點(diǎn)資源,而 PVC 申領(lǐng)會(huì)耗用 PV 資源。Pod 可以請(qǐng)求特定數(shù)量的資源(CPU 和內(nèi)存);同樣 PVC 申領(lǐng)也可以請(qǐng)求特定的大小和訪問模式 (例如,可以要求 PV 卷能夠以 ReadWriteOnce、ReadOnlyMany 或 ReadWriteMany 模式之一來掛載,參見訪問模式)。
本篇文章就用上面提到的nfs來搭建pv和pvc并部署mysql
環(huán)境準(zhǔn)備
首先我們需要搭建一個(gè)k8s集群,并且準(zhǔn)備一臺(tái)nfs服務(wù)器,為了方便我就使用k8s的主節(jié)點(diǎn)作為nfs服務(wù)器,服務(wù)器列表如下表:
IP地址 | 服務(wù)器用途 |
---|---|
192.168.1.160 | k8s-master,k8s的主節(jié)點(diǎn)和nfs服務(wù)器 |
192.168.1.161 | k8s-node01,k8s的第一個(gè)工作節(jié)點(diǎn) |
192.168.1.162 | k8s-node02,k8s的第二個(gè)工作節(jié)點(diǎn) |
配置nfs
安裝nfs
首先我們需要在三臺(tái)服務(wù)器單中都需要安裝nfs軟件包,使用如下命令進(jìn)行安裝:
yum install -y nfs-utils
如圖三臺(tái)服務(wù)器都需要安裝:
配置nfs服務(wù)端
然后我們需要在nfs的主服務(wù)器暴露一個(gè) /data/nfs/mysql
目錄,我們需要修改 /etc/exports
配置文件,需要將這一行加在里面:
/data/nfs/mysql *(rw,sync,no_root_squash)
可以直接執(zhí)行這行命令,第一行為創(chuàng)建這個(gè)目錄,第二行為修改文件
mkdir -p /data/nfs/mysql
cat >> /etc/exports << EOF
/data/nfs/mysql *(rw,sync,no_root_squash)
EOF
然后我們需要啟動(dòng)nfs服務(wù),只需要在nfs服務(wù)器上執(zhí)行:
systemctl enable --now nfs-server
然后我們執(zhí)行這行命令,看目錄是否暴露:
showmount -e nfs服務(wù)器地址
可以看到目錄暴露成功:
創(chuàng)建命名空間
我們需要?jiǎng)?chuàng)建一個(gè)命名空間,當(dāng)然也可以越過這一步,這里創(chuàng)建命名空間的目的只是為了更接近生產(chǎn)環(huán)境,創(chuàng)建命名空間的yaml文件:
apiVersion: v1
kind: Namespace
metadata:
name: deploy-test
spec: {}
status: {}
上面的yaml文件創(chuàng)建了一個(gè)名為 deploy-test
的命名空間,可以查看創(chuàng)建結(jié)果:
配置pv和pvc
pv的yaml文件
注意按照提示修改內(nèi)容:
apiVersion: v1
kind: PersistentVolume
metadata:
name: deploy-mysql-nfs-pv # pv的名字
namespace: deploy-test # 這里為命名空間的名字
spec:
capacity:
storage: 1Gi # 申請(qǐng)的硬盤大小為1GB,可修改
accessModes:
- ReadWriteMany # 權(quán)限為多節(jié)點(diǎn)讀寫
nfs:
# 注意修改nfs服務(wù)器地址
server: 192.168.1.160
# 注意修改目錄的地址
path: /data/nfs/mysql
storageClassName: "nfs" # 存儲(chǔ)類型選擇nfs
pvc的yaml文件
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: deploy-mysql-nfs-pvc # 為pvc取一個(gè)好聽的名字
namespace: deploy-test # 命名空間名字
spec:
accessModes:
- ReadWriteMany # 權(quán)限為多節(jié)點(diǎn)讀寫
storageClassName: "nfs" # 存儲(chǔ)類型為nfs
resources:
requests:
storage: 1Gi # 申請(qǐng)大小容量為1GB
volumeName: deploy-mysql-nfs-pv # 綁定的pv名字
執(zhí)行后我們可以查看創(chuàng)建的狀態(tài):
部署mysql
創(chuàng)建mysql的root密碼的secret
前面準(zhǔn)備工作都做好了,接下來我們就可以開始部署mysql了,但是之前我們還需要?jiǎng)?chuàng)建一個(gè)secret,執(zhí)行命令獲取yaml文件內(nèi)容:
# 命令說明
kubectl create secret generic mysql-password --from-literal=mysql_root_password=mysql的root密碼 -n 命名空間 --dry-run=client -o=yaml
# 命令示例
kubectl create secret generic mysql-password --from-literal=mysql_root_password=root -n deploy-test --dry-run=client -o=yaml
生成如圖所示:
創(chuàng)建mysql部署的yaml
apiVersion: v1
kind: Service
metadata:
name: deploy-mysql-svc # mysql暴露服務(wù)的名字
namespace: deploy-test # 命名空間
labels:
app: mysql
spec:
ports:
- port: 3306 # 暴露給外部3306端口
name: mysql
targetPort: 3306 # 內(nèi)部目標(biāo)3306端口
nodePort: 30306 # 外部訪問集群nodeport的30306端口
selector:
app: mysql
type: NodePort
sessionAffinity: ClientIP
---
apiVersion: apps/v1
kind: StatefulSet # 創(chuàng)建一個(gè)StatefulSet有狀態(tài)的控制器
metadata:
name: deploy-mysql # 部署的名字
namespace: deploy-test # 命名空間
spec:
selector:
matchLabels:
app: mysql
serviceName: "deploy-mysql-svc" # 注意指定上面的那個(gè)服務(wù)名稱
replicas: 1
template:
metadata:
labels:
app: mysql
spec:
terminationGracePeriodSeconds: 10
containers:
- args: # 新增一些啟動(dòng)參數(shù)
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
- --lower_case_table_names=1
- --default-time_zone=+8:00
name: mysql
# image: docker.io/library/mysql:5.7.43
image: registry.cn-shenzhen.aliyuncs.com/xiaohh-docker/mysql:5.7.43 # 因?yàn)閐ockerhub上鏡像經(jīng)常拉取失敗,所以使用此鏡像
ports:
- containerPort: 3306 # 容器內(nèi)部暴露3306端口
name: mysql
volumeMounts:
- name: mysql-data # 引用pvc掛載的名字
mountPath: /var/lib/mysql # 這個(gè)是容器內(nèi)部存放數(shù)據(jù)的文件夾目錄,需要掛在到pvc當(dāng)中
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom: # mysql的密碼引用上面創(chuàng)建的secret
secretKeyRef:
key: mysql_root_password
name: mysql-password
volumes:
- name: mysql-data # pvc的掛載名稱
persistentVolumeClaim:
claimName: deploy-mysql-nfs-pvc # 指定使用那個(gè)pvc
部署mysql
整體的yaml文件內(nèi)容為:
apiVersion: v1
kind: Namespace
metadata:
name: deploy-test
spec: {}
status: {}
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: deploy-mysql-nfs-pv
namespace: deploy-test
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
nfs:
server: 192.168.1.160
path: /data/nfs/mysql
storageClassName: "nfs"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: deploy-mysql-nfs-pvc
namespace: deploy-test
spec:
accessModes:
- ReadWriteMany
storageClassName: "nfs"
resources:
requests:
storage: 1Gi
volumeName: deploy-mysql-nfs-pv
---
apiVersion: v1
data:
mysql_root_password: cm9vdA==
kind: Secret
metadata:
name: mysql-password
namespace: deploy-test
---
apiVersion: v1
kind: Service
metadata:
name: deploy-mysql-svc
namespace: deploy-test
labels:
app: mysql
spec:
ports:
- port: 3306
name: mysql
targetPort: 3306
nodePort: 30306
selector:
app: mysql
type: NodePort
sessionAffinity: ClientIP
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: deploy-mysql
namespace: deploy-test
spec:
selector:
matchLabels:
app: mysql
serviceName: "deploy-mysql-svc"
replicas: 1
template:
metadata:
labels:
app: mysql
spec:
terminationGracePeriodSeconds: 10
containers:
- args:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
- --lower_case_table_names=1
- --default-time_zone=+8:00
name: mysql
# image: docker.io/library/mysql:5.7.43
image: registry.cn-shenzhen.aliyuncs.com/xiaohh-docker/mysql:5.7.43
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
key: mysql_root_password
name: mysql-password
volumes:
- name: mysql-data
persistentVolumeClaim:
claimName: deploy-mysql-nfs-pvc
執(zhí)行以下命令部署:
kubectl apply -f deploy-mysql.yaml
創(chuàng)建結(jié)果:
執(zhí)行下面這行命令監(jiān)控部署:
watch kubectl get all -o wide -n deploy-test
看到下面這個(gè)代表創(chuàng)建成功:
當(dāng)我們查看nfs當(dāng)中掛在出來的mysql目錄的時(shí)候:
ll /data/nfs/mysql/
文件夾內(nèi)容:
鏈接mysql
外部鏈接
在我們創(chuàng)建mysql的時(shí)候我們就規(guī)定了一個(gè)NodePort端口,如圖:
我們直接使用集群當(dāng)中任意一個(gè)節(jié)點(diǎn)的30306端口即可鏈接這個(gè)數(shù)據(jù)庫(kù):
mysql -uroot -h192.168.1.160 -p -P30306
查看結(jié)果:
內(nèi)部鏈接
在集群里面訪問我們可以通過主機(jī)名,主機(jī)名格式如下:
<pod名稱>.<service名稱>.<命名空間名稱>.svc.cluster.local
執(zhí)行命令查看:
kubectl get all -o wide -n deploy-test
各類名稱如圖所示:
所以我們此次訪問mysql的主機(jī)名如下:
deploy-mysql-0.deploy-mysql-svc.deploy-test.svc.cluster.local
我們此次就不建立其他的pod來驗(yàn)證是否能夠安裝上了,我們直接檢查集群內(nèi)的dns解析是否正常就知道這個(gè)域名是否正常了,使用以下命令查看k8s集群當(dāng)中的dns服務(wù)的地址:
kubectl get svc -o wide -n kube-system | grep dns
查看dns服務(wù)地址:
直接通過 nslookup
嘗試解析查看是否解析到正確的IP地址上:
# 安裝nslookup命令所在的軟件包
yum install -y bind-utils
# 解析域名
nslookup deploy-mysql-0.deploy-mysql-svc.deploy-test.svc.cluster.local 10.96.0.10
發(fā)現(xiàn)域名解析是正常的:文章來源:http://www.zghlxwxcb.cn/news/detail-771061.html
好了,k8s上部署mysql完成了,下課文章來源地址http://www.zghlxwxcb.cn/news/detail-771061.html
到了這里,關(guān)于Kubernetes(K8S)使用PV和PVC做存儲(chǔ)安裝mysql的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!