Kubernetes集群使用網(wǎng)絡(luò)存儲(chǔ)NFS
NFS存儲(chǔ)
NFS即網(wǎng)絡(luò)文件系統(tǒng)Network File System,它是一種分布式文件系統(tǒng)協(xié)議,最初是由Sun MicroSystems公司開發(fā)的類Unix操作系統(tǒng)之上的一款經(jīng)典網(wǎng)絡(luò)存儲(chǔ)方案,其功能是在允許客戶端主機(jī)可以像訪問本地存儲(chǔ)一樣通過網(wǎng)絡(luò)訪問服務(wù)端文件。
Kubernetes的NFS存儲(chǔ)用于將某事先存在的NFS服務(wù)器導(dǎo)出export的存儲(chǔ)空間掛載到Pod中來供Pod容器使用。與emptyDir不同的是,NFS存儲(chǔ)在Pod對(duì)象終止后僅是被卸載而非刪除。另外,NFS是文件系統(tǒng)及共享服務(wù),它支持同時(shí)存在多路掛載請(qǐng)求。定義NFS存儲(chǔ)時(shí),常用到以下字段。
?server:NFS服務(wù)器的IP地址或者主機(jī)名,必選字段。
?path:NFS服務(wù)器導(dǎo)出(共享)的文件系統(tǒng)路徑,必選字段。
?readOnly:是否以只讀掛載,默認(rèn)為false。
1.部署一個(gè)NFS服務(wù) 在集群之外的節(jié)點(diǎn)192.168.31.241
#ubuntu部署
sudo apt install nfs-kernel-server
#centos部署
yum -y install rpcbind nfs-utils
#創(chuàng)建要共享的目錄
mkdir /data/redis -p
#編輯NFS配置并加入以下內(nèi)容
vim /etc/exports
/data/redis 192.168.31.0/24(rw,sync,no_all_squash,no_subtree_check)
#載入配置
exportfs -rv
?/data/redis:NFS服務(wù)要共享的目錄
?192.168.31.0/24:允許訪問NFS服務(wù)器的網(wǎng)段,也可以寫 * ,表示所有地址都可以訪問NFS服務(wù)
?rw:訪問到此目錄的服務(wù)器都具備讀寫權(quán)限
?sync:數(shù)據(jù)同步寫入內(nèi)存和硬盤
?no_all_squash:所有用戶對(duì)根目錄具備完全管理訪問權(quán)限
?no_subtree_check:不檢查父目錄的權(quán)限
啟動(dòng)NFS服務(wù)
#ubuntu啟動(dòng)
systemctl start nfs-kernel-server
#centos啟動(dòng)
systemctl start rpcbind nfs
服務(wù)檢查
#查看NFS配置是否生效
cat /var/lib/nfs/etab
/data/redis 192.168.31.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,secure,root_squash,no_all_squash)
#通過showmount命令查看NFS共享情況
showmount -e 192.168.31.241
Export list for 192.168.31.241:
/data/redis 192.168.31.0/24
2.創(chuàng)建Pod資源配置清單 Pod中使用Redis鏡像來運(yùn)行容器,將Redis數(shù)據(jù)持久化至NFS服務(wù)器上,下面是簡(jiǎn)單實(shí)用Redis的一個(gè)示例:
cat redis-nfs.yaml
apiVersion: v1
kind: Pod
metadata:
name: vol-nfs-pod
labels:
app: redis
spec:
containers:
- name: redis
image: redis:5.0 #鏡像版本
ports:
- containerPort: 6379 #容器端口
name: redisport
volumeMounts:
- mountPath: /data #卷掛載到容器中的目錄
name: redisdata #卷名稱
volumes:
- name: redisdata #卷名稱
nfs: #使用NFS網(wǎng)絡(luò)存儲(chǔ)卷
server: 192.168.31.241 #NFS服務(wù)器地址
path: /data/redis #NFS服務(wù)器共享的目錄
readOnly: false #是否為只讀
上面的示例定義在資源配置文件vol-nfs.yaml中,其中的Pod資源擁有一個(gè)關(guān)聯(lián)至NFS服務(wù)器192.168.31.241的存儲(chǔ)卷,Redis容器將其掛載到容器中的/data目錄上,它是運(yùn)行于容器中的redis-server數(shù)據(jù)的持久保持位置。
提示:這里應(yīng)確保事先要存在一個(gè)名為192.168.31.241的NFS服務(wù)器,其輸出了/data/redis目錄,并授權(quán)給Kubernetes集群中的節(jié)點(diǎn)訪問。主機(jī)和目錄都可以按需進(jìn)行調(diào)整。
3.創(chuàng)建Pod對(duì)象并查看配置信息
kubectl apply -f redis-nfs.yaml
如下vol-nfs-pod被調(diào)度到了k8s-node03上
kubectl get pods -o wide -l app=redis
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
vol-nfs-pod 1/1 Running 0 106s 172.20.3.31 k8s-node03 <none> <none>
kubectl describe pods/vol-nfs-pod
Name: vol-nfs-pod
Namespace: default
Priority: 0
Node: k8s-node03/192.168.31.233
Start Time: Tue, 23 Jun 2020 13:47:29 +0800
Labels: app=redis
Annotations: Status: Running
IP: 172.20.3.31
IPs:
IP: 172.20.3.31
Containers:
redis:
Container ID: docker://dfa1a8202b39460db9e1d9849d6a4d416ab50a33e48fae556d1248a8efb3193b
Image: redis:5.0
Image ID: docker-pullable://redis@sha256:faea2a6e7fbd7e144cdb15e12ff16c24a5b8d9469e25796ec6d3b7a82a817e1b
Port: 6379/TCP
Host Port: 0/TCP
State: Running
Started: Tue, 23 Jun 2020 13:47:30 +0800
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/data from redisdata (rw) #掛載到容器中的路徑
/var/run/secrets/kubernetes.io/serviceaccount from default-token-xxqkj (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
redisdata:
Type: NFS (an NFS mount that lasts the lifetime of a pod) #NFS類型掛載
Server: 192.168.31.241 #Server是192.168.31.241
Path: /data/redis #Server的路徑
ReadOnly: false #不是只讀
default-token-xxqkj:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-xxqkj
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 2m29s default-scheduler Successfully assigned default/vol-nfs-pod to k8s-node03
Normal Pulled 2m28s kubelet, k8s-node03 Container image "redis:5.0" already present on machine
Normal Created 2m28s kubelet, k8s-node03 Created container redis
Normal Started 2m28s kubelet, k8s-node03 Started container redis
4.查看容器掛載情況
kubectl exec -it vol-nfs-pod -- df -hT | grep data
Filesystem Type Size Used Avail Use% Mounted on
192.168.31.241:/data/redis nfs4 59G 9.4G 47G 17% /data
#查看/data目錄下的數(shù)據(jù)
kubectl exec -it vol-nfs-pod -- ls /data
dump.rdb
5.資源創(chuàng)建完成后,可通過其命令客戶端redis-cli創(chuàng)建測(cè)試數(shù)據(jù),并手動(dòng)觸發(fā)其同步于存儲(chǔ)系統(tǒng)中
kubectl exec -it vol-nfs-pod -- redis-cli
127.0.0.1:6379> set mykey 'hello world'
OK
127.0.0.1:6379> get mykey
"hello world"
127.0.0.1:6379> BGSAVE
Background saving started
127.0.0.1:6379> exit
6.測(cè)試數(shù)據(jù)持久化 為了測(cè)試數(shù)據(jù)持久化效果,下面刪除Pod資源vol-nfs-pod,然后再對(duì)該P(yáng)od重建查看數(shù)據(jù)是否能夠正常訪問
#刪除Pod
kubectl delete pods vol-nfs-pod
#重建Pod
kubectl apply -f redis-nfs.yaml
#連接到Redis容器并查看數(shù)據(jù)持久化效果
kubectl exec -it vol-nfs-pod -- redis-cli
127.0.0.1:6379> keys *
1) "mykey"
127.0.0.1:6379> get mykey
"hello world"
如上所示可以看到,此前創(chuàng)建的mykey及其數(shù)據(jù)在Pod資源重建后依然存在。
好啦!今天的分享到這里就結(jié)束了,希望大家持續(xù)管著馬哥教育官網(wǎng),每天都會(huì)有大量?jī)?yōu)質(zhì)內(nèi)容與大家分享!
文章來源于網(wǎng)絡(luò),侵刪!