精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

一文讀懂容器存儲接口 CSI

大數據
在《一文讀懂 K8s 持久化存儲流程》一文我們重點介紹了 K8s 內部的存儲流程,以及 PV、PVC、StorageClass、Kubelet 等之間的調用關系。接下來本文將將重點放在 CSI(Container Storage Interface)容器存儲接口上,探究什么是 CSI 及其內部工作原理。

 [[397865]]

背景

K8s 原生支持一些存儲類型的 PV,如 iSCSI、NFS、CephFS 等等(詳見鏈接),這些 in-tree 類型的存儲代碼放在 Kubernetes 代碼倉庫中。這里帶來的問題是 K8s 代碼與三方存儲廠商的代碼強耦合

  • 更改 in-tree 類型的存儲代碼,用戶必須更新 K8s 組件,成本較高
  • in-tree 存儲代碼中的 bug 會引發 K8s 組件不穩定
  • K8s 社區需要負責維護及測試 in-tree 類型的存儲功能
  • in-tree 存儲插件享有與 K8s 核心組件同等的特權,存在安全隱患

三方存儲開發者必須遵循 K8s 社區的規則開發 in-tree 類型存儲代碼
CSI 容器存儲接口標準的出現解決了上述問題,將三方存儲代碼與 K8s 代碼解耦,使得三方存儲廠商研發人員只需實現 CSI 接口(無需關注容器平臺是 K8s 還是 Swarm 等)。

CSI 核心流程介紹

在詳細介紹 CSI 組件及其接口之前,我們先對 K8s 中 CSI 存儲流程進行一個介紹。《一文讀懂 K8s 持久化存儲流程》一文介紹了 K8s 中的 Pod 在掛載存儲卷時需經歷三個的階段:Provision/Delete(創盤/刪盤)、Attach/Detach(掛接/摘除)和 Mount/Unmount(掛載/卸載),下面以圖文的方式講解 K8s 在這三個階段使用 CSI 的流程。

1. Provisioning Volumes

1.集群管理員創建 StorageClass 資源,該 StorageClass 中包含 CSI 插件名稱(provisioner:pangu.csi.alibabacloud.com)以及存儲類必須的參數(parameters: type=cloud_ssd)。sc.yaml 文件如下:

2.用戶創建 PersistentVolumeClaim 資源,PVC 指定存儲大小及 StorageClass(如上)。pvc.yaml 文件如下:

3.卷控制器(PersistentVolumeController)觀察到集群中新創建的 PVC 沒有與之匹配的 PV,且其使用的存儲類型為 out-of-tree,于是為 PVC 打 annotation:volume.beta.kubernetes.io/storage-provisioner=[out-of-tree CSI 插件名稱](本例中即為 provisioner:pangu.csi.alibabacloud.com)。

4.External Provisioner 組件觀察到 PVC 的 annotation 中包含 "volume.beta.kubernetes.io/storage-provisioner" 且其 value 是自己,于是開始創盤流程。

獲取相關 StorageClass 資源并從中獲取參數(本例中 parameters 為 type=cloud_ssd),用于后面 CSI 函數調用。
通過 unix domain socket 調用外部 CSI 插件的CreateVolume 函數
5.外部 CSI 插件返回成功后表示盤創建完成,此時External Provisioner 組件會在集群創建一個 PersistentVolume 資源。

6.卷控制器會將 PV 與 PVC 進行綁定。

2. Attaching Volumes

1.AD 控制器(AttachDetachController)觀察到使用 CSI 類型 PV 的 Pod 被調度到某一節點,此時AD 控制器會調用內部 in-tree CSI 插件(csiAttacher)的 Attach 函數。

2.內部 in-tree CSI 插件(csiAttacher)會創建一個 VolumeAttachment 對象到集群中。

3.External Attacher 觀察到該 VolumeAttachment 對象,并調用外部 CSI插件的ControllerPublish 函數以將卷掛接到對應節點上。外部 CSI 插件掛載成功后,External Attacher會更新相關 VolumeAttachment 對象的 .Status.Attached 為 true。

4.AD 控制器內部 in-tree CSI 插件(csiAttacher)觀察到 VolumeAttachment 對象的 .Status.Attached 設置為 true,于是更新AD 控制器內部狀態(ActualStateOfWorld),該狀態會顯示在 Node 資源的 .Status.VolumesAttached 上。

3. Mounting Volumes

1.Volume Manager(Kubelet 組件)觀察到有新的使用 CSI 類型 PV 的 Pod 調度到本節點上,于是調用內部 in-tree CSI 插件(csiAttacher)的 WaitForAttach 函數。

2.內部 in-tree CSI 插件(csiAttacher)等待集群中 VolumeAttachment 對象狀態 .Status.Attached 變為 true。

3.in-tree CSI 插件(csiAttacher)調用 MountDevice 函數,該函數內部通過 unix domain socket 調用外部 CSI 插件的NodeStageVolume 函數;之后插件(csiAttacher)調用內部 in-tree CSI 插件(csiMountMgr)的 SetUp 函數,該函數內部會通過 unix domain socket 調用外部 CSI 插件的NodePublishVolume 函數

4. Unmounting Volumes

1.用戶刪除相關 Pod。

