Kubernetes K8S之存儲Volume詳解

 

K8S之存儲PV-PVC概述與說明,並詳解經常使用PV-PVC示例html

 

概述

與管理計算實例相比,管理存儲是一個明顯的問題。PersistentVolume子系統爲用戶和管理員提供了一個API,該API從如何使用存儲中抽象出如何提供存儲的詳細信息。爲此,咱們引入了兩個新的API資源:PersistentVolume和PersistentVolumeClaimnode

 

PV概述

PersistentVolume (PV)是集羣中由管理員提供或使用存儲類動態提供的一塊存儲。它是集羣中的資源,就像節點是集羣資源同樣。nginx

PV是與Volumes相似的卷插件,但其生命週期與使用PV的任何單個Pod無關。由此API對象捕獲存儲的實現細節,不論是NFS、iSCSI仍是特定於雲提供商的存儲系統。web

 

PVC概述

PersistentVolumeClaim (PVC) 是用戶對存儲的請求。它相似於Pod;Pods消耗節點資源,而PVC消耗PV資源。Pods能夠請求特定級別的資源(CPU和內存)。Claim能夠請求特定的存儲大小和訪問模式(例如,它們能夠掛載一次讀寫或屢次只讀)。vim

雖然PersistentVolumeClaims (PVC) 容許用戶使用抽象的存儲資源,可是用戶一般須要具備不一樣屬性(好比性能)的PersistentVolumes (PV) 來解決不一樣的問題。集羣管理員須要可以提供各類不一樣的PersistentVolumes,這些卷在大小和訪問模式以外還有不少不一樣之處,也不向用戶公開這些卷是如何實現的細節。對於這些需求,有一個StorageClass資源。api

 

volume 和 claim的生命週期

PV是集羣中的資源。PVC是對這些資源的請求,而且還充當對資源的聲明檢查。PV和PVC之間的交互遵循如下生命週期:服務器

 

供應

有兩種方式配置PV:靜態的或動態的。網絡

 

靜態配置

集羣管理員建立一些PV。它們帶有可供集羣用戶使用的實際存儲的詳細信息。存在於Kubernetes API中,可供使用。架構

 

動態配置

當管理員建立的靜態PV沒有一個與用戶的PersistentVolumeClaim匹配時,集羣可能會嘗試動態地爲PVC提供一個卷。此配置基於StorageClasses:PVC必須請求存儲類,而且管理員必須已經建立並配置了該類,才能進行動態配置。聲明該類爲 "",能夠有效地禁用其動態配置。app

要啓用基於存儲級別的動態存儲配置,集羣管理員須要啓用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

 

NFS客戶端驗證

在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 [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

一、匹配StatefulSet的Pod name(網絡標識)的模式爲:$(statefulset名稱)-$(序號),好比StatefulSet名稱爲web,副本數爲3。則爲:web-0、web-一、web-2

二、StatefulSet爲每一個Pod副本建立了一個DNS域名,這個域名的格式爲:$(podname).(headless service name),也就意味着服務之間是經過Pod域名來通訊而非Pod IP。當Pod所在Node發生故障時,Pod會被漂移到其餘Node上,Pod IP會發生改變,但Pod域名不會變化

三、StatefulSet使用Headless服務來控制Pod的域名,這個Headless服務域名的爲:$(service name).$(namespace).svc.cluster.local,其中 cluster.local 指定的集羣的域名

四、根據volumeClaimTemplates,爲每一個Pod建立一個PVC,PVC的命令規則爲:$(volumeClaimTemplates name)-$(pod name),好比volumeClaimTemplates爲www,pod name爲web-0、web-一、web-2;那麼建立出來的PVC爲:www-web-0、www-web-一、www-web-2

五、刪除Pod不會刪除對應的PVC,手動刪除PVC將自動釋放PV。

 

相關閱讀

一、NFS 服務搭建與配置

二、Kubernetes K8S 資源控制器StatefulSets詳解

完畢!

 


 

 

———END———
若是以爲不錯就關注下唄 (-^O^-) !

相關文章
相關標籤/搜索