1. 程式人生 > 實用技巧 >Kubernetes叢集使用網路儲存NFS

Kubernetes叢集使用網路儲存NFS

NFS儲存

NFS即網路檔案系統Network File System,它是一種分散式檔案系統協議,最初是由Sun MicroSystems公司開發的類Unix作業系統之上的一款經典網路儲存方案,其功能是在允許客戶端主機可以像訪問本地儲存一樣通過網路訪問服務端檔案。

Kubernetes的NFS儲存用於將某事先存在的NFS伺服器匯出export的儲存空間掛載到Pod中來供Pod容器使用。與emptyDir不同的是,NFS儲存在Pod物件終止後僅是被解除安裝而非刪除。另外,NFS是檔案系統及共享服務,它支援同時存在多路掛載請求。定義NFS儲存時,常用到以下欄位。

  • server:NFS伺服器的IP地址或者主機名,必選欄位。
  • path:NFS伺服器匯出(共享)的檔案系統路徑,必選欄位。
  • readOnly:是否以只讀掛載,預設為false。

1.部署一個NFS服務
在叢集之外的節點192.168.31.241

#ubuntu部署
sudo apt install nfs-kernel-server

#centos部署
yum -y install rpcbind nfs-utils
#建立要共享的目錄
mkdir /data/redis -p

#編輯NFS配置並加入以下內容
vim /etc/exports
/data/redis 192.168.31.0/24(rw,sync,no_all_squash,no_subtree_check)

#載入配置
exportfs -rv
  • /data/redis:NFS服務要共享的目錄
  • 192.168.31.0/24:允許訪問NFS伺服器的網段,也可以寫 * ,表示所有地址都可以訪問NFS服務
  • rw:訪問到此目錄的伺服器都具備讀寫許可權
  • sync:資料同步寫入記憶體和硬碟
  • no_all_squash:所有使用者對根目錄具備完全管理訪問許可權
  • no_subtree_check:不檢查父目錄的許可權

啟動NFS服務

#ubuntu啟動
systemctl start nfs-kernel-server

#centos啟動
systemctl start rpcbind nfs

服務檢查

#檢視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.建立Pod資源配置清單
Pod中使用Redis映象來執行容器,將Redis資料持久化至NFS伺服器上,下面是簡單實用Redis的一個示例:

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網路儲存卷
      server: 192.168.31.241    #NFS伺服器地址
      path: /data/redis         #NFS伺服器共享的目錄
      readOnly: false           #是否為只讀

上面的示例定義在資源配置檔案vol-nfs.yaml中,其中的Pod資源擁有一個關聯至NFS伺服器192.168.31.241的儲存卷,Redis容器將其掛載到容器中的/data目錄上,它是運行於容器中的redis-server資料的持久保持位置。

提示:
這裡應確保事先要存在一個名為192.168.31.241的NFS伺服器,其輸出了/data/redis目錄,並授權給Kubernetes叢集中的節點訪問。主機和目錄都可以按需進行調整。

3.建立Pod物件並檢視配置資訊

kubectl apply -f redis-nfs.yaml

如下vol-nfs-pod被排程到了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目錄下的資料
kubectl exec -it vol-nfs-pod -- ls /data
dump.rdb

5.資源建立完成後,可通過其命令客戶端redis-cli建立測試資料,並手動觸發其同步於儲存系統中

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.測試資料持久化
為了測試資料持久化效果,下面刪除Pod資源vol-nfs-pod,然後再對該Pod重建檢視資料是否能夠正常訪問

#刪除Pod
kubectl delete pods vol-nfs-pod

#重建Pod
kubectl apply -f redis-nfs.yaml

#連線到Redis容器並檢視資料持久化效果
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"

如上所示可以看到,此前建立的mykey及其資料在Pod資源重建後依然存在。

有段時間沒跟大家分享資源福利了,看了下自己的資料夾,整理了一些我認為比較好的Python學習資料了。相信這套資料可以對你進階高階工程師有幫助

學習工具

大廠實戰手冊

自學視訊(部分)

【資料免費領取方式】:點這裡:2020Python高薪實戰學習大合集