k8s-存儲-pv和pvc和StatefulSet


k8s-存儲-pv和pvc和StatefulSet

 

一 概念

1.1 pv

PersistentVolume (PV)

是由管理員設置的存儲,它是群集的一部分。就像節點是集群中的資源一樣,PV 也是集群中的資源。 PV 是Volume 之類的卷插件,但具有獨立於使用 PV 的 Pod 的生命周期。此 API 對象包含存儲實現的細節,即 NFS、iSCSI 或特定於雲供應商的存儲系統

1.2 pvc

PersistentVolumeClaim (PVC)

是用戶存儲的請求。它與 Pod 相似。Pod 消耗節點資源,PVC 消耗 PV 資源。Pod 可以請求特定級別的資源(CPU 和內存)。聲明可以請求特定的大小和訪問模式(例如,可以以讀/寫一次或 只讀多次模式掛載)

 

  • 作用:

PVC 保護的目的是確保由 pod 正在使用的 PVC 不會從系統中移除,因為如果被移除的話可能會導致數據丟失當啟用PVC 保護 alpha 功能時,如果用戶刪除了一個 pod 正在使用的 PVC,則該 PVC 不會被立即刪除。PVC 的刪除將被推遲,直到 PVC 不再被任何 pod 使用

1.3 pv和pvc綁定

master 中的控制環路監視新的 PVC,尋找匹配的 PV(如果可能),並將它們綁定在一起。如果為新的 PVC 動態調配 PV,則該環路將始終將該 PV 綁定到 PVC。否則,用戶總會得到他們所請求的存儲,但是容量可能超出要求的數量。一旦 PV 和 PVC 綁定后, PersistentVolumeClaim 綁定是排他性的,不管它們是如何綁定的。 PVC 跟PV 綁定是一對一的映射

1.4 pv訪問類型

PersistentVolume 可以以資源提供者支持的任何方式掛載到主機上。如下表所示,供應商具有不同的功能,每個PV 的訪問模式都將被設置為該卷支持的特定模式。例如,NFS 可以支持多個讀/寫客戶端,但特定的 NFS PV 可能以只讀方式導出到服務器上。每個 PV 都有一套自己的用來描述特定功能的訪問模式

 

ReadWriteOnce——該卷可以被單個節點以讀/寫模式掛載

ReadOnlyMany——該卷可以被多個節點以只讀模式掛載

ReadWriteMany——該卷可以被多個節點以讀/寫模式掛載

在命令行中,訪問模式縮寫為:

RWO - ReadWriteOnce

ROX - ReadOnlyMany

RWX - ReadWriteMany

1.5 pvc回收策略

Retain(保留)——手動回收

