k8s之持久化存儲流程

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 綁定操作

二、詳細流程步驟

  1. 創建 StorageClass 資源
    集群管理員向 API Server 提交 StorageClass 資源定義(例如 type=cloud_ssd),定義存儲卷的類型、后端插件、參數等配置,為后續動態創建 PV 提供模板。

  2. 創建 PersistentVolumeClaim(PVC)
    用戶通過創建 PVC 聲明所需的存儲資源(如容量、訪問模式等),PVC 會引用步驟1中定義的 StorageClass。

  3. 卷控制器檢測未綁定 PVC
    Kubernetes 內置的 卷控制器(PersistentVolumeController) 持續監聽 PVC 資源,發現未綁定且關聯了 StorageClass 的 PVC(即 out-of-tree 類型,依賴外部插件管理的存儲)。

  4. 為 PVC 打標記
    卷控制器為該 PVC 添加特定 Annotation(如 volume.beta.kubernetes.io/storage-provisioner),標識需要外部供應器處理。

  5. External Provisioner 監聽并匹配 PVC
    external-provisioner 邊車容器持續監聽 PVC 變化,通過 Annotation 匹配到需要自身處理的 PVC,并獲取對應的 PVC 和 StorageClass 配置。

  6. 解析存儲參數
    External Provisioner 解析 StorageClass 中的參數(如 type=cloud_ssd),確定存儲卷的具體配置。

  7. 調用 CSI 插件創建卷
    External Provisioner 通過 Unix Domain Socket 調用 CSI 控制器插件的 CreateVolume 接口,傳遞卷名稱、容量、參數等信息。

  8. CSI 插件執行實際創建
    CSI 控制器插件對接底層存儲(如 AWS EBS、阿里云 EBS 等),通過云 API 或本地存儲接口創建實際存儲卷。

  9. 返回卷信息
    CSI 插件創建成功后,向 External Provisioner 返回卷的唯一標識(VolumeID)和上下文信息(VolumeContext)。

  10. 創建 PV 資源
    External Provisioner 基于返回的卷信息,向 API Server 創建 PersistentVolume(PV)資源,PV 中包含 CSI 卷的綁定信息。

  11. 卷控制器檢測可綁定關系
    卷控制器監聽 PV 和 PVC 變化,發現新創建的 PV 與未綁定的 PVC 匹配(容量、訪問模式、StorageClass 等一致)。

  12. 執行 PV-PVC 綁定
    卷控制器通過 API Server 將 PV 與 PVC 綁定,此時 PVC 進入 Bound 狀態,用戶 Pod 可通過 PVC 使用該存儲卷。

三、不執行該流程的場景

以下情況不會觸發上述動態卷供應流程,而是采用靜態方式管理存儲卷:

  1. 靜態創建 PV
    若集群管理員已手動創建 PV 并指定存儲卷信息(如已存在的云盤 ID、本地路徑等),且 PV 與 PVC 的參數(容量、訪問模式、StorageClass)匹配,則卷控制器會直接綁定 PV 和 PVC,無需調用 External Provisioner 和 CSI 插件創建卷。

  2. PVC 未關聯 StorageClass
    若 PVC 未指定 storageClassName,且集群未配置默認 StorageClass,則卷控制器會等待手動創建匹配的 PV,不會觸發動態供應。

  3. 使用 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 Serverkubernetes/kubernetes/pkg/apiserver/
