K8S之存儲PV-PVC概述與說明,並詳解常用PV-PVC示例
概述
與管理計算實例相比,管理存儲是一個明顯的問題。PersistentVolume子系統為用戶和管理員提供了一個API,該API從如何使用存儲中抽象出如何提供存儲的詳細信息。為此,我們引入了兩個新的API資源:PersistentVolume和PersistentVolumeClaim。
PV概述
PersistentVolume (PV)是集群中由管理員提供或使用存儲類動態提供的一塊存儲。它是集群中的資源,就像節點是集群資源一樣。
PV是與Volumes類似的卷插件,但其生命周期與使用PV的任何單個Pod無關。由此API對象捕獲存儲的實現細節,不管是NFS、iSCSI還是特定於雲提供商的存儲系統。
PVC概述
PersistentVolumeClaim (PVC) 是用戶對存儲的請求。它類似於Pod;Pods消耗節點資源,而PVC消耗PV資源。Pods可以請求特定級別的資源(CPU和內存)。Claim可以請求特定的存儲大小和訪問模式(例如,它們可以掛載一次讀寫或多次只讀)。
雖然PersistentVolumeClaims (PVC) 允許用戶使用抽象的存儲資源,但是用戶通常需要具有不同屬性(比如性能)的PersistentVolumes (PV) 來解決不同的問題。集群管理員需要能夠提供各種不同的PersistentVolumes,這些卷在大小和訪問模式之外還有很多不同之處,也不向用戶公開這些卷是如何實現的細節。對於這些需求,有一個StorageClass資源。
volume 和 claim的生命周期
PV是集群中的資源。PVC是對這些資源的請求,並且還充當對資源的聲明檢查。PV和PVC之間的交互遵循以下生命周期:
供應
有兩種方式配置PV:靜態的或動態的。
集群管理員創建一些PV。它們帶有可供集群用戶使用的實際存儲的詳細信息。存在於Kubernetes API中,可供使用。
當管理員創建的靜態PV沒有一個與用戶的PersistentVolumeClaim匹配時,集群可能會嘗試動態地為PVC提供一個卷。此配置基於StorageClasses:PVC必須請求存儲類,並且管理員必須已經創建並配置了該類,才能進行動態配置。聲明該類為 "",可以有效地禁用其動態配置。
要啟用基於存儲級別的動態存儲配置,集群管理員需要啟用API Server上的DefaultStorageClass[准入控制器]。例如,通過確保DefaultStorageClass位於API Server組件的 --enable-admission-plugins標志,使用逗號分隔的有序值列表中,可以完成此操作。
綁定
用戶創建(或者在動態配置的情況下,已經創建)具有特定存儲請求量(大小)和特定訪問模式的PersistentVolumeClaim。主控制器中的控制循環監視新的PV,找到匹配的PV(如果可能的話),並將它們綁定在一起。如果PV為新的PVC動態配置,那么循環始終將該PV綁定到PVC。否則,用戶始終至少得到他們所要求的,但是存儲量可能會超過所要求的范圍。
一旦綁定,無論是如何綁定的,PersistentVolumeClaim綁定都是互斥的。PVC到PV的綁定是一對一的映射,使用ClaimRef,它是PersistentVolume和PersistentVolumeClaim之間的雙向綁定。
如果不存在匹配的卷,聲明(Claims)將無限期保持未綁定。隨着匹配量的增加,聲明將受到約束。例如,配備有許多50Gi PV的群集將與請求100Gi的PVC不匹配。當將100Gi PV添加到群集時,可以綁定PVC。
注意:靜態時PVC與PV綁定時會根據storageClassName(存儲類名稱)和accessModes(訪問模式)判斷哪些PV符合綁定需求。然后再根據存儲量大小判斷,首先存PV儲量必須大於或等於PVC聲明量;其次就是PV存儲量越接近PVC聲明量,那么優先級就越高(PV量越小優先級越高)。
使用
Pods使用聲明(claims)作為卷。集群檢查聲明以找到綁定卷並為Pod掛載該卷。對於支持多種訪問模式的卷,用戶在其聲明中作為Pod中卷使用時指定所需的模式。
一旦用戶擁有一個聲明並且該聲明被綁定,則綁定的PV就屬於該用戶。用戶通過在Pod的卷塊中包含的persistentVolumeClaim部分來調度Pods並訪問其聲明的PV。
持久化聲明保護
“使用中的存儲對象保護” :該功能的目的是確保在Pod活動時使用的PersistentVolumeClaims (PVC)和綁定到PVC的PersistentVolume (PV)不會從系統中刪除,因為這可能會導致數據丟失。
如果用戶刪除了Pod正在使用的PVC,則不會立即刪除該PVC;PVC的清除被推遲,直到任何Pod不再主動使用PVC。另外,如果管理員刪除綁定到PVC的PV,則不會立即刪除該PV;PV的去除被推遲,直到PV不再與PVC結合。
回收策略
當用戶處理完他們的卷時,他們可以從允許回收資源的API中刪除PVC對象。PersistentVolume的回收策略告訴集群在釋放卷的聲明后該如何處理它。目前,卷可以被保留、回收或刪除。
Retain (保留)
保留回收策略允許手動回收資源。當PersistentVolumeClaim被刪除時,PersistentVolume仍然存在,並且該卷被認為是“釋放”的。但是,由於之前聲明的數據仍然存在,因此另一個聲明尚無法得到。管理員可以手動回收卷。
Delete (刪除)
對於支持Delete回收策略的卷插件,刪除操作會同時從Kubernetes中刪除PersistentVolume對象以及外部基礎架構中的關聯存儲資產,例如AWS EBS,GCE PD,Azure Disk或Cinder卷。動態配置的卷將繼承其StorageClass的回收策略,默認為Delete。管理員應根據用戶的期望配置StorageClass。
Recycle (回收)
如果基礎卷插件支持,Recycle回收策略將rm -rf /thevolume/*對該卷執行基本的擦除並使其可用於新的聲明。
Persistent Volumes類型
PersistentVolume類型作為插件實現。Kubernetes當前支持以下插件:
1 GCEPersistentDisk 2 AWSElasticBlockStore 3 AzureFile 4 AzureDisk 5 CSI 6 FC (Fibre Channel) 7 FlexVolume 8 Flocker 9 NFS 10 iSCSI 11 RBD (Ceph Block Device) 12 CephFS 13 Cinder (OpenStack block storage) 14 Glusterfs 15 VsphereVolume 16 Quobyte Volumes 17 HostPath (僅用於單節點測試——本地存儲不受任何方式的支持,也不能在多節點集群中工作) 18 Portworx Volumes 19 ScaleIO Volumes 20 StorageOS
PV示例與參數說明
PV示例
1 apiVersion: v1 2 kind: PersistentVolume 3 metadata: 4 name: pv0003 5 spec: 6 capacity: 7 storage: 5Gi 8 volumeMode: Filesystem 9 accessModes: 10 - ReadWriteOnce 11 persistentVolumeReclaimPolicy: Recycle 12 storageClassName: slow 13 mountOptions: 14 - hard 15 - nfsvers=4.1 16 nfs: 17 path: /tmp 18 server: 172.17.0.2
Capacity:通常,PV將具有特定的存儲容量設置。當前,存儲大小是可以設置或請求的唯一資源。將來的屬性可能包括IOPS,吞吐量等。
volumeMode:可選參數,為Filesystem或Block。Filesystem是volumeMode省略參數時使用的默認模式。
accessModes:PersistentVolume可以通過資源提供者支持的任何方式安裝在主機上。如下文表中所示,提供商將具有不同的功能,並且每個PV的訪問模式都將設置為該特定卷支持的特定模式。例如,NFS可以支持多個讀/寫客戶端,但是特定的NFS PV可能以只讀方式在服務器上導出。每個PV都有自己的一組訪問模式,用於描述該特定PV的功能。
訪問方式為:
1 ReadWriteOnce-該卷可以被單個節點以讀寫方式掛載 2 ReadOnlyMany-該卷可以被許多節點以只讀方式掛載 3 ReadWriteMany-該卷可以被多個節點以讀寫方式掛載
在CLI命令行中,訪問模式縮寫為:
1 RWO-ReadWriteOnce 2 ROX-ReadOnlyMany 3 RWX-ReadWriteMany
說明:一個卷一次只能使用一種訪問模式掛載,即使它支持多種訪問模式。
storageClassName:PV可以有一個類,通過將storageClassName屬性設置為一個StorageClass的名稱來指定這個類。特定類的PV只能綁定到請求該類的PVC。沒有storageClassName的PV沒有類,只能綁定到不請求特定類的PVC。
persistentVolumeReclaimPolicy:當前的回收政策是:Retain (保留)-手動回收、Recycle (回收)-基本擦除(rm -rf /thevolume/*)、Delete (刪除)-刪除相關的存儲資產 (例如AWS EBS,GCE PD,Azure Disk或OpenStack Cinder卷)。
備注:當前,僅NFS和HostPath支持回收。AWS EBS,GCE PD,Azure Disk和Cinder卷支持刪除。
PV卷狀態
卷將處於以下某種狀態:
- Available:尚未綁定到聲明(claim)的空閑資源
- Bound:卷已被聲明綁定
- Released:聲明已被刪除,但群集尚未回收該資源
- Failed:該卷自動回收失敗
CLI將顯示綁定到PV的PVC的名稱。
PV類型與支持的訪問模式
| Volume Plugin | ReadWriteOnce | ReadOnlyMany | ReadWriteMany |
|---|---|---|---|
| AWSElasticBlockStore | ✓ | - | - |
| AzureFile | ✓ | ✓ | ✓ |
| AzureDisk | ✓ | - | - |
| CephFS | ✓ | ✓ | ✓ |
| Cinder | ✓ | - | - |
| CSI | depends on the driver | depends on the driver | depends on the driver |
| FC | ✓ | ✓ | - |
| FlexVolume | ✓ | ✓ | depends on the driver |
| Flocker | ✓ | - | - |
| GCEPersistentDisk | ✓ | ✓ | - |
| Glusterfs | ✓ | ✓ | ✓ |
| HostPath | ✓ | - | - |
| iSCSI | ✓ | ✓ | - |
| Quobyte | ✓ | ✓ | ✓ |
| NFS | ✓ | ✓ | ✓ |
| RBD | ✓ | ✓ | - |
| VsphereVolume | ✓ | - | - (works when Pods are collocated) |
| PortworxVolume | ✓ | - | ✓ |
| ScaleIO | ✓ | ✓ | - |
| StorageOS | ✓ | - | - |
PV-PVC示例
主機信息
| 服務器名稱(hostname) | 系統版本 | 配置 | 內網IP | 外網IP(模擬) | 部署模塊 |
|---|---|---|---|---|---|
| k8s-master | CentOS7.7 | 2C/4G/20G | 172.16.1.110 | 10.0.0.110 | k8s-master |
| k8s-node01 | CentOS7.7 | 2C/4G/20G | 172.16.1.111 | 10.0.0.111 | k8s-node |
| k8s-node02 | CentOS7.7 | 2C/4G/20G | 172.16.1.112 | 10.0.0.112 | k8s-node |
| k8s-node03 | CentOS7.7 | 2C/2G/20G | 172.16.1.113 | 10.0.0.113 | NFS |
存儲使用NFS,在k8s-node03機器僅部署NFS服務,沒有部署K8S
NFS服務部署
文章參考:「NFS 服務搭建與配置」
所有機器操作
1 # 所需安裝包 2 yum install nfs-utils rpcbind -y
NFS服務端k8s-node03機器操作
1 [root@k8s-node03 ~]# mkdir -p /data/nfs1 /data/nfs2 /data/nfs3 /data/nfs4 /data/nfs5 /data/nfs6 2 [root@k8s-node03 ~]# chown -R nfsnobody.nfsnobody /data/ 3 [root@k8s-node03 ~]# 4 [root@k8s-node03 ~]# ll /data/ 5 total 0 6 drwxr-xr-x 2 nfsnobody nfsnobody 6 Jun 14 16:30 nfs1 7 drwxr-xr-x 2 nfsnobody nfsnobody 6 Jun 14 16:30 nfs2 8 drwxr-xr-x 2 nfsnobody nfsnobody 6 Jun 14 16:30 nfs3 9 drwxr-xr-x 2 nfsnobody nfsnobody 6 Jun 14 16:30 nfs4 10 drwxr-xr-x 2 nfsnobody nfsnobody 6 Jun 14 16:30 nfs5 11 drwxr-xr-x 2 nfsnobody nfsnobody 6 Aug 22 16:25 nfs6 12 [root@k8s-node03 ~]# vim /etc/exports 13 /data/nfs1 172.16.1.0/24(rw,sync,root_squash,all_squash) 14 /data/nfs2 172.16.1.0/24(rw,sync,root_squash,all_squash) 15 /data/nfs3 172.16.1.0/24(rw,sync,root_squash,all_squash) 16 /data/nfs4 172.16.1.0/24(rw,sync,root_squash,all_squash) 17 /data/nfs5 172.16.1.0/24(rw,sync,root_squash,all_squash) 18 /data/nfs6 172.16.1.0/24(rw,sync,root_squash,all_squash) 19 ### 啟動NFS服務 20 [root@k8s-node03 ~]# systemctl start rpcbind.service 21 [root@k8s-node03 ~]# systemctl start nfs.service 22 ### 檢查NFS服務 , 其中 172.16.1.113 為服務端IP 23 [root@k8s-node03 ~]# showmount -e 172.16.1.113 24 Export list for 172.16.1.113: 25 /data/nfs6 172.16.1.0/24 26 /data/nfs5 172.16.1.0/24 27 /data/nfs4 172.16.1.0/24 28 /data/nfs3 172.16.1.0/24 29 /data/nfs2 172.16.1.0/24 30 /data/nfs1 172.16.1.0/24
在k8s-node02機器驗證
1 # 查看rpcbind服務,默認是啟動的,如果沒有啟動則啟動並加入開機自啟動 2 [root@k8s-node02 ~]# systemctl status rpcbind.service 3 # 查看NFS服務信息 4 [root@k8s-node02 ~]# showmount -e 172.16.1.113 5 ……………… 6 # 掛載,並進行讀寫驗證 7 [root@k8s-node02 ~]# mount -t nfs 172.16.1.113:/data/nfs1 /mnt 8 # 驗證完畢,去掉NFS掛載 9 [root@k8s-node02 ~]# umount -lf 172.16.1.113:/data/nfs1
PV部署
yaml文件
1 [root@k8s-master pv-pvc]# pwd 2 /root/k8s_practice/pv-pvc 3 [root@k8s-master pv-pvc]# cat pv.yaml 4 apiVersion: v1 5 kind: PersistentVolume 6 metadata: 7 name: pv-nfs1 8 spec: 9 capacity: 10 storage: 1Gi 11 accessModes: 12 - ReadWriteOnce 13 persistentVolumeReclaimPolicy: Recycle 14 storageClassName: nfs 15 nfs: 16 path: /data/nfs1 17 server: 172.16.1.113 18 --- 19 apiVersion: v1 20 kind: PersistentVolume 21 metadata: 22 name: pv-nfs2 23 spec: 24 capacity: 25 storage: 3Gi 26 accessModes: 27 - ReadWriteOnce 28 persistentVolumeReclaimPolicy: Recycle 29 storageClassName: nfs 30 nfs: 31 path: /data/nfs2 32 server: 172.16.1.113 33 --- 34 apiVersion: v1 35 kind: PersistentVolume 36 metadata: 37 name: pv-nfs3 38 spec: 39 capacity: 40 storage: 5Gi 41 accessModes: 42 - ReadWriteOnce 43 persistentVolumeReclaimPolicy: Recycle 44 storageClassName: slow 45 nfs: 46 path: /data/nfs3 47 server: 172.16.1.113 48 --- 49 apiVersion: v1 50 kind: PersistentVolume 51 metadata: 52 name: pv-nfs4 53 spec: 54 capacity: 55 storage: 10Gi 56 accessModes: 57 - ReadWriteOnce 58 persistentVolumeReclaimPolicy: Recycle 59 storageClassName: nfs 60 nfs: 61 path: /data/nfs4 62 server: 172.16.1.113 63 --- 64 apiVersion: v1 65 kind: PersistentVolume 66 metadata: 67 name: pv-nfs5 68 spec: 69 capacity: 70 storage: 5Gi 71 accessModes: 72 - ReadWriteMany 73 persistentVolumeReclaimPolicy: Recycle 74 storageClassName: nfs 75 nfs: 76 path: /data/nfs5 77 server: 172.16.1.113 78 --- 79 apiVersion: v1 80 kind: PersistentVolume 81 metadata: 82 name: pv-nfs6 83 spec: 84 capacity: 85 storage: 5Gi 86 accessModes: 87 - ReadWriteOnce 88 persistentVolumeReclaimPolicy: Recycle 89 storageClassName: nfs 90 nfs: 91 path: /data/nfs6 92 server: 172.16.1.113
啟動PV,並查看狀態
1 [root@k8s-master pv-pvc]# kubectl apply -f pv.yaml 2 persistentvolume/pv-nfs1 created 3 persistentvolume/pv-nfs2 created 4 persistentvolume/pv-nfs3 created 5 persistentvolume/pv-nfs4 created 6 persistentvolume/pv-nfs5 created 7 persistentvolume/pv-nfs6 created 8 [root@k8s-master pv-pvc]# 9 [root@k8s-master pv-pvc]# kubectl get pv -o wide 10 NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE VOLUMEMODE 11 pv-nfs1 1Gi RWO Recycle Available nfs 11s Filesystem 12 pv-nfs2 3Gi RWO Recycle Available nfs 11s Filesystem 13 pv-nfs3 5Gi RWO Recycle Available slow 11s Filesystem 14 pv-nfs4 10Gi RWO Recycle Available nfs 11s Filesystem 15 pv-nfs5 5Gi RWX Recycle Available nfs 11s Filesystem 16 pv-nfs6 5Gi RWO Recycle Available nfs 11s Filesystem
StatefulSet創建並使用PVC
StatefulSet 需要 headless 服務 來負責 Pod 的網絡標識,因此需要負責創建此服務。
yaml文件
1 [root@k8s-master pv-pvc]# pwd 2 /root/k8s_practice/pv-pvc 3 [root@k8s-master pv-pvc]# cat sts-pod-pvc.yaml 4 apiVersion: v1 5 kind: Service 6 metadata: 7 name: nginx 8 labels: 9 app: nginx 10 spec: 11 ports: 12 - port: 80 13 name: web 14 clusterIP: None 15 selector: 16 app: nginx 17 --- 18 apiVersion: apps/v1 19 kind: StatefulSet 20 metadata: 21 name: web 22 spec: 23 selector: 24 matchLabels: 25 app: nginx # has to match .spec.template.metadata.labels 26 serviceName: "nginx" 27 replicas: 3 # by default is 1 28 template: 29 metadata: 30 labels: 31 app: nginx # has to match .spec.selector.matchLabels 32 spec: 33 terminationGracePeriodSeconds: 100 34 containers: 35 - name: nginx 36 image: registry.cn-beijing.aliyuncs.com/google_registry/nginx:1.17 37 ports: 38 - containerPort: 80 39 name: web 40 volumeMounts: 41 - name: www 42 mountPath: /usr/share/nginx/html 43 volumeClaimTemplates: 44 - metadata: 45 name: www 46 spec: 47 accessModes: [ "ReadWriteOnce" ] 48 storageClassName: "nfs" 49 resources: 50 requests: 51 storage: 3Gi
啟動pod並查看狀態
1 [root@k8s-master pv-pvc]# kubectl apply -f sts-pod-pvc.yaml 2 service/nginx created 3 statefulset.apps/web created 4 [root@k8s-master pv-pvc]# 5 [root@k8s-master pv-pvc]# kubectl get svc -o wide 6 NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR 7 kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 24d <none> 8 nginx ClusterIP None <none> 80/TCP 17s app=nginx 9 [root@k8s-master pv-pvc]# 10 [root@k8s-master pv-pvc]# kubectl get sts -o wide 11 NAME READY AGE CONTAINERS IMAGES 12 web 3/3 82m nginx registry.cn-beijing.aliyuncs.com/google_registry/nginx:1.17 13 [root@k8s-master pv-pvc]# 14 [root@k8s-master pv-pvc]# kubectl get pod -o wide 15 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES 16 web-0 0/1 ContainerCreating 0 3s <none> k8s-node01 <none> <none> 17 [root@k8s-master pv-pvc]# 18 [root@k8s-master pv-pvc]# kubectl get pod -o wide 19 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES 20 web-0 1/1 Running 0 11s 10.244.4.135 k8s-node01 <none> <none> 21 web-1 1/1 Running 0 6s 10.244.2.171 k8s-node02 <none> <none> 22 web-2 0/1 ContainerCreating 0 3s <none> k8s-node01 <none> <none> 23 [root@k8s-master pv-pvc]# 24 [root@k8s-master pv-pvc]# kubectl get pod -o wide 25 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES 26 web-0 1/1 Running 0 8m23s 10.244.2.174 k8s-node02 <none> <none> 27 web-1 1/1 Running 0 8m20s 10.244.4.139 k8s-node01 <none> <none> 28 web-2 1/1 Running 0 8m17s 10.244.2.175 k8s-node02 <none> <none>
PV和PVC狀態信息查看
1 ### 注意掛載順序 2 [root@k8s-master pv-pvc]# kubectl get pv -o wide 3 NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE VOLUMEMODE 4 pv-nfs1 1Gi RWO Recycle Available nfs 116s Filesystem 5 pv-nfs2 3Gi RWO Recycle Bound default/www-web-0 nfs 116s Filesystem 6 pv-nfs3 5Gi RWO Recycle Available slow 116s Filesystem 7 pv-nfs4 10Gi RWO Recycle Bound default/www-web-2 nfs 116s Filesystem 8 pv-nfs5 5Gi RWX Recycle Available nfs 116s Filesystem 9 pv-nfs6 5Gi RWO Recycle Bound default/www-web-1 nfs 116s Filesystem 10 [root@k8s-master pv-pvc]# 11 [root@k8s-master pv-pvc]# kubectl get pvc -o wide 12 NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE VOLUMEMODE 13 www-web-0 Bound pv-nfs2 3Gi RWO nfs 87s Filesystem 14 www-web-1 Bound pv-nfs6 5Gi RWO nfs 84s Filesystem 15 www-web-2 Bound pv-nfs4 10Gi RWO nfs 82s Filesystem
PVC與PV綁定時會根據storageClassName(存儲類名稱)和accessModes(訪問模式)判斷哪些PV符合綁定需求。然后再根據存儲量大小判斷,首先存PV儲量必須大於或等於PVC聲明量;其次就是PV存儲量越接近PVC聲明量,那么優先級就越高(PV量越小優先級越高)。
curl訪問驗證
在NFS服務端k8s-node03(172.16.1.113)對應NFS共享目錄創建文件
1 echo "pv-nfs2===" > /data/nfs2/index.html 2 echo "pv-nfs4+++" > /data/nfs4/index.html 3 echo "pv-nfs6---" > /data/nfs6/index.html
curl訪問pod
1 [root@k8s-master pv-pvc]# kubectl get pod -o wide 2 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES 3 web-0 1/1 Running 0 8m23s 10.244.2.174 k8s-node02 <none> <none> 4 web-1 1/1 Running 0 8m20s 10.244.4.139 k8s-node01 <none> <none> 5 web-2 1/1 Running 0 8m17s 10.244.2.175 k8s-node02 <none> <none> 6 [root@k8s-master pv-pvc]# 7 [root@k8s-master pv-pvc]# curl 10.244.2.174 8 pv-nfs2=== 9 [root@k8s-master pv-pvc]# 10 [root@k8s-master pv-pvc]# curl 10.244.4.139 11 pv-nfs6--- 12 [root@k8s-master pv-pvc]# 13 [root@k8s-master pv-pvc]# curl 10.244.2.175 14 pv-nfs4+++
即使刪除其中一個pod,pod被拉起來后也能正常訪問。
刪除sts並回收PV
刪除statefulset
1 [root@k8s-master pv-pvc]# kubectl delete -f sts-pod-pvc.yaml 2 service "nginx" deleted 3 statefulset.apps "web" deleted 4 [root@k8s-master pv-pvc]# 5 [root@k8s-master pv-pvc]# kubectl get pod -o wide 6 No resources found in default namespace.
查看PVC和PV,並刪除PVC
1 [root@k8s-master pv-pvc]# kubectl get pvc -o wide 2 NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE VOLUMEMODE 3 www-web-0 Bound pv-nfs2 3Gi RWO nfs 24m Filesystem 4 www-web-1 Bound pv-nfs6 5Gi RWO nfs 24m Filesystem 5 www-web-2 Bound pv-nfs4 10Gi RWO nfs 24m Filesystem 6 [root@k8s-master pv-pvc]# 7 [root@k8s-master pv-pvc]# kubectl get pv -o wide 8 NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE VOLUMEMODE 9 pv-nfs1 1Gi RWO Recycle Available nfs 26m Filesystem 10 pv-nfs2 3Gi RWO Recycle Bound default/www-web-0 nfs 26m Filesystem 11 pv-nfs3 5Gi RWO Recycle Available slow 26m Filesystem 12 pv-nfs4 10Gi RWO Recycle Bound default/www-web-2 nfs 26m Filesystem 13 pv-nfs5 5Gi RWX Recycle Available nfs 26m Filesystem 14 pv-nfs6 5Gi RWO Recycle Bound default/www-web-1 nfs 26m Filesystem 15 [root@k8s-master pv-pvc]# 16 [root@k8s-master pv-pvc]# kubectl delete pvc www-web-0 www-web-1 www-web-2 17 persistentvolumeclaim "www-web-0" deleted 18 persistentvolumeclaim "www-web-1" deleted 19 persistentvolumeclaim "www-web-2" deleted
回收PV
1 ### 由下可見,還有一個pv雖然聲明被刪除,但資源尚未回收;我們只需等一會兒即可 2 [root@k8s-master pv-pvc]# kubectl get pv -o wide 3 NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE VOLUMEMODE 4 pv-nfs1 1Gi RWO Recycle Available nfs 90m Filesystem 5 pv-nfs2 3Gi RWO Recycle Available nfs 90m Filesystem 6 pv-nfs3 5Gi RWO Recycle Available slow 90m Filesystem 7 pv-nfs4 10Gi RWO Recycle Available nfs 90m Filesystem 8 pv-nfs5 5Gi RWX Recycle Available nfs 90m Filesystem 9 pv-nfs6 5Gi RWO Recycle Released default/www-web-1 nfs 90m Filesystem 10 [root@k8s-master pv-pvc]# 11 ### 可見該pv還有引用 12 [root@k8s-master pv-pvc]# kubectl get pv pv-nfs6 -o yaml 13 apiVersion: v1 14 kind: PersistentVolume 15 metadata: 16 ……………… 17 spec: 18 accessModes: 19 - ReadWriteOnce 20 capacity: 21 storage: 5Gi 22 ################### 可見仍然在被使用 23 claimRef: 24 apiVersion: v1 25 kind: PersistentVolumeClaim 26 name: www-web-1 27 namespace: default 28 resourceVersion: "1179810" 29 uid: d4d8943c-6b16-45a5-8ffc-691fcefc4f88 30 ################### 31 nfs: 32 path: /data/nfs6 33 server: 172.16.1.113 34 persistentVolumeReclaimPolicy: Recycle 35 storageClassName: nfs 36 volumeMode: Filesystem 37 status: 38 phase: Released
在NFS服務端查看結果如下,可見/data/nfs6資源尚未回收,而/data/nfs2/、/data/nfs4/資源已經被回收。
1 [root@k8s-node03 ~]# tree /data/ 2 /data/ 3 ├── nfs1 4 ├── nfs2 5 ├── nfs3 6 ├── nfs4 7 ├── nfs5 8 └── nfs6 9 └── index.html 10 11 5 directories, 2 files
針對這種情況有兩種處理方式:
1、我們什么也不用做,等一會兒集群就能回收該資源
2、我們進行手動回收,操作如下
1 [root@k8s-master pv-pvc]# kubectl edit pv pv-nfs6 2 ### 去掉claimRef: 部分 3 ### 再次查看pv信息 4 [root@k8s-master pv-pvc]# kubectl get pv -o wide 5 NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE VOLUMEMODE 6 pv-nfs1 1Gi RWO Recycle Available nfs 108m Filesystem 7 pv-nfs2 3Gi RWO Recycle Available nfs 108m Filesystem 8 pv-nfs3 5Gi RWO Recycle Available slow 108m Filesystem 9 pv-nfs4 10Gi RWO Recycle Available nfs 108m Filesystem 10 pv-nfs5 5Gi RWX Recycle Available nfs 108m Filesystem 11 pv-nfs6 5Gi RWO Recycle Available nfs 108m Filesystem

之后到NFS服務端操作,清除該pv下的數據
[root@k8s-node03 ~]# rm -fr /data/nfs6/*
到此,手動回收資源操作成功!
StatefulSet網絡標識與PVC
1、匹配StatefulSet的Pod name(網絡標識)的模式為:$(statefulset名稱)-$(序號),比如StatefulSet名稱為web,副本數為3。則為:web-0、web-1、web-2
2、StatefulSet為每個Pod副本創建了一個DNS域名,這個域名的格式為:$(podname).(headless service name),也就意味着服務之間是通過Pod域名來通信而非Pod IP。當Pod所在Node發生故障時,Pod會被漂移到其他Node上,Pod IP會發生改變,但Pod域名不會變化
3、StatefulSet使用Headless服務來控制Pod的域名,這個Headless服務域名的為:$(service name).$(namespace).svc.cluster.local,其中 cluster.local 指定的集群的域名
4、根據volumeClaimTemplates,為每個Pod創建一個PVC,PVC的命令規則為:$(volumeClaimTemplates name)-$(pod name),比如volumeClaimTemplates為www,pod name為web-0、web-1、web-2;那么創建出來的PVC為:www-web-0、www-web-1、www-web-2
5、刪除Pod不會刪除對應的PVC,手動刪除PVC將自動釋放PV。
相關閱讀
2、Kubernetes K8S 資源控制器StatefulSets詳解
完畢!
———END———
如果覺得不錯就關注下唄 (-^O^-) !