2.Volume Manager(Kubelet 組件)觀察到包含 CSI 存儲卷的 Pod 被刪除,于是調用內部 in-tree CSI 插件(csiMountMgr)的 TearDown 函數,該函數內部會通過 unix domain socket 調用外部 CSI 插件NodeUnpublishVolume 函數

3.Volume Manager(Kubelet 組件)調用內部 in-tree CSI 插件(csiAttacher)的 UnmountDevice 函數,該函數內部會通過 unix domain socket 調用外部 CSI 插件的 NodeUnpublishVolume 函數

5. Detaching Volumes

1.AD 控制器觀察到包含 CSI 存儲卷的 Pod 被刪除,此時該控制器會調用內部 in-tree CSI 插件(csiAttacher)的 Detach 函數

2.csiAttacher會刪除集群中相關 VolumeAttachment 對象(但由于存在 finalizer,va 對象不會立即刪除)。

3.External Attacher觀察到集群中 VolumeAttachment 對象的 DeletionTimestamp 非空,于是調用外部 CSI 插件ControllerUnpublish 函數以將卷從對應節點上摘除。外部 CSI 插件摘除成功后,External Attacher會移除相關 VolumeAttachment 對象的 finalizer 字段,此時 VolumeAttachment 對象被徹底刪除。

4.AD 控制器內部 in-tree CSI 插件(csiAttacher)觀察到 VolumeAttachment 對象已刪除,于是更新AD 控制器中的內部狀態;同時AD 控制器更新 Node 資源,此時 Node 資源的 .Status.VolumesAttached 上已沒有相關掛接信息。

6. Deleting Volumes

1.用戶刪除相關 PVC。

2.External Provisioner 組件觀察到 PVC 刪除事件,根據 PVC 的回收策略(Reclaim)執行不同操作:

Delete:調用外部 CSI 插件DeleteVolume 函數以刪除卷;一旦卷成功刪除,Provisioner會刪除集群中對應 PV 對象。
Retain:Provisioner不執行卷刪除操作。
CSI Sidecar 組件介紹

為使 K8s 適配 CSI 標準,社區將與 K8s 相關的存儲流程邏輯放在了 CSI Sidecar 組件中。

1. Node Driver Registrar

1)功能

Node-Driver-Registrar 組件會將外部 CSI 插件注冊到Kubelet,從而使Kubelet通過特定的 Unix Domain Socket 來調用外部 CSI 插件函數(Kubelet 會調用外部 CSI 插件的 NodeGetInfo、NodeStageVolume、NodePublishVolume、NodeGetVolumeStats 等函數)。

2)原理

Node-Driver-Registrar 組件通過Kubelet 外部插件注冊機制實現注冊,注冊成功后:

  • Kubelet為本節點 Node 資源打 annotation:Kubelet調用外部 CSI 插件NodeGetInfo 函數,其返回值 [nodeID]、[driverName] 將作為值用于 "csi.volume.kubernetes.io/nodeid" 鍵。
  • Kubelet更新 Node Label:將NodeGetInfo 函數返回的 [AccessibleTopology] 值用于節點的 Label。
  • Kubelet更新 Node Status:將NodeGetInfo 函數返回的 maxAttachLimit(節點最大可掛載卷數量)更新到 Node 資源的 Status.Allocatable:attachable-volumes-csi-[driverName]=[maxAttachLimit]。

 

  • Kubelet更新 CSINode 資源(沒有則創建):將 [driverName]、[nodeID]、[maxAttachLimit]、[AccessibleTopology] 更新到 Spec 中(拓撲僅保留 Key 值)。

2. External Provisioner

 

1)功能

創建/刪除實際的存儲卷,以及代表存儲卷的 PV 資源。

2)原理

External-Provisioner在啟動時需指定參數 -- provisioner,該參數指定 Provisioner 名稱,與 StorageClass 中的 provisioner 字段對應。

External-Provisioner啟動后會 watch 集群中的 PVC 和 PV 資源。

對于集群中的 PVC 資源:

  • 判斷 PVC 是否需要動態創建存儲卷,標準如下:PVC 的 annotation 中是否包含 "volume.beta.kubernetes.io/storage-provisioner" 鍵(由卷控制器創建),并且其值是否與 Provisioner 名稱相等。PVC 對應 StorageClass 的 VolumeBindingMode 字段若為 WaitForFirstConsumer,則 PVC 的 annotation 中必須包含 "volume.kubernetes.io/selected-node" 鍵(詳見調度器如何處理 WaitForFirstConsumer),且其值不為空;若為 Immediate 則表示需要 Provisioner 立即提供動態存儲卷。
  • 通過特定的 Unix Domain Socket 調用外部 CSI 插件CreateVolume 函數
  • 創建 PV 資源,PV 名稱為 [Provisioner 指定的 PV 前綴] - [PVC uuid]。

對于集群中的 PV 資源:

  • 判斷 PV 是否需要刪除,標準如下:判斷其 .Status.Phase 是否為 Release。判斷其 .Spec.PersistentVolumeReclaimPolicy 是否為 Delete。判斷其是否包含 annotation(pv.kubernetes.io/provisioned-by),且其值是否為自己。
  • 通過特定的 Unix Domain Socket 調用外部 CSI 插件 DeleteVolume 接口
  • 刪除集群中的 PV 資源。

