您好,登錄后才能下訂單哦!
怎樣解析容器存儲接口CSI,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
下面將將重點放在 CSI(Container Storage Interface)容器存儲接口上,探究什么是 CSI 及其內部工作原理。
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 組件及其接口之前,我們先對 K8s 中 CSI 存儲流程進行一個介紹。《一文讀懂 K8s 持久化存儲流程》一文介紹了 K8s 中的 Pod 在掛載存儲卷時需經歷三個的階段:Provision/Delete(創盤/刪盤)、Attach/Detach(掛接/摘除)和 Mount/Unmount(掛載/卸載),下面以圖文的方式講解 K8s 在這三個階段使用 CSI 的流程。
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 進行綁定。
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 上。
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 函數。
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 函數。
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 上已沒有相關掛接信息。
1.用戶刪除相關 PVC。
2.External Provisioner 組件觀察到 PVC 刪除事件,根據 PVC 的回收策略(Reclaim)執行不同操作:
Delete:調用外部 CSI 插件的DeleteVolume 函數以刪除卷;一旦卷成功刪除,Provisioner會刪除集群中對應 PV 對象。
Retain:Provisioner不執行卷刪除操作。
為使 K8s 適配 CSI 標準,社區將與 K8s 相關的存儲流程邏輯放在了 CSI Sidecar 組件中。
Node-Driver-Registrar 組件會將外部 CSI 插件注冊到Kubelet,從而使Kubelet通過特定的 Unix Domain Socket 來調用外部 CSI 插件函數(Kubelet 會調用外部 CSI 插件的 NodeGetInfo、NodeStageVolume、NodePublishVolume、NodeGetVolumeStats 等函數)。
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 值)。
創建/刪除實際的存儲卷,以及代表存儲卷的 PV 資源。
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 資源。
掛接/摘除存儲卷。
**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 名稱]。
擴容存儲卷。
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 接口實現文件系統擴容。
檢查 CSI 插件是否正常。
通過對外暴露一個 / healthz HTTP 端口以服務 kubelet 的探針探測器,內部是通過特定的 Unix Domain Socket 調用外部 CSI 插件的 Probe 接口。
三方存儲廠商需實現 CSI 插件的三大接口:IdentityServer、ControllerServer、NodeServer。
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) }
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) }
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 對象:
CSINode
CSIDriver
VolumeAttachment
apiVersion: storage.k8s.io/v1beta1 kind: CSINode metadata: name: node-10.212.101.210 spec: 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 調度時選擇合適的存儲節點。
apiVersion: storage.k8s.io/v1beta1 kind: CSIDriver metadata: name: pangu.csi.alibabacloud.com spec: # 插件是否支持卷掛接(VolumeAttach) attachRequired: true # Mount階段是否CSI插件需要Pod信息 podInfoOnMount: true # 指定CSI支持的卷模式 volumeLifecycleModes: - Persistent
作用:
簡化外部 CSI 插件的發現。由集群管理員創建,通過 kubectl get csidriver 即可得知環境上有哪些 CSI 插件。
自定 義Kubernetes 行為,如一些外部 CSI 插件不需要執行卷掛接(VolumeAttach)操作,則可以設置 .spec.attachRequired 為 false。
apiVersion: storage.k8s.io/v1 kind: VolumeAttachment metadata: annotations: csi.alpha.kubernetes.io/node-id: 21481ae252a2457f9abcb86a3d02ba05 finalizers: - external-attacher/pangu-csi-alibabacloud-com name: csi-0996e5e9459e1ccc1b3a7aba07df4ef7301c8e283d99eabc1b69626b119ce750 spec: attacher: pangu.csi.alibabacloud.com nodeName: node-10.212.101.241 source: persistentVolumeName: pangu-39aa24e7-8877-11eb-b02f-021234350de1 status: attached: true
作用:VolumeAttachment 記錄了存儲卷的掛接/摘除信息以及節點信息。
在 StorageClass 中有 AllowedTopologies 字段:
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: csi-pangu provisioner: pangu.csi.alibabacloud.com parameters: type: cloud_ssd volumeBindingMode: Immediate allowedTopologies: - 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 添進來。
基于社區 1.18 版本調度器
調度器的調度過程主要有如下三步:
預選(Filter):篩選滿足 Pod 調度要求的節點列表。
優選(Score):通過內部的優選算法為節點打分,獲得最高分數的節點即為選中的節點。
綁定(Bind):調度器將調度結果通知給 kube-apiserver,更新 Pod 的 .spec.nodeName 字段。
調度器預選階段:處理 Pod 的 PVC/PV 綁定關系以及動態供應 PV(Dynamic Provisioning),同時使調度器調度時考慮 Pod 所使用 PV 的節點親和性。詳細調度過程如下:
Pod 不包含 PVC 直接跳過。
FindPodVolumes
先檢查環境中已有的 PV 能否與該 PVC 匹配(findMatchingVolumes),將能夠匹配 PVC 的 PV 記錄在調度器的 cache 中。
未匹配到 PV 的 PVC 走動態調度流程,動態調度主要通過 StorageClass 的 AllowedTopologies 字段判斷當前調度節點是否滿足拓撲要求(針對 WaitForFirstConsumer 類型的 PVC)。
boundClaims:已 Bound 的 PVC
claimsToBind:PVC 對應 StorageClass 的 VolumeBindingMode 為 VolumeBindingWaitForFirstConsumer
unboundClaimsImmediate:PVC 對應 StorageClass 的 VolumeBindingMode 為 VolumeBindingImmediate
獲取 Pod 的 boundClaims、claimsToBind 以及 unboundClaimsImmediate。
若 len(unboundClaimsImmediate) 不為空,表示這種 PVC 需要立即綁定 PV(即存 PVC 創建后,立刻動態創建 PV 并將其綁定到 PVC,該過程不走調度),若 PVC 處于 unbound 階段則報錯。
若 len(boundClaims) 不為空,則檢查 PVC 對應 PV 的節點親和性與當前節點的 Label 是否沖突,若沖突則報錯(可檢查 Immediate 類型的 PV 拓撲)。
若 len(claimsToBind) 不為空
調度器優選階段不討論。
調度器 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 字段。
存儲卷擴容部分在 External Resizer 部分已提到,故不再贅述。用戶只需要編輯 PVC 的 .Spec.Resources.Requests.Storage 字段即可,注意只可擴容不可縮容。
若 PV 擴容失敗,此時 PVC 無法重新編輯 spec 字段的 storage 為原來的值(只可擴容不可縮容)。參考 K8s 官網提供的 PVC 還原方法: https://kubernetes.io/docs/concepts/storage/persistent-volumes/#recovering-from-failure-when-expanding-volumes
卷數量限制在 Node Driver Registrar 部分已提到,故不再贅述。
存儲商需實現 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 剩余量
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 中。
apiVersion: apps/v1 kind: StatefulSet metadata: name: nginx-example spec: 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 函數。
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。