kubernetes/cmd/kube-apiserver/
kube-system獨立靜態 Pod(kube-apiserver控制平面核心組件,以靜態 Pod 形式部署在控制節點;配置文件位于 /etc/kubernetes/manifests/kube-apiserver.yaml,通過負載均衡器實現多實例高可用,接收所有集群 API 請求。
External Provisionergithub.com/kubernetes-csi/external-provisioner與 CSI 插件同命名空間(如 csi-system邊車容器(Sidecar)與 CSI 控制器插件部署在同一 Pod 中,作為輔助容器運行;通過 Unix Domain Socket 與 CSI 插件通信,需配置 RBAC 權限以監聽 PVC、創建 PV 等。
CSI 插件(Controller)各存儲廠商實現自定義命名空間(如 csi-systemkube-systemDeployment 或 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: 返回更新成功

二、詳細流程步驟

  1. AD 控制器監聽 Pod 調度事件
    Kubelet 內置的 AD 控制器(AttachDetachController) 持續監聽集群中 Pod 的調度結果,獲取已調度到本節點的 Pod 列表,識別這些 Pod 聲明的存儲卷需求。

  2. 計算待掛載卷并檢查沖突
    AD 控制器對比節點當前已掛載卷(Node.status.volumesAttached)與 Pod 所需卷,篩選出未掛載的 PV;同時對 ReadWriteOnce (RWO) 類型卷進行沖突檢查,確保同一卷未被其他節點掛載(避免數據不一致)。

  3. 觸發 Attach 操作并創建 VolumeAttachment
    AD 控制器調用內部 in-tree CSI 插件的 Attach 函數,通過 API Server 創建 VolumeAttachment 資源,記錄卷與節點的綁定關系(包含 PV 標識、目標節點等信息)。

  4. External Attacher 監聽并處理 VolumeAttachment
    External Attacher 邊車容器持續監聽 VolumeAttachment 資源變化,發現新創建的資源后,通過 API Server 獲取卷和節點信息。

  5. 調用 CSI 插件執行掛載
    External Attacher 調用 CSI 驅動的 ControllerPublishVolume 接口,傳遞 PV 和目標節點信息;CSI 驅動對接底層云廠商存儲(如 AWS EBS、阿里云 EBS),調用云 API 執行實際的卷掛載操作(如將云盤掛載到目標節點)。

  6. 云廠商返回掛載結果
    云廠商完成卷掛載后,向 CSI 驅動返回設備標識(如 /dev/xvdf),表示卷已成功掛載到節點。

  7. 更新 VolumeAttachment 狀態
    CSI 驅動向 External Attacher 返回掛載成功結果,External Attacher 通過 API Server 將 VolumeAttachment.status.attached 更新為 true,標識卷已完成節點級掛載。

  8. 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. 靜態掛載的本地存儲卷

hostPathlocal本地存儲類型的 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 Serverkubernetes/kubernetes/pkg/apiserver/
kubernetes/cmd/kube-apiserver/
kube-system獨立靜態 Pod(kube-apiserver控制平面核心組件,以靜態 Pod 形式部署在控制節點;接收所有資源的 CRUD 請求,存儲 VolumeAttachment 等資源到 etcd。
External Attachergithub.com/kubernetes-csi/external-attacher與 CSI 驅動同命名空間(如 csi-system邊車容器(Sidecar)與 CSI 驅動部署在同一 Pod 中,通過 Unix Domain Socket 與 CSI 驅動通信;需配置 RBAC 權限以監聽 VolumeAttachment 資源和更新狀態。
CSI 驅動(CSIDriver)各存儲廠商實現(如 aws-ebs-csi-driver)自定義命名空間(如 csi-systemDeployment 或 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: 存儲卷可用 (容器內可見)

二、詳細流程步驟

  1. 等待卷 Attach 完成
    Kubelet 內置的 Volume Manager 負責節點級存儲卷的生命周期管理,當檢測到使用 CSI 卷的 Pod 調度到本節點后,首先調用內部 in-tree CSI 插件(csiAttacher)的 WaitForAttach 函數,確保卷已通過 Attach 流程綁定到節點。

  2. 監聽 VolumeAttachment 狀態
    csiAttacher 通過 API Server 持續監聽 VolumeAttachment 資源的狀態變化,等待其 status.attached 變為 true,確認卷已成功掛載到節點(如塊設備已通過云 API 關聯到主機)。

  3. 執行 NodeStageVolume(分區格式化)
    卷 Attach 完成后,csiAttacher 調用外部 CSI 插件的 NodeStageVolume 接口:

    • 外部 CSI 插件對節點級存儲卷執行分區(如 GPT 分區)和格式化(如 mkfs.ext4)操作,將原始塊設備轉換為可掛載的文件系統。
    • 完成后,卷進入 Volume Ready 狀態,表示已具備掛載到容器的基礎條件。
  4. 觸發容器掛載流程
    csiAttacher 調用內部 in-tree CSI 插件(csiMountMgr)的 SetUp 函數,將存儲卷從“節點級可用”推進到“容器級可用”,準備將卷掛載到 Pod 的指定目錄。

  5. 執行 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 狀態,表示已成功掛載到容器的目標目錄。
  6. 通知存儲卷準備完成
    csiMountMgr 向 Volume Manager 反饋掛載成功,Volume Manager 確認存儲卷就緒后,允許容器啟動并訪問掛載目錄。

  7. 容器訪問存儲卷
    容器啟動后,通過 Pod 定義中指定的 volumeMounts 路徑訪問存儲卷,此時卷已完全集成到容器的文件系統中,用戶數據可通過容器讀寫存儲卷。

三、不執行該流程的場景

以下情況不會觸發上述節點掛載流程,存儲卷通過其他方式完成容器訪問:

  1. 網絡文件系統(NFS/SMB)
    NFS、SMB 等基于文件共享的存儲卷無需分區格式化:

    • 原理:遠程共享目錄已提前格式化,節點直接通過網絡協議(如 NFS v4、CIFS)掛載目錄,無需 NodeStageVolume 操作。
    • 差異:NodePublishVolume 僅執行網絡目錄到容器路徑的綁定掛載,跳過塊設備相關的分區格式化步驟。
  2. 對象存儲映射(S3/OSS)
    S3、OSS 等對象存儲通過工具(如 s3fs)映射為本地目錄時:

    • 原理:通過 FUSE(用戶態文件系統)將對象接口轉換為目錄結構,無需塊設備或傳統文件系統格式化。
    • 差異:NodeStageVolume 可能被跳過,NodePublishVolume 直接掛載 FUSE 映射的目錄。
  3. 臨時存儲卷(emptyDir/ephemeral)
    節點本地臨時卷(如 emptyDir)依賴主機臨時目錄:

    • 原理:直接使用節點本地路徑(如 /var/lib/kubelet/pods/<pod-id>/volumes/kubernetes.io~empty-dir/),無需 CSI 插件參與。
    • 差異:整個流程由 Kubelet 內部處理,不涉及 NodeStageVolumeNodePublishVolume 調用。
  4. 只讀卷復用已有掛載點
    若卷已通過 NodePublishVolume 掛載到節點且為只讀模式(ro):

    • 原理:新 Pod 復用同一掛載點,通過綁定掛載將只讀卷映射到不同容器目錄,無需重復執行格式化和掛載流程。
    • 場景:多個 Pod 共享同一 RWX 只讀卷,或同一 RWO 卷被同一節點的 Pod 重新使用。

四、組件代碼位置與集群部署信息表

組件名稱代碼位置部署命名空間部署形式部署說明
Volume Managerkubernetes/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 插件,實現 WaitForAttachSetUp 等接口的邏輯轉發。
外部 CSI 插件(External CSI Plugin)各存儲廠商實現(如 csi-driver-nfs)自定義命名空間(如 csi-systemDaemonSet(節點插件)以 DaemonSet 形式部署在所有節點,通過 Unix Domain Socket(如 /var/lib/kubelet/plugins/<driver-name>/csi.sock)提供 NodeStageVolumeNodePublishVolume 接口,直接操作節點存儲設備。
API Serverkubernetes/kubernetes/pkg/apiserver/
kubernetes/cmd/kube-apiserver/
kube-system獨立靜態 Pod控制平面核心組件,存儲 VolumeAttachment 資源并提供狀態查詢接口,支持 Kubelet 和 CSI 插件的監聽操作。
Host 節點操作系統內核/工具(如 mountmkfs無(節點本地)節點操作系統組件提供存儲卷的物理掛載點(如 /dev 設備、/var/lib/kubelet 目錄),執行分區、格式化和掛載命令,是存儲卷實際運行的硬件載體。
Container 容器應用鏡像/容器運行時(如 containerd)應用所屬命名空間Pod 中的容器實例通過容器運行時的掛載命名空間隔離,訪問綁定掛載的存儲卷目錄,感知不到底層 CSI 插件的操作細節。

請添加圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/89549.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/89549.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/89549.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python學智能算法(二十四)|SVM-最優化幾何距離的理解

引言 前序學習過程中&#xff0c;已經對幾何距離的概念有了認知&#xff0c;學習鏈接為&#xff1a;幾何距離 這里先來回憶幾何距離δ的定義&#xff1a; δmin?i1...myi(w∥w∥?xib∥w∥)\delta \min_{i1...m}y_{i}(\frac{w}{\left \| w \right \|}\cdot x_{i}\frac{b}{\le…

創建游戲或互動體驗:從概念到實現的完整指南

Hi&#xff0c;我是布蘭妮甜 &#xff01;在數字時代&#xff0c;游戲和互動體驗已成為娛樂、教育和商業領域的重要組成部分。本文將帶你了解如何使用JavaScript創建引人入勝的游戲和互動體驗&#xff0c;從基礎概念到實際實現。 文章目錄一、游戲開發基礎1.1 游戲循環1.2 游戲…

SpringMVC + Tomcat10

1. Tomcat 10的servlet包路徑變了&#xff0c;javax -> jakarta 2. DispatcherServlet從Spring6 才開始使用jakarta.servlet.http.Servlet 3. Spring6 需要JDK 17 1. pom <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org…

Django `transaction.atomic()` 完整使用指南

目錄 #概述#基本用法#事務一致性保障機制#破壞一致性的常見場景#高級用法#最佳實踐#診斷與調試#附錄 概述 transaction.atomic() 是 Django 提供的數據庫事務管理工具&#xff0c;用于確保一系列數據庫操作要么全部成功提交&#xff0c;要么全部回滾&#xff0c;維護數據的一致…

UDP協議的端口161怎么檢測連通性

UDP 端口 161 (SNMP) 連通性檢測的專業指南 UDP 161 端口是 SNMP (Simple Network Management Protocol) 服務的標準端口。由于其無連接特性&#xff0c;檢測需要特殊方法。以下是全面的檢測方案&#xff1a; 一、專業檢測方法 1. 使用 SNMP 專用工具&#xff08;推薦&#xff…

進階數據結構:紅黑樹

嘿&#xff0c;各位技術潮人&#xff01;好久不見甚是想念。生活就像一場奇妙冒險&#xff0c;而編程就是那把超酷的萬能鑰匙。此刻&#xff0c;陽光灑在鍵盤上&#xff0c;靈感在指尖跳躍&#xff0c;讓我們拋開一切束縛&#xff0c;給平淡日子加點料&#xff0c;注入滿滿的pa…

如何上傳github(解決git的時候輸入正確的賬號密碼,但提示認證失敗)

如何上傳github文件&#xff0c;刪除文件 1.重點 GitHub 從 2021 年 8 月 13 日起移除了對密碼認證的支持。你需要使用個人訪問令牌(Personal Access Token, PAT)或 SSH 密鑰來進行認證。 2.生成SSH key 進入設置點擊New SSH Key名字隨便取&#xff0c;可以自己方便記3.上傳文件…

多級緩存架構與熱點探測系統核心技術解析

多級緩存架構與熱點探測系統核心技術解析 &#x1f4cc; 一、多級緩存架構 1. 為什么需要多級緩存&#xff1f; ? 本地緩存優勢&#xff1a; &#x1f680; 減少網絡請求&#xff0c;提升訪問性能&#x1f310; 分布式系統中天然具有分布式緩存特性?? 有效降低遠程緩存&…

iOS 性能監控工具全解析 選擇合適的調試方案提升 App 性能

在iOS應用開發中&#xff0c;性能往往是決定用戶體驗的關鍵因素之一。用戶體驗的優劣&#xff0c;不僅取決于功能的實現&#xff0c;還在于流暢度、響應速度、資源消耗等方面的表現。因此&#xff0c;性能監控工具在iOS開發中的重要性不可小覷。 無論是提升應用的啟動時間、減少…

C++ :vector的介紹和使用

vector學習時一定要學會查看reference 目錄 前言 一、vector基本概念 1.1vector是什么&#xff1f; 1.2內存管理 二、vector的使用 2.1vector的構造 2.2vector iterator 的使用 2.3vector 空間增長問題 2.4vector的元素訪問 2.5vector 增刪查改 總結 前言 在C編程中&#x…

iOS OC 圖片壓縮

純代碼,不廢話,歡迎copy使用,記得點贊 +(NSData *)imageData:(UIImage *)image maxSize:(int)maxSize{ // 設置最大文件大小(200KB) NSLog(@"執行壓縮方案 期望壓縮目標%dk",maxSize); return [self compressImage:image toMaxSize:maxSize]; } // 主壓縮方…

如何更改 SQLserver 數據庫存儲的位置 想從C盤換到D盤

在 SQL Server 中更改數據庫存儲位置&#xff08;從 C 盤遷移到 D 盤&#xff09;需要通過以下步驟完成&#xff1a;1. 確定數據庫文件的當前位置首先查詢數據庫文件的當前路徑&#xff1a;sqlSELECT name, physical_name AS current_location FROM sys.master_files WHERE dat…

【unitrix】 6.8 加一運算(add_one.rs)

一、源碼 這是一個使用 Rust 類型系統實現二進制數加一操作的代碼。 use crate::number::{O, I, B, Null, Bit, NormalizeIf};/// 類型級加一操作 trait /// /// 為二進制數類型實現加一操作&#xff0c;返回新的類型 pub trait AddOne {/// 加一操作的結果類型type Output;//…

國內Ubuntu訪問不了github、 huggingface等

各位小伙伴們&#xff0c;大家好呀。 大家是不是經常遇到訪問不了github、huggingface的情況呀。 在Ubuntu中可以這樣做。 訪問這個網站網站測速-Ping檢測-Trace查詢-Dig查詢-路由跟蹤查詢-tools.ipip.net&#xff0c; 對于github.com&#xff0c;在這個網站輸入github.com…

「Java EE開發指南」如何用MyEclipse創建企業應用項目?(一)

由于有了項目模型和管理工具&#xff0c;現在可以創建Java EE企業應用程序。在本文中您將了解到&#xff1a; 企業應用項目模型項目組織、依賴關系和類解析 該特性在MyEclipse中可用。 MyEclipse v2025.1離線版下載 1. 企業應用項目模型 MyEclipse提供了一個企業應用程序項…

ubuntu 22.04 pam 模塊設置用戶登錄失敗鎖定

1、ubuntu 22.04 配置方法 /etc/pam.d/common-auth 加到如下行后 # auth [success1 defaultignore] pam_unix.so nullok # 添加如下內容 auth [defaultdie] pam_faillock.so authfail auth sufficient pam_faillock.so authsucc/etc/pam.d/common…

Linux 定時任務全解析:atd 與 crond 的區別及實戰案例(含日志備份 + 時間寫入)

1. atd 和 crond 兩個任務管理程序的區別atd&#xff1a;用于執行一次性的定時任務&#xff0c;即設置任務在某個特定的時間點僅執行一次 &#xff0c;適合處理不需要重復執行的定時操作&#xff0c;比如在未來某個確切時間執行一個腳本、發送一份文件等場景。crond&#xff1a…

iOS加固工具有哪些?項目場景下的組合策略與實戰指南

在如今的iOS項目中&#xff0c;“加固”不僅是單一手段&#xff0c;更是多工具協同應用的過程。不同項目場景對安全要求的側重點不同&#xff0c;需要針對性地組合加固工具&#xff0c;才能最大化兼顧安全性、兼容性與效率。 本文將從常見項目場景出發&#xff0c;分析當下市面…

Xilinx Zynq:一款適用于軟件定義無線電的現代片上系統

摘要——軟件定義無線電可以在通用處理器 (CPU) 上實現&#xff0c;例如基于 PC 的處理器。處理器具有高度靈活性&#xff1a;它不僅可以用來處理數據樣本&#xff0c;還可以控制接收器功能、顯示瀑布圖或運行解調軟件。然而&#xff0c;由于處理速度相對較慢&#xff0c;處理器…

接口黑洞?破!安全堡壘?筑!冰火煉獄?戰!MES7114W終極掌控

在工業4.0加速推進的時代&#xff0c;設備互聯正面臨三大關鍵挑戰&#xff1a;多協議接口的“通信割裂”、極端環境的嚴苛考驗&#xff0c;以及高危場景下的安全紅線。在礦山井下、冶金車間、化工廠區等惡劣環境中&#xff0c;傳統有線方案往往受限于高成本布線、維護困難和環境…