3. External Attacher

1)功能

掛接/摘除存儲卷。

2)原理

External-Attacher 內部會時刻 watch 集群中的 VolumeAttachment 資源和 PersistentVolume 資源。

對于 VolumeAttachment 資源:

  • 從 VolumeAttachment 資源中獲得 PV 的所有信息,如 volume ID、node ID、掛載 Secret 等。
  • 判斷 VolumeAttachment 的 DeletionTimestamp 字段是否為空來判斷其為卷掛接或卷摘除:若為卷掛接則通過特定的 Unix Domain Socket 調用外部 CSI 插件ControllerPublishVolume 接口;若為卷摘除則通過特定的 Unix Domain Socket 調用外部 CSI 插件的ControllerUnpublishVolume 接口

對于 PersistentVolume 資源:

  • 在掛接時為相關 PV 打上 Finalizer:external-attacher/[driver 名稱]。
  • 當 PV 處于刪除狀態時(DeletionTimestamp 非空),刪除 Finalizer:external-attacher/[driver 名稱]。

4. External Resizer

1)功能

擴容存儲卷。

2)原理

External-Resizer內部會 watch 集群中的 PersistentVolumeClaim 資源。

對于 PersistentVolumeClaim 資源:

  • 判斷 PersistentVolumeClaim 資源是否需要擴容:PVC 狀態需要是 Bound 且 .Status.Capacity 與 .Spec.Resources.Requests 不等。
  • 更新 PVC 的 .Status.Conditions,表明此時處于 Resizing 狀態。
  • 通過特定的 Unix Domain Socket 調用外部 CSI 插件的 ControllerExpandVolume 接口
  • 更新 PV 的 .Spec.Capacity。
  • 若 CSI 支持文件系統在線擴容,ControllerExpandVolume 接口返回值中 NodeExpansionRequired 字段為 true,External-Resizer更新 PVC 的 .Status.Conditions 為 FileSystemResizePending 狀態;若不支持則擴容成功,External-Resizer更新 PVC 的 .Status.Conditions 為空,且更新 PVC 的 .Status.Capacity。

Volume Manager(Kubelet 組件)觀察到存儲卷需在線擴容,于是通過特定的 Unix Domain Socket 調用外部 CSI 插件的NodeExpandVolume 接口實現文件系統擴容。

5. livenessprobe

1)功能

檢查 CSI 插件是否正常。

2)原理

通過對外暴露一個 / healthz HTTP 端口以服務 kubelet 的探針探測器,內部是通過特定的 Unix Domain Socket 調用外部 CSI 插件的 Probe 接口

CSI 接口介紹

三方存儲廠商需實現 CSI 插件的三大接口:IdentityServer、ControllerServer、NodeServer

1. IdentityServer

IdentityServer 主要用于認證 CSI 插件的身份信息。

// IdentityServer is the server API for Identity service.type IdentityServer interface { // 獲取CSI插件的信息,比如名稱、版本號 GetPluginInfo(context.Context, *GetPluginInfoRequest) (*GetPluginInfoResponse, error) // 獲取CSI插件提供的能力,比如是否提供ControllerService能力 GetPluginCapabilities(context.Context, *GetPluginCapabilitiesRequest) (*GetPluginCapabilitiesResponse, error) // 獲取CSI插件健康狀況 Probe(context.Context, *ProbeRequest) (*ProbeResponse, error)}

2. ControllerServer

ControllerServer 主要負責存儲卷及快照的創建/刪除以及掛接/摘除操作。

// ControllerServer is the server API for Controller service.type ControllerServer interface { // 創建存儲卷 CreateVolume(context.Context, *CreateVolumeRequest) (*CreateVolumeResponse, error) // 刪除存儲卷 DeleteVolume(context.Context, *DeleteVolumeRequest) (*DeleteVolumeResponse, error) // 掛接存儲卷到特定節點 ControllerPublishVolume(context.Context, *ControllerPublishVolumeRequest) (*ControllerPublishVolumeResponse, error) // 從特定節點摘除存儲卷 ControllerUnpublishVolume(context.Context, *ControllerUnpublishVolumeRequest) (*ControllerUnpublishVolumeResponse, error) // 驗證存儲卷能力是否滿足要求,比如是否支持跨節點多讀多寫 ValidateVolumeCapabilities(context.Context, *ValidateVolumeCapabilitiesRequest) (*ValidateVolumeCapabilitiesResponse, error) // 列舉全部存儲卷信息 ListVolumes(context.Context, *ListVolumesRequest) (*ListVolumesResponse, error) // 獲取存儲資源池可用空間大小 GetCapacity(context.Context, *GetCapacityRequest) (*GetCapacityResponse, error) // 獲取ControllerServer支持功能點,比如是否支持快照能力 ControllerGetCapabilities(context.Context, *ControllerGetCapabilitiesRequest) (*ControllerGetCapabilitiesResponse, error) // 創建快照 CreateSnapshot(context.Context, *CreateSnapshotRequest) (*CreateSnapshotResponse, error) // 刪除快照 DeleteSnapshot(context.Context, *DeleteSnapshotRequest) (*DeleteSnapshotResponse, error) // 獲取所有快照信息 ListSnapshots(context.Context, *ListSnapshotsRequest) (*ListSnapshotsResponse, error) // 擴容存儲卷 ControllerExpandVolume(context.Context, *ControllerExpandVolumeRequest) (*ControllerExpandVolumeResponse, error)}

3. NodeServer

NodeServer 主要負責存儲卷掛載/卸載操作。

// NodeServer is the server API for Node service.type NodeServer interface { // 將存儲卷格式化并掛載至臨時全局目錄 NodeStageVolume(context.Context, *NodeStageVolumeRequest) (*NodeStageVolumeResponse, error) // 將存儲卷從臨時全局目錄卸載 NodeUnstageVolume(context.Context, *NodeUnstageVolumeRequest) (*NodeUnstageVolumeResponse, error) // 將存儲卷從臨時目錄bind-mount到目標目錄 NodePublishVolume(context.Context, *NodePublishVolumeRequest) (*NodePublishVolumeResponse, error) // 將存儲卷從目標目錄卸載 NodeUnpublishVolume(context.Context, *NodeUnpublishVolumeRequest) (*NodeUnpublishVolumeResponse, error) // 獲取存儲卷的容量信息 NodeGetVolumeStats(context.Context, *NodeGetVolumeStatsRequest) (*NodeGetVolumeStatsResponse, error) // 存儲卷擴容 NodeExpandVolume(context.Context, *NodeExpandVolumeRequest) (*NodeExpandVolumeResponse, error) // 獲取NodeServer支持功能點,比如是否支持獲取存儲卷容量信息 NodeGetCapabilities(context.Context, *NodeGetCapabilitiesRequest) (*NodeGetCapabilitiesResponse, error) // 獲取CSI節點信息,比如最大支持卷個數 NodeGetInfo(context.Context, *NodeGetInfoRequest) (*NodeGetInfoResponse, error)}K8s CSI API 對象

K8s 為支持 CSI 標準,包含如下 API 對象:

CSINode
CSIDriver
VolumeAttachment
1. CSINode

apiVersion: storage.k8s.io/v1beta1kind: CSINodemetadata: name: node-10.212.101.210spec: drivers: - name: yodaplugin.csi.alibabacloud.com nodeID: node-10.212.101.210 topologyKeys: - kubernetes.io/hostname - name: pangu.csi.alibabacloud.com nodeID: a5441fd9013042ee8104a674e4a9666a topologyKeys: - topology.pangu.csi.alibabacloud.com/zone作用:

判斷外部 CSI 插件是否注冊成功。在 Node Driver Registrar 組件向 Kubelet 注冊完畢后,Kubelet 會創建該資源,故不需要顯式創建 CSINode 資源。
將 Kubernetes 中 Node 資源名稱與三方存儲系統中節點名稱(nodeID)一一對應。此處Kubelet會調用外部 CSI 插件NodeServer 的 GetNodeInfo 函數獲取 nodeID。
顯示卷拓撲信息。CSINode 中 topologyKeys 用來表示存儲節點的拓撲信息,卷拓撲信息會使得Scheduler在 Pod 調度時選擇合適的存儲節點。
2. CSIDriver

apiVersion: storage.k8s.io/v1beta1kind: CSIDrivermetadata: name: pangu.csi.alibabacloud.comspec: # 插件是否支持卷掛接(VolumeAttach) attachRequired: true # Mount階段是否CSI插件需要Pod信息 podInfoOnMount: true # 指定CSI支持的卷模式 volumeLifecycleModes: - Persistent作用:

簡化外部 CSI 插件的發現。由集群管理員創建,通過 kubectl get csidriver 即可得知環境上有哪些 CSI 插件。
自定 義Kubernetes 行為,如一些外部 CSI 插件不需要執行卷掛接(VolumeAttach)操作,則可以設置 .spec.attachRequired 為 false。
3. VolumeAttachment

apiVersion: storage.k8s.io/v1kind: VolumeAttachmentmetadata: annotations: csi.alpha.kubernetes.io/node-id: 21481ae252a2457f9abcb86a3d02ba05 finalizers: - external-attacher/pangu-csi-alibabacloud-com name: csi-0996e5e9459e1ccc1b3a7aba07df4ef7301c8e283d99eabc1b69626b119ce750spec: attacher: pangu.csi.alibabacloud.com nodeName: node-10.212.101.241 source: persistentVolumeName: pangu-39aa24e7-8877-11eb-b02f-021234350de1status: attached: true作用:VolumeAttachment 記錄了存儲卷的掛接/摘除信息以及節點信息。

支持特性

1. 拓撲支持