Recycle(回收)——基本擦除( rm -rf /thevolume/* )

Delete(刪除)——關聯的存儲資產(例如 AWS EBS、GCE PD、Azure Disk 和 OpenStack Cinder 卷)

將被刪除當前,只有 NFS 和 HostPath 支持回收策略。AWS EBS、GCE PD、Azure Disk 和 Cinder 卷支持刪除策略

1.6 pvc的狀態

Available(可用)——一塊空閑資源還沒有被任何聲明綁定

Bound(已綁定)——卷已經被聲明綁定

Released(已釋放)——聲明被刪除,但是資源還未被集群重新聲明

Failed(失敗)——該卷的自動回收失敗

1.7 創建pv和pvc

  • 安裝nfs

注意 你的node節點也都需要安裝nfs-utils,為了掛載

 

yum install -y nfs-common nfs-utils rpcbind
mkdir /nfs{1..3}
chmod 666 /nfs{1..3}
chown nfsnobody /nfs{1..3}

[root@k8s-master01 pv]# cat /etc/exports
/nfs1 *(rw,no_root_squash,no_all_squash,sync)
/nfs2 *(rw,no_root_squash,no_all_squash,sync)
/nfs3 *(rw,no_root_squash,no_all_squash,sync)

systemctl start rpcbind
systemctl start nfs

 

  • 創建pv

 

[root@k8s-master01 pv]# cat pv.yaml 
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfspv1 #pv名字
spec:
  capacity:
    storage: 10Gi
  accessModes: # 訪問模式
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle #回收模式
  storageClassName: nfs #卷的名字
  nfs:
    path: /nfs1 #掛載宿主機目錄
    server: 192.168.1.210 # nfsip
---

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfspv2
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadOnlyMany
  persistentVolumeReclaimPolicy: Recycle
  storageClassName: hu
  nfs:
    path: /nfs2
    server: 192.168.1.210
---

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfspv3
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  storageClassName: nfs
  nfs:
    path: /nfs3
    server: 192.168.1.210

 

查看pv

 

  • 創建pvc

 

[root@k8s-master01 pv]# cat pod.yaml 
# 創建無頭服務
apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  selector:
    matchLabels:
      app: nginx
  serviceName: "nginx"
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: wangyanglinux/myapp:v1
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec: #必須滿足下面兩個,pod才會綁定到pv上面
      accessModes: [ "ReadWriteOnce" ] #讀取模式
      storageClassName: "nfs" #綁定pv名字為nfs
      resources:
        requests:
          storage: 1Gi


 

然后查看綁定結果,發現只有一個pod綁定成功,因為另外兩pc不滿足條件

 

 

然后我們再次測試,把另外兩個pv也改成跟nfspv1 相同的配置,你會發現三個pod都已經啟動了

 

然后3個pv也都綁定了

然后在查看pvc

 

然后分別訪問三個pod,在node節點上面,需要去宿主機的,nfs1,nfs2,nfs3,三個目錄添加index.html文件

即使你刪除一個pod,他的ip地址變了,然后你再次訪問,數據發現還是不會丟失的

 

 

二 StatefulSet

2.1 statefulset特性

  • 匹配 Pod name ( 網絡標識 ) 的模式為:$(statefulset名稱)-$(序號),比如上面的示例:web-0,web-1,web-2

 

  • StatefulSet 為每個 Pod 副本創建了一個 DNS 域名,這個域名的格式為: $(podname).(headless servername),也就意味着服務間是通過Pod域名來通信而非Pod IP,因為當Pod所在Node發生故障時, Pod 會被飄移到其它 Node 上,Pod IP 會發生變化,但是 Pod 域名不會有變化

驗證:登錄其中一個pod,然后ping ,容器名.svc名字

  • StatefulSet 使用 Headless 服務來控制 Pod 的域名,這個域名的 FQDN 為:$(servicename).$(namespace).svc.cluster.local,其中,“cluster.local” 指的是集群的域名根據 volumeClaimTemplates,為每個 Pod 創建一個 pvc,pvc 的命名則匹配模式:(volumeClaimTemplates.name)-(pod_name),比如上面的volumeMounts.name=www, Podname=web-[0-2],因此創建出來的 PVC 是 www-web-0、www-web-1、www-web-2

 

驗證:10.244.2.9是k8s內部的dns,nginx是svc的名字,default是命名空間的名字

  • 刪除 Pod 不會刪除其 pvc,手動刪除 pvc 將自動釋放 pv

 

2.2 查看 statefulset

2.3 Statefulset的啟停順序

  • 有序部署:部署StatefulSet時,如果有多個Pod副本,它們會被順序地創建(從0到N-1)並且,在下一個Pod運行之前所有之前的Pod必須都是Running和Ready狀態。

 

  • 有序刪除:當Pod被刪除時,它們被終止的順序是從N-1到0。

  • 有序擴展:當對Pod執行擴展操作時,與部署一樣,它前面的Pod必須都處於Running和Ready狀態。

 

2.4 StatefulSet使用場景

  • 穩定的持久化存儲,即Pod重新調度后還是能訪問到相同的持久化數據,基於 PVC 來實現。

  • 穩定的網絡標識符,即 Pod 重新調度后其 PodName 和 HostName 不變。

  • 有序部署,有序擴展,基於 init containers 來實現。

  • 有序收縮。

 

三 如何徹底刪除pv

1 首先刪除對應的pod和svc,然后刪除pvc,

 

kubectl delete -f pod.yaml

kubectl delete pvc --all

如果還是刪除不掉,需要直接編輯pv,刪除掉紅框里面的4行

 

kubectl edit pv nfspv3

 

然后你會發現你的pv就都釋放掉資源了

 

pv,pvc,pod直接的關系

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM