Kubernetes集群使用網絡存儲NFS

2022-01-25 馬哥Linux運維

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.241Export list for 192.168.31.241:/data/redis 192.168.31.0/24

2.創建Pod資源配置清單 Pod中使用Redis鏡像來運行容器,將Redis數據持久化至NFS伺服器上,下面是簡單實用Redis的一個示例:

cat redis-nfs.yamlapiVersion: v1kind: Podmetadata:  name: vol-nfs-pod  labels:    app: redisspec:  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=redisNAME          READY   STATUS    RESTARTS   AGE    IP            NODE         NOMINATED NODE   READINESS GATESvol-nfs-pod   1/1     Running   0          106s   172.20.3.31   k8s-node03   <none>           <none>

kubectl describe pods/vol-nfs-podName:         vol-nfs-podNamespace:    defaultPriority:     0Node:         k8s-node03/192.168.31.233Start Time:   Tue, 23 Jun 2020 13:47:29 +0800Labels:       app=redisAnnotations:  Status:  RunningIP:           172.20.3.31IPs:  IP:  172.20.3.31Containers:  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      TrueVolumes:  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:    falseQoS Class:       BestEffortNode-Selectors:  <none>Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s                 node.kubernetes.io/unreachable:NoExecute for 300sEvents:  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 dataFilesystem                 Type     Size  Used Avail Use% Mounted on192.168.31.241:/data/redis nfs4      59G  9.4G   47G  17% /data
#查看/data目錄下的數據kubectl exec -it vol-nfs-pod -- ls /datadump.rdb

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

kubectl exec -it vol-nfs-pod -- redis-cli127.0.0.1:6379> set mykey 'hello world'OK127.0.0.1:6379> get mykey"hello world"127.0.0.1:6379> BGSAVEBackground saving started127.0.0.1:6379> exit

6.測試數據持久化 為了測試數據持久化效果,下面刪除Pod資源vol-nfs-pod,然後再對該Pod重建查看數據是否能夠正常訪問

#刪除Podkubectl delete pods vol-nfs-pod
#重建Podkubectl apply -f redis-nfs.yaml
#連接到Redis容器並查看數據持久化效果kubectl exec -it vol-nfs-pod -- redis-cli127.0.0.1:6379> keys *1) "mykey"127.0.0.1:6379> get mykey"hello world"

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