在 StorageClass 中有 AllowedTopologies 字段:

  • apiVersion: storage.k8s.io/v1kind: StorageClassmetadata: name: csi-panguprovisioner: pangu.csi.alibabacloud.comparameters: type: cloud_ssdvolumeBindingMode: ImmediateallowedTopologies:- matchLabelExpressions: - key: topology.pangu.csi.alibabacloud.com/zone values: - zone-1 - zone-2外部 CSI 插件部署后會為每個節點打標,打標內容NodeGetInfo 函數返回的 [AccessibleTopology] 值(詳見 Node Driver Registrar 部分)。
  • External Provisioner在調用 CSI 插件的 CreateVolume 接口之前,會在請求參數設置 AccessibilityRequirements:
  • 對于 WaitForFirstConsumer當 PVC 的 anno 中包含 "volume.kubernetes.io/selected-node" 且不為空,則先獲取對應節點 CSINode 的 TopologyKeys,然后根據該 TopologyKeys 鍵從 Node 資源的 Label 獲取 Values 值,最后拿該 Values 值與 StorageClass 的 AllowedTopologies 比對,判斷其是否包含于其中;若不包含則報錯。
  • 對于 Immediately將 StorageClass 的 AllowedTopologies 的值填進來,若 StorageClass 沒有設置 AllowedTopologies 則將所有包含 TopologyKeys 鍵的節點 Value 添進來。

Scheduler 如何處理使用存儲卷調度

基于社區 1.18 版本調度器

調度器的調度過程主要有如下三步:

  • 預選(Filter):篩選滿足 Pod 調度要求的節點列表。
  • 優選(Score):通過內部的優選算法為節點打分,獲得最高分數的節點即為選中的節點。
  • 綁定(Bind):調度器將調度結果通知給 kube-apiserver,更新 Pod 的 .spec.nodeName 字段。

調度器預選階段:處理 Pod 的 PVC/PV 綁定關系以及動態供應 PV(Dynamic Provisioning),同時使調度器調度時考慮 Pod 所使用 PV 的節點親和性。詳細調度過程如下:

Pod 不包含 PVC 直接跳過。

  • FindPodVolumes獲取 Pod 的 boundClaims、claimsToBind 以及 unboundClaimsImmediate。boundClaims:已 Bound 的 PVCclaimsToBind:PVC 對應 StorageClass 的 VolumeBindingMode 為 VolumeBindingWaitForFirstConsumerunboundClaimsImmediate:PVC 對應 StorageClass 的 VolumeBindingMode 為 VolumeBindingImmediate若 len(unboundClaimsImmediate) 不為空,表示這種 PVC 需要立即綁定 PV(即存 PVC 創建后,立刻動態創建 PV 并將其綁定到 PVC,該過程不走調度),若 PVC 處于 unbound 階段則報錯。若 len(boundClaims) 不為空,則檢查 PVC 對應 PV 的節點親和性與當前節點的 Label 是否沖突,若沖突則報錯(可檢查 Immediate 類型的 PV 拓撲)。若 len(claimsToBind) 不為空先檢查環境中已有的 PV 能否與該 PVC 匹配(findMatchingVolumes),將能夠匹配 PVC 的 PV 記錄在調度器的 cache 中。未匹配到 PV 的 PVC 走動態調度流程,動態調度主要通過 StorageClass 的 AllowedTopologies 字段判斷當前調度節點是否滿足拓撲要求(針對 WaitForFirstConsumer 類型的 PVC)。
  • 調度器優選階段不討論。
  • 調度器 Assume 階段
  • 調度器會先 Assume PV/PVC,再 Assume Pod。
  • 將當前待調度的 Pod 進行深拷貝。
  • AssumePodVolumes(針對 WaitForFirstConsumer 類型的 PVC)更改調度器 cache 中已經 Match 的 PV 信息:設置 annotation:pv.kubernetes.io/bound-by-controller="yes"。更改調度器 cache 中未匹配到 PV 的 PVC,設置 annotation:volume.kubernetes.io/selected-node=【所選節點】。
  • Assume Pod 完畢更改調度器 cache 中 Pod 的 .Spec.NodeName 為【所選節點】。

調度器 Bind 階段

BindPodVolumes:

  • 調用 Kubernetes 的 API 更新集群中 PV/PVC 資源,使其與調度器 Cache 中的 PV/PVC 一致。
  • 檢查 PV/PVC 狀態:檢查所有 PVC 是否已處于 Bound 狀態。檢查所有 PV 的 NodeAffinity 是否與節點 Label 沖突。
  • 調度器執行 Bind 操作:調用 Kubernetes 的 API 更新 Pod 的 .Spec.NodeName 字段。

2. 存儲卷擴容

存儲卷擴容部分在 External Resizer 部分已提到,故不再贅述。用戶只需要編輯 PVC 的 .Spec.Resources.Requests.Storage 字段即可,注意只可擴容不可縮容。

若 PV 擴容失敗,此時 PVC 無法重新編輯 spec 字段的 storage 為原來的值(只可擴容不可縮容)。

3. 單節點卷數量限制

卷數量限制在 Node Driver Registrar 部分已提到,故不再贅述。

4. 存儲卷監控

存儲商需實現 CSI 插件的 NodeGetVolumeStats 接口,Kubelet 會調用該函數,并反映在其 metrics上:

  • kubelet_volume_stats_capacity_bytes:存儲卷容量
  • kubelet_volume_stats_used_bytes:存儲卷已使用容量
  • kubelet_volume_stats_available_bytes:存儲卷可使用容量
  • kubelet_volume_stats_inodes:存儲卷 inode 總量
  • kubelet_volume_stats_inodes_used:存儲卷 inode 使用量
  • kubelet_volume_stats_inodes_free:存儲卷 inode 剩余量

5. Secret

CSI 存儲卷支持傳入 Secret 來處理不同流程中所需要的私密數據,目前 StorageClass 支持如下 Parameter:

  • csi.storage.k8s.io/provisioner-secret-name
  • csi.storage.k8s.io/provisioner-secret-namespace
  • csi.storage.k8s.io/controller-publish-secret-name
  • csi.storage.k8s.io/controller-publish-secret-namespace
  • csi.storage.k8s.io/node-stage-secret-name
  • csi.storage.k8s.io/node-stage-secret-namespace
  • csi.storage.k8s.io/node-publish-secret-name
  • csi.storage.k8s.io/node-publish-secret-namespace
  • csi.storage.k8s.io/controller-expand-secret-name
  • csi.storage.k8s.io/controller-expand-secret-namespace

Secret 會包含在對應 CSI 接口的參數中,如對于 CreateVolume 接口而言則包含在 CreateVolumeRequest.Secrets 中。

6. 塊設備

apiVersion: apps/v1kind: StatefulSetmetadata: name: nginx-examplespec: selector: matchLabels: app: nginx serviceName: "nginx" volumeClaimTemplates: - metadata: name: html spec: accessModes: - ReadWriteOnce volumeMode: Block storageClassName: csi-pangu resources: requests: storage: 40Gi template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx volumeDevices: - devicePath: "/dev/vdb" name: html三方存儲廠商需實現 NodePublishVolume 接口。Kubernetes 提供了針對塊設備的工具包("k8s.io/kubernetes/pkg/util/mount"),在 NodePublishVolume 階段可調用該工具的 EnsureBlock 和 MountBlock 函數。

7. 卷快照/卷克隆能力

鑒于本文篇幅,此處不做過多原理性介紹。讀者感興趣見官方介紹:卷快照、卷克隆。

總結

本文首先對 CSI 核心流程進行了大體介紹,并結合 CSI Sidecar 組件、CSI 接口、API 對象對 CSI 標準進行了深度解析。在 K8s 上,使用任何一種 CSI 存儲卷都離不開上面的流程,環境上的容器存儲問題也一定是其中某個環節出現了問題。本文對其流程進行梳理,以便于廣大程序猿(媛)排查環境問題。

責任編輯:梁菲 來源: 阿里云云棲號
相關推薦

2019-02-14 13:19:40

容器存儲CSI

2021-08-04 16:06:45

DataOps智領云

2023-12-22 19:59:15

2024-09-03 08:40:31

2022-09-22 09:00:46

CSS單位

2018-09-28 14:06:25

前端緩存后端

2022-11-06 21:14:02

數據驅動架構數據

2025-04-03 10:56:47

2018-04-24 09:05:09

容器存儲接口

2018-11-16 10:04:14

云存儲磁帶存儲RAID

2023-11-27 17:35:48

ComponentWeb外層

2023-05-20 17:58:31

低代碼軟件

2022-10-20 08:01:23

2022-07-05 06:30:54

云網絡網絡云原生

2025-10-14 09:01:20

2022-12-01 17:23:45

2021-12-29 18:00:19

無損網絡網絡通信網絡

2022-07-26 00:00:03

語言模型人工智能

2023-08-01 19:11:05

瀏覽器本地存儲
點贊
收藏

51CTO技術棧公眾號

