K8s 中的 Pod 在掛載存儲卷時需經歷三個的階段:Provision/Delete(創盤/刪盤)、Attach/Detach(掛接/摘除)和 Mount/Unmount(掛載/卸載)
Provisioning Volumes 時序流程詳解
一、流程圖
sequenceDiagramtitle Provisioning Volumes 時序流程participant 集群管理員participant 用戶participant api-serverparticipant 卷控制器 as 卷控制器(PersistentVolumeController)participant ExternalProvisionerparticipant CSI插件 as CSI插件(Controller)集群管理員->>+api-server: 1 創建 StorageClass 資源(type=cloud_ssd)用戶->>+api-server: 2 創建 PersistentVolumeClaim 資源卷控制器->>+api-server: 3 觀察到 PVC 無匹配 PV<br/>且為 out-of-tree 類型api-server-->>-卷控制器: 返回 PVC 信息卷控制器->>api-server: 4 為 PVC 打 annotationExternalProvisioner->>+api-server: 5 觀察到 PVC annotation 匹配自身api-server-->>-ExternalProvisioner: 返回 PVC 和 StorageClass 參數ExternalProvisioner->>ExternalProvisioner: 6 解析 StorageClass 參數(type=cloud_ssd)ExternalProvisioner->>+CSI插件: 7 通過 Unix Domain Socket 調用<br/>CreateVolume(name=xxx, capacity=10Gi, parameters={type=cloud_ssd})CSI插件->>CSI插件: 8 執行實際存儲創建操作CSI插件-->>-ExternalProvisioner: 9 返回 VolumeID 和 VolumeContextExternalProvisioner->>+api-server: 10 創建 PV 資源<br/>(包含 VolumeID 和 CSI 卷信息)api-server-->>-ExternalProvisioner: PV 創建成功卷控制器->>+api-server: 11 檢測到 PV 和 PVC 可綁定api-server-->>-卷控制器: 返回 PV/PVC 信息卷控制器->>api-server: 12 執行 PV-PVC 綁定操作
二、詳細流程步驟
-
創建 StorageClass 資源
集群管理員向 API Server 提交StorageClass
資源定義(例如type=cloud_ssd
),定義存儲卷的類型、后端插件、參數等配置,為后續動態創建 PV 提供模板。 -
創建 PersistentVolumeClaim(PVC)
用戶通過創建 PVC 聲明所需的存儲資源(如容量、訪問模式等),PVC 會引用步驟1中定義的 StorageClass。 -
卷控制器檢測未綁定 PVC
Kubernetes 內置的 卷控制器(PersistentVolumeController) 持續監聽 PVC 資源,發現未綁定且關聯了 StorageClass 的 PVC(即out-of-tree
類型,依賴外部插件管理的存儲)。 -
為 PVC 打標記
卷控制器為該 PVC 添加特定 Annotation(如volume.beta.kubernetes.io/storage-provisioner
),標識需要外部供應器處理。 -
External Provisioner 監聽并匹配 PVC
external-provisioner
邊車容器持續監聽 PVC 變化,通過 Annotation 匹配到需要自身處理的 PVC,并獲取對應的 PVC 和 StorageClass 配置。 -
解析存儲參數
External Provisioner 解析 StorageClass 中的參數(如type=cloud_ssd
),確定存儲卷的具體配置。 -
調用 CSI 插件創建卷
External Provisioner 通過 Unix Domain Socket 調用 CSI 控制器插件的CreateVolume
接口,傳遞卷名稱、容量、參數等信息。 -
CSI 插件執行實際創建
CSI 控制器插件對接底層存儲(如 AWS EBS、阿里云 EBS 等),通過云 API 或本地存儲接口創建實際存儲卷。 -
返回卷信息
CSI 插件創建成功后,向 External Provisioner 返回卷的唯一標識(VolumeID
)和上下文信息(VolumeContext
)。 -
創建 PV 資源
External Provisioner 基于返回的卷信息,向 API Server 創建 PersistentVolume(PV)資源,PV 中包含 CSI 卷的綁定信息。 -
卷控制器檢測可綁定關系
卷控制器監聽 PV 和 PVC 變化,發現新創建的 PV 與未綁定的 PVC 匹配(容量、訪問模式、StorageClass 等一致)。 -
執行 PV-PVC 綁定
卷控制器通過 API Server 將 PV 與 PVC 綁定,此時 PVC 進入Bound
狀態,用戶 Pod 可通過 PVC 使用該存儲卷。
三、不執行該流程的場景
以下情況不會觸發上述動態卷供應流程,而是采用靜態方式管理存儲卷:
-
靜態創建 PV
若集群管理員已手動創建 PV 并指定存儲卷信息(如已存在的云盤 ID、本地路徑等),且 PV 與 PVC 的參數(容量、訪問模式、StorageClass)匹配,則卷控制器會直接綁定 PV 和 PVC,無需調用 External Provisioner 和 CSI 插件創建卷。 -
PVC 未關聯 StorageClass
若 PVC 未指定storageClassName
,且集群未配置默認 StorageClass,則卷控制器會等待手動創建匹配的 PV,不會觸發動態供應。 -
使用 in-tree 存儲插件
對于 Kubernetes 內置的 in-tree 存儲插件(如kubernetes.io/aws-ebs
,非 CSI 類型),動態供應由 Kubernetes 內部組件直接處理,無需 External Provisioner 和 CSI 插件參與。
四、組件代碼位置與集群部署信息表
組件名稱 | 代碼位置 | 部署命名空間 | 部署形式 | 部署說明 |
---|---|---|---|---|
卷控制器(PersistentVolumeController) | kubernetes/kubernetes/pkg/controller/volume/persistentvolume/ | kube-system | 集成于 kube-controller-manager 靜態 Pod | 作為 kube-controller-manager 的內置組件運行,隨控制平面啟動;控制節點上通過靜態 Pod 配置文件(/etc/kubernetes/manifests/kube-controller-manager.yaml )定義,由 kubelet 自動管理。 |
API Server | kubernetes/kubernetes/pkg/apiserver/ kubernetes/cmd/kube-apiserver/ | kube-system | 獨立靜態 Pod(kube-apiserver ) | 控制平面核心組件,以靜態 Pod 形式部署在控制節點;配置文件位于 /etc/kubernetes/manifests/kube-apiserver.yaml ,通過負載均衡器實現多實例高可用,接收所有集群 API 請求。 |
External Provisioner | github.com/kubernetes-csi/external-provisioner | 與 CSI 插件同命名空間(如 csi-system ) | 邊車容器(Sidecar) | 與 CSI 控制器插件部署在同一 Pod 中,作為輔助容器運行;通過 Unix Domain Socket 與 CSI 插件通信,需配置 RBAC 權限以監聽 PVC、創建 PV 等。 |
CSI 插件(Controller) | 各存儲廠商實現 | 自定義命名空間(如 csi-system 、kube-system ) | Deployment 或 StatefulSet | 以容器化方式部署,包含控制器組件和節點組件;控制器組件需掛載主機的 Unix Domain Socket 目錄(供與 External Provisioner 通信),并配置 ClusterRole 權限以訪問 API 資源。 |
CSI Volume Attach 時序流程詳解
一、流程圖
sequenceDiagramtitle CSI Volume Attach 時序流程participant ADController as AD控制器(AttachDetachController)participant api-serverparticipant ExternalAttacherparticipant CSIDriverparticipant CloudProviderparticipant Node%% 1. AD Controller 監聽 Pod 調度并觸發 AttachADController->>api-server: 監聽 Pod 調度事件api-server-->>ADController: 返回調度到節點的 Pod 列表ADController->>ADController: 計算待 Attach 的 PV 列表(對比節點 status.volumesAttached)ADController->>ADController: 檢查 RWO 卷是否已被其他節點掛載ADController->>api-server: 調用 in-tree CSI 插件的 Attach 函數%% 2. 創建并處理 VolumeAttachment(隱式)ADController->>api-server: 創建 VolumeAttachment 資源ExternalAttacher->>api-server: 監聽 VolumeAttachment 變化api-server-->>ExternalAttacher: 返回新創建的 VA%% 3. External Attacher 調用 CSI 插件ExternalAttacher->>CSIDriver: 調用 ControllerPublishVolume(PV, Node)CSIDriver->>CloudProvider: 調用云 API(如 AWS EBS Attach)CloudProvider-->>CSIDriver: 返回設備 ID(如 /dev/xvdf)CSIDriver-->>ExternalAttacher: 返回掛載成功%% 4. 更新狀態(通過 API Server)ExternalAttacher->>api-server: 更新 VolumeAttachment.status.attached=trueADController->>api-server: 監聽 VA 狀態變化api-server-->>ADController: 返回 VA.status.attached=true%% 5. AD Controller 更新節點狀態ADController->>ADController: 更新內部狀態 (ActualStateOfWorld)ADController->>api-server: 更新 Node.status.volumesAttachedapi-server->>Node: 添加已掛載卷信息api-server-->>ADController: 返回更新成功
二、詳細流程步驟
-
AD 控制器監聽 Pod 調度事件
Kubelet 內置的 AD 控制器(AttachDetachController) 持續監聽集群中 Pod 的調度結果,獲取已調度到本節點的 Pod 列表,識別這些 Pod 聲明的存儲卷需求。 -
計算待掛載卷并檢查沖突
AD 控制器對比節點當前已掛載卷(Node.status.volumesAttached
)與 Pod 所需卷,篩選出未掛載的 PV;同時對ReadWriteOnce (RWO)
類型卷進行沖突檢查,確保同一卷未被其他節點掛載(避免數據不一致)。 -
觸發 Attach 操作并創建 VolumeAttachment
AD 控制器調用內部 in-tree CSI 插件的Attach
函數,通過 API Server 創建VolumeAttachment
資源,記錄卷與節點的綁定關系(包含 PV 標識、目標節點等信息)。 -
External Attacher 監聽并處理 VolumeAttachment
External Attacher
邊車容器持續監聽VolumeAttachment
資源變化,發現新創建的資源后,通過 API Server 獲取卷和節點信息。 -
調用 CSI 插件執行掛載
External Attacher 調用 CSI 驅動的ControllerPublishVolume
接口,傳遞 PV 和目標節點信息;CSI 驅動對接底層云廠商存儲(如 AWS EBS、阿里云 EBS),調用云 API 執行實際的卷掛載操作(如將云盤掛載到目標節點)。 -
云廠商返回掛載結果
云廠商完成卷掛載后,向 CSI 驅動返回設備標識(如/dev/xvdf
),表示卷已成功掛載到節點。 -
更新 VolumeAttachment 狀態
CSI 驅動向 External Attacher 返回掛載成功結果,External Attacher 通過 API Server 將VolumeAttachment.status.attached
更新為true
,標識卷已完成節點級掛載。 -
AD 控制器同步節點狀態
AD 控制器監聽VolumeAttachment
狀態變化,確認掛載成功后更新內部狀態(ActualStateOfWorld
),并通過 API Server 將卷信息添加到Node.status.volumesAttached
中,完成節點存儲狀態的同步。
三、不執行該流程的場景
1. 文件存儲協議(NFS/SMB)
NFS(Network File System)和 SMB(Server Message Block)等網絡文件系統通過文件級協議實現共享,無需將塊設備“Attach”到節點:
- 原理:客戶端直接通過網絡協議(如NFS的RPC、SMB的CIFS)掛載遠程共享目錄,本質是建立文件路徑到本地目錄的邏輯映射,而非塊設備與節點的綁定。
- 差異:無需創建
VolumeAttachment
資源或調用ControllerPublishVolume
接口,直接通過mount
命令或文件系統驅動完成網絡目錄掛載。
2. 對象存儲協議(S3/OSS)
S3(Amazon Simple Storage Service)、阿里云 OSS 等對象存儲服務基于 HTTP/HTTPS API 提供對象訪問,完全不涉及節點級掛載:
- 原理:客戶端通過 RESTful API(如
PUT
/GET
)直接操作對象(文件、圖片等),無需將存儲設備關聯到節點。 - 差異:無塊設備或文件系統掛載過程,通過 SDK 或工具(如
s3fs
)實現對象與本地目錄的映射,但不屬于 CSI Attach 流程范疇。
3. 靜態掛載的本地存儲卷
hostPath
、local
等本地存儲類型的 PV 依賴節點本地文件系統或目錄,無需網絡存儲的 Attach 流程:
- 原理:卷對應的路徑直接存在于節點本地(如
/data/local-vol
),Pod 通過綁定到該節點直接訪問本地路徑。 - 差異:無需云廠商 API 調用或
VolumeAttachment
資源,Kubelet 直接驗證路徑存在性后完成掛載。
4. 已完成掛載的卷復用
若卷已通過 VolumeAttachment
成功掛載到節點(Node.status.volumesAttached
中存在記錄),且未被卸載:
- 原理:新調度到該節點的 Pod 復用已有掛載點,AD 控制器檢測到卷已在節點掛載,跳過重復的 Attach 流程。
- 場景:同一節點上多個 Pod 使用同一 RWX(ReadWriteMany)卷,或同一 RWO 卷被同一節點的 Pod 重新調度。
5. in-tree 存儲插件管理的卷
Kubernetes 內置的 in-tree 存儲插件(如 kubernetes.io/aws-ebs
非 CSI 版本)由內部組件直接處理掛載,無需 External Attacher 參與:
- 原理:掛載邏輯集成于 Kubernetes 核心代碼,通過內部接口調用云廠商 API,不依賴
VolumeAttachment
資源或外部邊車容器。 - 現狀:in-tree 插件正逐步被 CSI 插件替代,但存量集群中仍可能存在此類場景。
總結
“Attach 流程”的核心是塊存儲設備與節點的綁定,依賴 VolumeAttachment
資源和 CSI 插件的協同。而文件存儲、對象存儲、本地存儲等場景因協議設計或實現方式不同,無需通過該流程即可完成存儲訪問,這體現了 Kubernetes 存儲體系對多樣化存儲類型的適配能力。
四、組件代碼位置與集群部署信息表
組件名稱 | 代碼位置 | 部署命名空間 | 部署形式 | 部署說明 |
---|---|---|---|---|
AD 控制器(AttachDetachController) | kubernetes/kubernetes/pkg/kubelet/volumemanager/attachdetach/ | 無獨立命名空間(集成于 Kubelet) | 內置于 Kubelet 進程 | 作為 Kubelet 的核心模塊運行在所有節點(控制節點和工作節點),隨 Kubelet 啟動;負責節點級存儲卷的掛載管理和狀態同步。 |
API Server | kubernetes/kubernetes/pkg/apiserver/ kubernetes/cmd/kube-apiserver/ | kube-system | 獨立靜態 Pod(kube-apiserver ) | 控制平面核心組件,以靜態 Pod 形式部署在控制節點;接收所有資源的 CRUD 請求,存儲 VolumeAttachment 等資源到 etcd。 |
External Attacher | github.com/kubernetes-csi/external-attacher | 與 CSI 驅動同命名空間(如 csi-system ) | 邊車容器(Sidecar) | 與 CSI 驅動部署在同一 Pod 中,通過 Unix Domain Socket 與 CSI 驅動通信;需配置 RBAC 權限以監聽 VolumeAttachment 資源和更新狀態。 |
CSI 驅動(CSIDriver) | 各存儲廠商實現(如 aws-ebs-csi-driver) | 自定義命名空間(如 csi-system ) | Deployment 或 DaemonSet | 控制器組件以 Deployment 部署(處理掛載調度),節點組件以 DaemonSet 部署(處理本地設備映射);需掛載主機路徑(如 /dev 、/var/lib/kubelet )與存儲設備交互。 |
云廠商存儲服務(CloudProvider) | 云廠商自研實現(如 AWS EBS SDK、阿里云 EBS SDK) | 無(集群外部服務) | 云廠商托管服務 | 獨立于 Kubernetes 集群的外部服務,通過 API 接口接收 CSI 驅動的掛載請求,負責底層存儲設備的節點級掛載操作。 |
Node 組件 | kubernetes/kubernetes/pkg/kubelet/ | 無獨立命名空間(節點級進程) | 內置于 Kubelet 節點狀態 | 節點狀態(Node.status.volumesAttached )由 Kubelet 維護,通過 API Server 同步集群狀態;存儲卷掛載點在節點本地路徑(如 /var/lib/kubelet/pods/<pod-id>/volumes/ )。 |
CSI 存儲卷節點掛載(Node Mount)時序流程詳解
一、流程圖
sequenceDiagramtitle CSI 存儲卷節點掛載時序流程participant VolumeManager as Volume Manager<br/>(Kubelet 組件)participant InTreeCSIAttacher as in-tree CSI 插件<br/>(csiAttacher)participant InTreeCSIMountMgr as in-tree CSI 插件<br/>(csiMountMgr)participant api-serverparticipant ExternalCSIPlugin as 外部 CSI 插件participant Host as 主機節點participant Container as 容器%% 前置條件:Node 已處于 Ready 狀態Note over Host: Node 已達到 Ready 狀態<br/>存儲卷在主機內可見%% 1. Volume Manager 觸發節點級存儲準備流程VolumeManager->>InTreeCSIAttacher: 1. 調用 WaitForAttach 函數<br/>(等待卷 Attach 完成)InTreeCSIAttacher->>api-server: 2. 監聽 VolumeAttachment 對象狀態api-server-->>InTreeCSIAttacher: 3. 返回 VolumeAttachment.status.attached=true%% 2. 執行 NodeStageVolume (分區格式化)InTreeCSIAttacher->>InTreeCSIAttacher: 4. 確認卷已 Attach 成功InTreeCSIAttacher->>ExternalCSIPlugin: 5. 通過 Unix Socket 調用<br/>NodeStageVolume 接口<br/>(分區格式化操作)ExternalCSIPlugin->>Host: 6. 執行存儲卷分區、格式化Host-->>ExternalCSIPlugin: 7. 分區格式化完成ExternalCSIPlugin-->>InTreeCSIAttacher: 8. 返回 Stage 成功<br/>(Volume Ready 狀態)Note over ExternalCSIPlugin: Volume Ready 狀態<br/>(完成分區格式化)%% 3. 執行 NodePublishVolume (掛載至容器目錄)InTreeCSIAttacher->>InTreeCSIMountMgr: 9. 調用 SetUp 函數<br/>(觸發容器掛載流程)InTreeCSIMountMgr->>ExternalCSIPlugin: 10. 通過 Unix Socket 調用<br/>NodePublishVolume 接口<br/>(掛載至容器目錄)ExternalCSIPlugin->>Host: 11. 將存儲卷掛載至容器指定目錄Host-->>ExternalCSIPlugin: 12. 掛載操作完成ExternalCSIPlugin-->>InTreeCSIMountMgr: 13. 返回 Publish 成功<br/>(Published 狀態)Note over ExternalCSIPlugin: Published 狀態<br/>(已掛載至容器目錄)%% 4. 容器訪問存儲卷InTreeCSIMountMgr-->>VolumeManager: 14. 通知存儲卷準備完成VolumeManager->>Container: 15. 容器啟動并訪問掛載目錄Note over Container: 存儲卷可用 (容器內可見)
二、詳細流程步驟
-
等待卷 Attach 完成
Kubelet 內置的 Volume Manager 負責節點級存儲卷的生命周期管理,當檢測到使用 CSI 卷的 Pod 調度到本節點后,首先調用內部 in-tree CSI 插件(csiAttacher
)的WaitForAttach
函數,確保卷已通過 Attach 流程綁定到節點。 -
監聽 VolumeAttachment 狀態
csiAttacher
通過 API Server 持續監聽VolumeAttachment
資源的狀態變化,等待其status.attached
變為true
,確認卷已成功掛載到節點(如塊設備已通過云 API 關聯到主機)。 -
執行 NodeStageVolume(分區格式化)
卷 Attach 完成后,csiAttacher
調用外部 CSI 插件的NodeStageVolume
接口:- 外部 CSI 插件對節點級存儲卷執行分區(如 GPT 分區)和格式化(如
mkfs.ext4
)操作,將原始塊設備轉換為可掛載的文件系統。 - 完成后,卷進入 Volume Ready 狀態,表示已具備掛載到容器的基礎條件。
- 外部 CSI 插件對節點級存儲卷執行分區(如 GPT 分區)和格式化(如
-
觸發容器掛載流程
csiAttacher
調用內部 in-tree CSI 插件(csiMountMgr
)的SetUp
函數,將存儲卷從“節點級可用”推進到“容器級可用”,準備將卷掛載到 Pod 的指定目錄。 -
執行 NodePublishVolume(容器目錄掛載)
csiMountMgr
通過 Unix Domain Socket 調用外部 CSI 插件的NodePublishVolume
接口:- 外部 CSI 插件將已格式化的卷(或網絡共享目錄)掛載到容器的指定路徑(如
/var/lib/kubelet/pods/<pod-id>/volumes/kubernetes.io~csi/<pv-name>/mount
)。 - 掛載過程可能涉及綁定掛載(
bind mount
)、權限設置(如chmod
)或掛載選項配置(如ro
只讀)。 - 完成后,卷進入 Published 狀態,表示已成功掛載到容器的目標目錄。
- 外部 CSI 插件將已格式化的卷(或網絡共享目錄)掛載到容器的指定路徑(如
-
通知存儲卷準備完成
csiMountMgr
向 Volume Manager 反饋掛載成功,Volume Manager 確認存儲卷就緒后,允許容器啟動并訪問掛載目錄。 -
容器訪問存儲卷
容器啟動后,通過 Pod 定義中指定的volumeMounts
路徑訪問存儲卷,此時卷已完全集成到容器的文件系統中,用戶數據可通過容器讀寫存儲卷。
三、不執行該流程的場景
以下情況不會觸發上述節點掛載流程,存儲卷通過其他方式完成容器訪問:
-
網絡文件系統(NFS/SMB)
NFS、SMB 等基于文件共享的存儲卷無需分區格式化:- 原理:遠程共享目錄已提前格式化,節點直接通過網絡協議(如 NFS v4、CIFS)掛載目錄,無需
NodeStageVolume
操作。 - 差異:
NodePublishVolume
僅執行網絡目錄到容器路徑的綁定掛載,跳過塊設備相關的分區格式化步驟。
- 原理:遠程共享目錄已提前格式化,節點直接通過網絡協議(如 NFS v4、CIFS)掛載目錄,無需
-
對象存儲映射(S3/OSS)
S3、OSS 等對象存儲通過工具(如s3fs
)映射為本地目錄時:- 原理:通過 FUSE(用戶態文件系統)將對象接口轉換為目錄結構,無需塊設備或傳統文件系統格式化。
- 差異:
NodeStageVolume
可能被跳過,NodePublishVolume
直接掛載 FUSE 映射的目錄。
-
臨時存儲卷(emptyDir/ephemeral)
節點本地臨時卷(如emptyDir
)依賴主機臨時目錄:- 原理:直接使用節點本地路徑(如
/var/lib/kubelet/pods/<pod-id>/volumes/kubernetes.io~empty-dir/
),無需 CSI 插件參與。 - 差異:整個流程由 Kubelet 內部處理,不涉及
NodeStageVolume
或NodePublishVolume
調用。
- 原理:直接使用節點本地路徑(如
-
只讀卷復用已有掛載點
若卷已通過NodePublishVolume
掛載到節點且為只讀模式(ro
):- 原理:新 Pod 復用同一掛載點,通過綁定掛載將只讀卷映射到不同容器目錄,無需重復執行格式化和掛載流程。
- 場景:多個 Pod 共享同一 RWX 只讀卷,或同一 RWO 卷被同一節點的 Pod 重新使用。
四、組件代碼位置與集群部署信息表
組件名稱 | 代碼位置 | 部署命名空間 | 部署形式 | 部署說明 |
---|---|---|---|---|
Volume Manager | kubernetes/kubernetes/pkg/kubelet/volumemanager/ | 無獨立命名空間(集成于 Kubelet) | 內置于 Kubelet 進程 | 作為 Kubelet 的核心模塊運行在所有節點,負責協調卷的 Attach、掛載和卸載流程,通過控制循環監聽 Pod 和卷狀態變化。 |
in-tree CSI 插件(csiAttacher/csiMountMgr) | kubernetes/kubernetes/pkg/volume/csi/ | 無獨立命名空間(集成于 Kubelet) | 內置于 Kubelet 代碼 | Kubelet 內置的 CSI 適配層,負責橋接 Kubelet 與外部 CSI 插件,實現 WaitForAttach 、SetUp 等接口的邏輯轉發。 |
外部 CSI 插件(External CSI Plugin) | 各存儲廠商實現(如 csi-driver-nfs) | 自定義命名空間(如 csi-system ) | DaemonSet(節點插件) | 以 DaemonSet 形式部署在所有節點,通過 Unix Domain Socket(如 /var/lib/kubelet/plugins/<driver-name>/csi.sock )提供 NodeStageVolume 和 NodePublishVolume 接口,直接操作節點存儲設備。 |
API Server | kubernetes/kubernetes/pkg/apiserver/ kubernetes/cmd/kube-apiserver/ | kube-system | 獨立靜態 Pod | 控制平面核心組件,存儲 VolumeAttachment 資源并提供狀態查詢接口,支持 Kubelet 和 CSI 插件的監聽操作。 |
Host 節點 | 操作系統內核/工具(如 mount 、mkfs ) | 無(節點本地) | 節點操作系統組件 | 提供存儲卷的物理掛載點(如 /dev 設備、/var/lib/kubelet 目錄),執行分區、格式化和掛載命令,是存儲卷實際運行的硬件載體。 |
Container 容器 | 應用鏡像/容器運行時(如 containerd) | 應用所屬命名空間 | Pod 中的容器實例 | 通過容器運行時的掛載命名空間隔離,訪問綁定掛載的存儲卷目錄,感知不到底層 CSI 插件的操作細節。 |