相關焦點

  • Kubernetes ELK 日誌收集
    或者您不想在Kubernetes集群內安裝ES,可以直接參考下面的文章。直接在宿主機上安裝,和在kubernetes效果一樣的。>我這裡使用NFS進行模式後端存儲,當然使用Ceph或者其他存儲也是可以的#創建命名空間kubectl create namespace elk#使用StatefulSet創建ES集群wget down.i4t.com/kubernetes/es/es.yaml
  • kubernetes PV與PVC
    對於真正存儲的用戶不需要關心底層的存儲實現細節,只需要直接使用PVC即可但是通過PVC請求一定的存儲空間也很有可能不足以滿足對於存儲設備的各種需求,而且不同的應用程式對於存儲性能的要求也能也不盡相同,比如讀寫速度、並發性能等,為了解決這一問題,Kubernetes又為我們引入了一個新的資源對象: StorageClass,通過StorageClass
  • Kubernetes 3種存儲傻傻分不清楚!
    容器集群只是做小規模部署,滿足開發測試、集成測試需求。作為分布式存儲服務的一種補充手段,比如我在一臺node主機上插了塊SSD,準備給某個容器吃小灶。目前主流的兩個容器集群存儲解決方案是ceph和glusterfs,二者都是典型的網絡分布式存儲,所有的數據讀、寫都是對磁碟IO和網絡IO的考驗,所以部署存儲集群時至少要使用萬兆的光纖網卡和光纖交換機。
  • SkyForm ECP基於Kubernetes構建AIaaS平臺
    社區中也出現了很多tensorflow on kubernetes的方案,比如最早使用jinja模板的方案(https://github.com/tensorflow/ecosystem/tree/master/kubernetes),以及後來的kubeflow(https://github.com/google/kubeflow)和Tensorflow/k8s(https://github.com
  • Kubernetes 1.14 二進位集群安裝
    Kubernetes 1.14 二進位集群安裝Kubernetes本系列文檔將介紹如何使用二進位部署Kubernetes v1.14集群的所有部署,而不是使用自動化部署(kubeadm)集群。在部署過程中,將詳細列出各個組件啟動參數,以及相關配置說明。在學習完本文檔後,將理解k8s各個組件的交互原理,並且可以快速解決實際問題。
  • 超長乾貨講透你曾經分不清的3種Kubernetes存儲
    emptyDir、hostPath都是Kubernetes很早就實現和支持了的技術,local volume方式則是從k8s v1.7才剛剛發布的alpha版本,目前在k8s v1.10中發布了local volume的beta版本,部分功能在早期版本中並不支持。在展開之前,我們先討論一個問題,就是既然都已經實現容器雲平臺了,我們為什麼還要關注這幾款本地存儲卷的貨呢?
  • Kubernetes 1.17特性:存儲卷從 In-Tree向CSI的遷移已到達Beta
    通過CSI遷移,可以使用相應的CSI驅動程序替換現有的in-tree存儲插件,例如kubernetes.io/gce-pd或kubernetes.io/aws-ebs。如果CSI遷移正常,Kubernetes最終用戶應該不會注意到這一點。遷移後,Kubernetes用戶可以繼續使用現有接口依賴in-tree存儲插件的所有功能。
  • Kubernetes 的網絡、存儲和運行時該如何處理?
    來自印度的工程師 Sridhar Gaddam 和 Aswin Suryanarayanan 將帶來的是在多集群下的網絡連接解決方法:1.CloudAgnostic:適用於本地和公共雲。2.CNI Agnostic:適用於任何 kubernetes CNI 網絡插件。3.隧道管理和狀態檢查:包括連接兩個或多個集群並定期執行狀態檢查的機制。
  • 使用ssl_exporter監控K8S集群證書
    使用kubeadm搭建的集群默認證書有效期是1年,續費證書其實是一件很快的事情。但是就怕出事了才發現,畢竟作為專業搬磚工程師,每天都很忙的。鑑於此,監控集群證書有效期是一件不得不做的事情。下面就來監聽集群證書的有效期。
  • 手把手教你部署一個最小化的 Kubernetes 集群
    部署準備工作部署最小化 K8S 集群:master + node1 + node2Ubuntu 是一款基於 Debian Linux 的以桌面應用為主的作業系統,內容涵蓋文字處理、電子郵件、軟體開發工具和 Web 服務等,可供用戶免費下載、使用和分享。
  • kubernetes面試題匯總
    kubernetes面試題匯總1.kubernetes是什麼?Kubernetes(k8s)是自動化容器操作的開源平臺,這些操作包括部署,調度和節點集群間擴展。如果你曾經用過Docker容器技術部署容器,那麼可以將Docker看成Kubernetes內部使用的低級別組件。
  • 一文帶你理解雲原生,全網超全Kubernetes教程!
    果然就在兩個月之後,剛子就因為不懂容器編排技術,無法維護kubernetes集群而失去了一個升職加薪的機會。 技術考核的時候,考核官問剛子:flannnel構建容器跨主機間的通信原理、多容器統一為整體向外提供服務的模型、集群內部服務高可用方案的構建、集群內部數據的持久化存儲、集群如何引進外界流量且進行負載均衡?
  • Kubernetes系列(九) 集群安全
    -kubelet-client-certificate` 和 `--kubelet-client-key`保證運行時安全網絡過濾 -- 容器防火牆技術通過容器防火牆保護容器網絡的不同方法基於IP位址和埠,進行3/4層過濾  在update和scale時動態更新Kubernetes網絡策略,可為未經授權的連接提供保護Web
  • 乾貨│Kubernetes Storage Management @eBay
    我從2015年底開始接觸kubernetes,當時kubernetes比較適合無狀態的(stateless)應用,這些應用幾乎沒有什麼存儲的需求,但是隨著大數據應用在網際網路的普及,業界有越來越多的呼聲,想把大數據的應用,類似kafka、nosql database容器化,然後用kubernetes來管理,eBay內部這裡需求也很強,所以我們做了一些kubernetes存儲方面的研究和開發工作
  • 使用Kubernetes最常犯的10個錯誤
    對於這種需求,你可以使用Prometheus,DataDog以及很多其他工具。這些工具僅僅是從metrics-server獲取指標並且存儲它們,然後你可以查詢並且以圖表方式查看。VerticalPodAutoscaler[2]可以幫助你自動完成這個手動過程--及時查看CPU、內存使用情況並且基於這些指標設置新的requests和limits。有效的利用你的電腦不是一件容易的任務。
  • kubernetes認證、授權、準入控制
    ,apiserver是整個就集群訪問控制的唯一入口,我們在k8s集群之上部署應用程式的時候,也可以通過宿主機的NodePort暴露的埠訪問裡面的程序,用戶訪問kubernetes集群需要經歷如下認證過程:認證->授權->準入控制(adminationcontroller)1.認證(Authenticating)是對客戶端的認證
  • Kubernetes 1.17 特性:Kubernetes卷快照移至Beta版
    Kubernetes卷插件系統已經提供了強大的抽象功能,可以自動配置,附加和安裝塊和文件存儲。所有這些特性都是為了支持Kubernetes的工作負載可移植性目標:Kubernetes旨在在分布式系統應用程式和基礎集群之間創建一個抽象層,以便應用程式可以與它們所運行的集群的具體情況隔離,並且應用程式部署不需要「特定於集群」的知識。
  • Kubernetes持續部署指南
    接下來,你需要在計算機上安裝一些工具:Git:處理代碼curl:網絡的「瑞士軍刀」kubectl:遠程控制你的集群當然,千萬不要忘了Kubernetes。大部分的雲供應商都以各種形式提供此服務,選擇適合你的需求的即可。最低端的機器配置和集群大小足以運行我們示例的app。我喜歡從3個節點的集群開始,但你可以只用1個節點的集群。
  • Kubernetes集群的監控報警策略最佳實踐
    如果監控系統本身提供網絡數據,就可以使用它來創建基於響應時間的報警策略。以下示例是一個公共REST API端點監控警報,監控prod命令空間中的名為javaapp的deployment,在10分鐘內如果延遲超過1秒則報警。所有這些報警高度依賴於應用程式、工作負載模式等等,但真正的問題是如何在所有服務中一致性地獲取數據。
  • 國內區域阿里雲ECS使用kubeadm安裝kubernetes cluster成功實踐
    作業系統:CentOS-7.8kubernets版本:1.20.4docker版本:20.10.8本篇是一個K8S cluster安裝教程,包含了docker安裝,kubernetes安裝以及kube-flannel網絡插件的安裝,整個安裝過程使用的為國內網絡環境,使用阿里雲的鏡像服務倉庫完成大部分的鏡像安裝,少量部分image阿里雲的鏡像服務倉庫也沒有