欧美交换国产一区内射| 少妇激情一区二区三区| 欧美一级在线免费观看| 一区在线免费观看| 亚洲免费电影在线观看| 538在线视频观看| 国产丝袜在线| av在线这里只有精品| 国产精品久久久久免费a∨大胸| 国产黄色小视频网站| 国产精品麻豆| 欧美性猛交xxxx黑人猛交| 影音先锋亚洲视频| 少妇人妻精品一区二区三区| 秋霞成人午夜伦在线观看| 久久视频在线视频| 成年人网站免费看| 精品国产亚洲一区二区三区在线| 午夜日韩在线电影| 超碰成人在线免费观看| 污视频在线免费| 精品亚洲porn| 国产激情综合五月久久| 18精品爽视频在线观看| 久久久综合色| 日韩精品极品在线观看播放免费视频 | 911国产网站尤物在线观看| 国产精品酒店视频| 精品在线观看入口| 亚洲国产99精品国自产| 亚洲综合123| 久久精品资源| 欧美在线不卡一区| 国产精品免费观看久久| 国模精品视频| 亚洲一区在线电影| 日韩精品久久一区二区| 国产丝袜在线| 成人免费在线视频| 精品在线视频一区二区三区| 国产强伦人妻毛片| 九色综合狠狠综合久久| 国产精品91久久| 日本中文字幕在线| 亚洲综合日韩| 欧美一区二区色| www.国产高清| 亚洲欧美日韩国产综合精品二区| 欧美激情视频三区| 日韩欧美综合视频| 无需播放器亚洲| 在线视频国产日韩| 亚洲精品国产一区黑色丝袜| 精品精品国产三级a∨在线| 欧美高清性hdvideosex| 蜜桃免费在线视频| 污视频网站免费在线观看| 国产三级一区二区三区| 欧美13一14另类| 五月色婷婷综合| 不卡一区在线观看| 国产精品久久7| 好男人在线视频www| 国产麻豆午夜三级精品| 国产精品自拍小视频| 午夜精品免费观看| 老司机免费视频久久| 51精品在线观看| 久久国产视频一区| 久久久久国产精品午夜一区| 国外成人在线播放| 日韩毛片在线播放| 99日韩精品| 7777免费精品视频| 97人人澡人人爽人人模亚洲| 99热免费精品| 清纯唯美日韩制服另类| 无码视频一区二区三区| 日本在线观看不卡视频| 国产精品激情av在线播放| 国产熟妇一区二区三区四区| 久久久成人网| 国产色视频一区| 中文字幕人妻互换av久久| 久久精品国产一区二区| 成人亚洲综合色就1024| 国产男男gay体育生白袜| 激情综合色综合久久| 91pron在线| 日本人妻熟妇久久久久久| 成人美女在线视频| 久久精品第九区免费观看 | 亚洲欧美制服丝袜| 中文字幕免费高清| 99久久视频| 欧美激情中文网| 国产又黄又猛又粗又爽| 奇米精品一区二区三区四区| 91精品美女在线| 亚洲精品久久久久久无码色欲四季| 成人黄色大片在线观看 | 亚洲va综合va国产va中文| 青草综合视频| 精品成人a区在线观看| 伊人网综合视频| 国产一区二区三区不卡视频网站| 日韩一区在线视频| 国产亚洲欧美久久久久| 日韩国产欧美在线观看| 亚洲专区国产精品| 色欲av永久无码精品无码蜜桃| 久久婷婷一区二区三区| 中文字幕一区二区三区四区五区| 成人免费一区二区三区牛牛| 91成人在线免费观看| 超碰在线免费av| 牛牛精品成人免费视频| 色婷婷成人综合| 日本一本高清视频| 久久 天天综合| 精品无人乱码一区二区三区的优势| jizz在线免费观看| 午夜久久久久久| 在线不卡一区二区三区| 成人涩涩网站| 日韩亚洲欧美中文在线| 一级片中文字幕| 国产乱人伦精品一区二区在线观看| 久久免费99精品久久久久久| 国产视频在线播放| 欧美亚洲图片小说| 日本黄色动态图| 欧美日韩国产探花| 国产欧美日韩高清| 日韩美女一级视频| 午夜精品久久久久久久久久| 亚洲一区二区在线视频观看| 噜噜噜天天躁狠狠躁夜夜精品| 麻豆国产va免费精品高清在线| 亚洲自拍一区在线观看| 国产 欧美在线| 日本黄色a视频| 精品国产欧美日韩一区二区三区| 精品国产第一区二区三区观看体验 | 伊人久久精品视频| 亚洲黄色免费观看| 99re这里只有精品视频首页| 成年人黄色在线观看| 末成年女av片一区二区下载| 亚洲国产黄色片| 九九热只有精品| 国产伦精品一区二区三区在线观看| 日本高清一区| 久久uomeier| 精品网站999www| 青青国产在线观看| 99久久er热在这里只有精品15| 97在线免费视频观看| 国产一区二区三区精品在线观看| www亚洲欧美| 国产精品福利电影| 中文字幕制服丝袜成人av | 欧美一级二级三级乱码| 欧美卡一卡二卡三| 国产福利一区二区三区视频| 国产一二三四五| 亚洲大奶少妇| 欧美激情网友自拍| 国产自产一区二区| 亚洲v中文字幕| 欧美无人区码suv| 国产手机视频一区二区| 欧美激情专区| 国产成人精品亚洲日本在线观看| 日韩电影中文字幕av| 亚洲av无码精品一区二区| 日本一二三四高清不卡| 超碰在线公开97| 久久久久国产精品| 91久久精品一区二区别| 欧美xxx黑人xxx水蜜桃| 欧美精品一区二区三区四区| 动漫精品一区一码二码三码四码| av电影在线观看完整版一区二区| 毛片在线播放视频| 欧美久久精品一级c片| 国产在线不卡精品| 老司机在线看片网av| 亚洲精品在线观看网站| 在线观看日本视频| 中文av一区二区| 911av视频| 99精品视频免费| 天堂资源在线亚洲资源| 99国内精品久久久久| 欧美日本中文字幕| 日本天堂在线| 欧美三级资源在线| 欧美人与禽zozzo禽性配| 久久伊99综合婷婷久久伊| av网站在线不卡| 综合天天久久| 欧美一区二区福利| 精品国产乱码一区二区三区 | 亚洲一区二区三区四区视频| 国产传媒在线播放| 亚洲偷欧美偷国内偷| 97视频免费在线| 欧美午夜宅男影院在线观看| 免费成人深夜蜜桃视频| 成人av电影在线| 深夜黄色小视频| 欧美日韩国产免费观看| 色综合久久av| av成人男女| 国产精品丝袜白浆摸在线| 91九色国产在线播放| 丝袜亚洲另类欧美重口| 免费看av毛片| 3d动漫精品啪啪1区2区免费| 一级片免费网址| 国产精品亲子伦对白| 中文字幕一区二区人妻在线不卡| 国产一区二区三区视频在线播放 | 欧美日韩一区二区三区四区在线观看| 免费在线国产精品| 亚洲国产视频二区| 国产精选久久久久久| 97se综合| 性欧美暴力猛交69hd| 黄a在线观看| 日韩精品免费在线观看| 无码国产伦一区二区三区视频| 制服丝袜av成人在线看| 久久精品国产亚洲av麻豆蜜芽| 亚洲国产精品一区二区尤物区| 在线观看日本黄色| 国产亚洲综合在线| 亚州av综合色区无码一区| 国产精品一二三区| www.久久91| 日韩国产欧美三级| 97公开免费视频| 欧美专区18| 大陆极品少妇内射aaaaa| 欧美婷婷在线| 一级黄色免费在线观看| 日韩aaaa| 三区精品视频观看| 国产一区二区三区四区大秀| yy111111少妇影院日韩夜片| 日韩欧美中文在线观看| 91精品视频在线看| 四虎地址8848精品| 国产精品视频地址| 精品欧美日韩精品| 国产精品7m视频| 国产精品亚洲d| 日本精品中文字幕| 激情久久一区二区| 国产精品美女免费看| 另类中文字幕国产精品| 国产999精品| 国精产品一区二区三区有限公司| 青青草99啪国产免费| 91精品论坛| 国产suv精品一区二区| 午夜影院在线观看国产主播| 97人人爽人人喊人人模波多 | 亚洲精品.www| 精品毛片乱码1区2区3区| 国产综合视频在线| 国产婷婷97碰碰久久人人蜜臀 | 91丨国产丨九色丨pron| 99久久人妻精品免费二区| 波多野结衣中文字幕一区| 国产精品久久无码| 久久精品一区蜜桃臀影院| 我不卡一区二区| 国产精品久久精品日日| 黄色录像一级片| 午夜激情综合网| 亚洲免费黄色网址| 欧美午夜影院一区| 国产绿帽刺激高潮对白| 日韩精品自拍偷拍| 天天干视频在线| 国产午夜精品一区理论片飘花| 在线免费观看黄色网址| 欧美人交a欧美精品| 黄色大片在线播放| 欧美在线激情视频| 国产精品99| 99在线影院| 国产成人3p视频免费观看| 综合国产精品久久久| 一区二区自拍| 中文字幕在线观看第三页| 男人的天堂久久精品| 丰满人妻一区二区三区免费视频棣| 91视频.com| 91香蕉一区二区三区在线观看| 亚洲国产成人91porn| 在线免费观看av网址| 日韩欧美中文字幕一区| 精品三级久久久久久久电影聊斋| 精品国产一区二区三区在线观看| 欧美hdxxxx| 国产精品欧美日韩久久| 电影中文字幕一区二区| 日本不卡高清视频一区| 黄色综合网站| 搡女人真爽免费午夜网站| 懂色av中文一区二区三区| 国产亚洲精品熟女国产成人| 亚洲综合色网站| 在线免费一区二区| 精品国产伦一区二区三区免费| 日本不卡三区| 欧美中文在线观看国产| 欧美精品三级在线| 日韩偷拍一区二区| 亚洲精选一区| 亚洲黄色片免费| 久久蜜桃av一区二区天堂| 视频这里只有精品| 欧美在线观看视频在线| 天天色综合av| 欧美成人激情视频免费观看| 欧美与亚洲与日本直播| 国产亚洲一区二区三区在线播放 | 亚洲第一区第一页| 粗大黑人巨茎大战欧美成人| 国产精品扒开腿爽爽爽视频| 国产乱人伦精品一区| 老汉色影院首页| 美女精品自拍一二三四| 亚洲一二三四五| 亚洲一区二区影院| 99久久久久久久| 播播国产欧美激情| 欧美特黄色片| 日本高清视频一区二区三区| 国产欧美日本| a视频免费观看| 五月激情综合婷婷| 国产精品爽爽久久| 欧美精品一区二区三区国产精品 | 91精品久久久久久| 精品美女久久| 国产亚洲天堂网| 2020国产成人综合网| 国产欧美日韩另类| 91精品国产入口| 快射av在线播放一区| 91精品综合视频| 国产精品x453.com| 日本人69视频| 亚洲欧美综合色| 国产永久免费视频| 日韩在线视频网| 在线视频亚洲欧美中文| 青青草国产免费| 99国产精品国产精品久久| 国产成人无码精品久久久久| 亚洲电影第1页| 国产高清自产拍av在线| 麻豆精品传媒视频| 老牛国产精品一区的观看方式| 日本乱子伦xxxx| 欧美日韩一区中文字幕| 在线视频二区| 99se婷婷在线视频观看| 欧美影院一区| 最近日本中文字幕| 一本久道久久综合中文字幕| 国产在线视频网站| 国产精品视频久久久久| 天天影视欧美综合在线观看| 一级黄色高清视频| 亚洲高清视频在线| 同心难改在线观看| 国产精品视频久久久| 国产成人精品一区二区免费看京| wwwwwxxxx日本| 亚洲午夜激情av| 国产最新视频在线观看| 成人两性免费视频| 亚洲国产高清视频| 久久久久99精品成人| 日韩一区二区在线免费观看| 高潮在线视频| 亚洲视频在线二区| 国产成人鲁色资源国产91色综| 在线能看的av| 久久韩国免费视频| 粉嫩一区二区三区四区公司1| 欧洲精品一区二区三区久久| 国产欧美日韩在线看| 国产女人高潮毛片|