全部產品
Search
文件中心

Container Service for Kubernetes:儲存基礎知識

更新時間:Dec 20, 2025

本文為您介紹Kubernetes容器儲存相關的基礎知識,方便您全面地認識和運用Container Service的儲存功能。

Volume

容器中的檔案在磁碟上是臨時存放的,當容器重建時,容器中的檔案將會丟失,所以Kubernetes定義了儲存卷Volume以解決容器中的檔案因容器重啟而丟失的問題。Volume是Pod與外部存放裝置進行資料傳遞的通道,也是Pod與內部容器間、Pod與Pod間、Pod與外部環境進行資料共用的方式。

Volume定義了外置儲存的細節,並內嵌到Pod中作為Pod的一部分。其本質是外置儲存在Kubernetes系統的一個資源地圖,當負載需要使用外置儲存時,可以從Volume中查到相關資訊並進行掛載操作。

說明

Volume生命週期和Pod一致,即Pod被刪除時,Volume本身可能會被刪除,但Volume中的資料是否保留,取決於Volume的類型以及配置。

您在ACK可以使用的常用Volume類型如下:

類型

描述

本機存放區

適用於本機存放區的儲存卷,例如hostPath、emptyDir等。本機存放區卷的資料儲存在叢集特定節點上,並且不能隨著應用遷移,節點停機時,資料將不再可用。

網路儲存

適用於網路儲存的儲存卷,例如Ceph、GlusterFS、NFS、iSCSI等。網路儲存卷的資料不在叢集的某個節點上,而是在遠端的儲存服務上,使用儲存卷時需將儲存服務掛載至本地使用。

Secret和ConfigMap

Secret和ConfigMap是特殊的儲存卷,其資料是叢集的一些對象資訊,該對象資料以卷的形式被掛載到節點上供應用使用。

PVC

一種儲存卷定義方式,將儲存卷抽象成一個獨立於Pod的對象,這個對象定義(關聯)的儲存資訊即儲存卷對應的真正儲存資訊,供Kubernetes負載掛載使用。

Volume使用說明

  • 一個Pod可以掛載多個Volume,但不建議給一個Pod掛載過多的Volume儲存卷。

  • 一個Pod可以掛載多種類型的Volume。

  • 每個被Pod掛載的Volume,可以在不同的容器間共用。

  • 對於需要持久化的資料,Kubernetes環境推薦使用PVC和PV方式掛載Volume。

PV和PVC

並非所有Volume都具有持久化特性,為了實現持久化的儲存,容器儲存需依賴於一個遠程儲存服務。Kubernetes引入了PV和PVC兩個資來源物件,將儲存實現的細節從其如何被使用中抽象出來,從而讓使用者不用關心具體的基礎設施,當需要儲存資源時,聲明所需的儲存需求即可。

PV(PersistentVolume)

PV持久化儲存卷,表示具體儲存類型的卷,用於定義儲存實現的細節,例如,具體儲存類型、儲存卷參數,目標儲存資源所有相關的資訊都儲存在PV中,Kubernetes引用PV中的儲存資訊進行掛載。您可以直接建立PV,通過靜態卷的方式掛載,也可以建立StorageClass,由CSI的Provisioner組件動態建立PV進行掛載。

說明

PV是一個叢集層級的概念,其對象作用範圍是整個Kubernetes叢集,而不是一個節點。PV擁有獨立的生命週期,不依附於Pod。

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-example
spec:
  capacity:
    storage: 20Gi # 容量大小可以根據實際雲端硬碟大小填寫
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  csi:
    driver: diskplugin.csi.alibabacloud.com
    volumeHandle: <雲端硬碟ID>
  volumeMode: Filesystem

PVC(PersistentVolumeClaim)

PVC儲存聲明,表示Pod所需使用的持久化儲存請求。例如,Volume儲存大小、可讀寫權限等。PVC申請會消耗PV儲存資源。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-example
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi
  volumeName: pv-example

PV和PVC使用說明

PVC與PV是一一對應關係,不能一個PVC掛載多個PV,也不能一個PV掛載多個PVC。為應用配置儲存時,需要聲明一個儲存需求聲明(PVC),而Kubernetes會通過首選的方式選擇一個滿足PVC需求的PV,並與之綁定。PVC只有綁定了PV之後才能被Pod使用。滿足以下規則的PV才能被PVC綁定:

  • VolumeMode:被消費PV的VolumeMode需要和PVC一致。

  • AccessMode:被消費PV的AccessMode需要和PVC一致。

  • StorageClassName:如果PVC定義了此參數,PV必須有相關的參數定義才能進行綁定。

  • LabelSelector:通過標籤(Labels)匹配的方式從PV列表中選擇合適的PV綁定。

  • storage:被消費PV的capacity必須大於或者等於PVC的儲存容量需求才能被綁定。

PV和PVC中定義storage的作用:

  • PVC、PV綁定時,會根據各自的storage進行篩選。

  • 通過PVC、StorageClass動態建立PV時,例如,雲端硬碟會參考PVC的storage建立相應大小的PV和後端儲存。

  • 對於支援Resize操作的儲存類型,PVC的storage作為擴容後PV、後端儲存的容量值。

真正的儲存卷資料流寫資料時,不會參考PVC和PV的storage欄位,而是依賴底層儲存介質的實際容量。

Volume訪問模式

您可以通過accessModes來定義Volume儲存卷的訪問模式。

ReadWriteOnce(RWO)

Volume可以被一個節點以讀寫方式掛載,例如阿里雲雲端硬碟。

ReadOnlyMany(ROX)

Volume可以被多個節點以唯讀方式掛載,例如阿里雲OSS。

ReadWriteMany(RWX)

Volume可以被多個節點以讀寫方式掛載,例如阿里雲NAS檔案系統。

如何在Pod中掛載Volume

靜態儲存卷

image

靜態儲存卷是由管理員建立的PV,阿里雲雲端硬碟、NAS和OSS儲存介質都支援通過靜態儲存卷的方式使用。

  1. 靜態儲存卷由叢集管理員分析叢集中儲存需求,並預先分配一些儲存介質(例如雲端硬碟、NAS等)。

  2. 管理員根據儲存實際情況,手工預先建立若干個PV對象,並定義好每個PV可以提供的具體儲存能力,等待PVC來消費。

  3. 使用者根據業務實際情況,建立PVC用於聲明Pod運行所需的儲存能力。

  4. 如果工作負載中定義了PVC需求,Pod在建立過程中,Kubernetes會通過相關規則完成PVC和匹配的PV進行綁定,實現應用對儲存服務的訪問。

動態儲存裝置卷

image

動態儲存裝置卷是指通過儲存外掛程式Provisioner自動建立的PV,阿里雲雲端硬碟、NAS和OSS儲存介質都支援通過動態儲存裝置卷的方式使用。

  1. 動態儲存裝置卷由叢集管理員配置好後端的儲存池,選擇不同的Provisioner,以建立不同的儲存類型。例如diskplugin.csi.alibabacloud.com表示使用阿里雲雲端硬碟的Provisioner外掛程式。

  2. 管理員無需手工分配PV,根據儲存配置相應的StorageClass,等待PVC來消費。

  3. 使用者根據業務實際情況,建立PVC用於聲明Pod運行所需的儲存能力,同時,在該PVC中聲明需通過哪個StorageClass來處理該PVC的請求。

  4. 如果工作負載中定義了PVC需求,Pod在建立過程中,Kubernetes會依據該PVC中關聯的StorageClass的儲存細節,由儲存外掛程式Provisioner動態建立一個PV,實現應用對儲存服務的訪問。

使用動態儲存裝置卷的優勢:

  • 動態儲存裝置卷讓Kubernetes實現了PV的自動化生命週期管理,PV的建立、刪除都通過Provisioner完成。

  • 自動化建立PV對象,減少了配置複雜度和叢集管理員的工作量。

  • 動態儲存裝置卷可以實現PVC對儲存的需求容量和Provisioner輸出的PV容量一致,實現儲存容量規劃最優。

StorageClass

StorageClass用於定義儲存的類別,提供動態分配儲存卷的能力,您可以為其設定不同的參數,使儲存資源能夠根據需求自動供應和調整。在PVC儲存聲明中添加StorageClassName欄位,當PVC在叢集中找不到匹配的PV時,將根據StorageClassName的定義觸發相應的Provisioner組件自動建立合適的PV以及底層儲存,即建立動態儲存裝置卷,減少了建立和維護PV的工作量。下文以阿里雲盤為例介紹如何自訂StorageClass儲存類。更多關於雲端硬碟、NAS和OSS的自訂儲存類及參數說明,請參見使用雲端硬碟動態儲存裝置卷使用NAS動態儲存裝置卷使用OSS動態儲存裝置卷

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: alicloud-disk-topology-alltype
provisioner: diskplugin.csi.alibabacloud.com
parameters:
  type: cloud_auto,cloud_essd,cloud_ssd,cloud_efficiency
  fstype: ext4
  diskTags/a: b
  encrypted: "false"
  performanceLevel: PL1
  provisionedIops: "40000"
  burstingEnabled: "false"
reclaimPolicy: Delete
allowVolumeExpansion: true
volumeBindingMode: WaitForFirstConsumer  

主要參數說明

參數

說明

provisioner

儲存資源供應商。支援配置如下:

  • diskplugin.csi.alibabacloud.com:表示使用阿里雲雲端硬碟Provisioner外掛程式建立StorageClass。

  • nasplugin.csi.alibabacloud.com:表示使用阿里雲NAS Provisioner外掛程式建立StorageClass。

  • ossplugin.csi.alibabacloud.com:表示使用阿里雲OSS Provisioner外掛程式建立StorageClass。

parameters

儲存資源雲端硬碟的參數設定。

reclaimPolicy

儲存資源雲端硬碟的回收策略,預設為Delete,支援Retain

  • Delete:刪除PVC時,PV和雲端硬碟會一起刪除。

  • Retain:刪除PVC時,PV和雲端硬碟不會被刪除,需要您手動刪除。

如果資料安全性要求高,推薦使用Retain方式,以免誤刪資料。

allowVolumeExpansion

配置為true時,可以實現雲端硬碟的自動擴容。

volumeBindingMode

雲端硬碟的繫結模式。預設為Immediate,支援WaitForFirstConsumer

  • Immediate:表示先建立雲端硬碟再調度Pod。

  • WaitForFirstConsumer:延遲綁定,即調度器先調度Pod,並根據Pod的可用性區域資訊建立雲端硬碟。推薦在多可用性區域叢集中使用。

展開查看延遲綁定WaitForFirstConsumer說明

儲存資源(例如阿里雲雲端硬碟)不支援跨可用性區域掛載,使用時可能產生如下問題:

  • 建立了A可用性區域的儲存卷,但是A可用性區域的節點資源已耗盡,導致Pod啟動失敗,無法掛載。

  • 叢集管理員在規劃PVC、PV的時候不能確定在哪些可用性區域建立多個PV作為備用。

volumeBindingMode參數用於解決此問題,將volumeBindingMode配置為WaitForFirstConsumer時,表示儲存外掛程式Provisioner在收到PVC Pending時,不會立即建立PV儲存卷,而是等待該PVC被Pod消費時才執行建立流程。

實現原理

儲存外掛程式Provisioner在收到PVC Pending狀態的時候不會立即進行儲存卷建立,而是等待該PVC被Pod消費。若有Pod消費此PVC,調度器在識別該PVC屬於延遲繫結模式後,會繼續執行調度操作,並將調度結果通過patch命令寫入PVC的metadata中。Provisioner檢測到PVC中已寫入的調度資訊後,會根據調度資訊擷取建立目標儲存卷的位置資訊(地區和節點資訊),然後觸發PV的建立流程。

預設StorageClass

Kubernetes提供預設StorageClass機制,在PVC未指定StorageClassName的情況下,您可以通過預設StorageClass建立儲存卷。更多資訊,請參見Default StorageClass

由於預設StorageClass會對所有PVC起作用,對於具備不同類型儲存卷能力的叢集,需謹慎使用。例如,您想產生一個NAS類型PVC、PV,並綁定PVC和PV,但可能因為有預設StorageClass而自動建立了雲端硬碟PV。ACK叢集沒有提供預設StorageClass,如果您期望使用預設StorageClass,可以參考以下配置。

  1. 配置預設StorageClass。

    執行以下命令將StorageClass(alicloud-disk-topology-alltype)配置為一個預設StorageClass。

    說明

    此處以alicloud-disk-topology-alltype為例進行說明,

    kubectl annotate storageclass alicloud-disk-topology-alltype storageclass.kubernetes.io/is-default-class=true

    此時,查詢叢集中的StorageClass可以看到alicloud-disk-topology-alltype名字後面加了(default)字樣。

    kubectl get sc

    返回結果如下:

    NAME                                        PROVISIONER                       AGE
    alicloud-disk-topology-alltype (default)    diskplugin.csi.alibabacloud.com   96m
  2. 使用預設StorageClass。

    1. 使用以下模板建立一個沒有配置StorageClass的PVC。

      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: disk-pvc
      spec:
        accessModes:
        - ReadWriteOnce
        resources:
          requests:
            storage: 20Gi

      叢集會自動建立一個雲端硬碟儲存卷(PV),且配置了預設StorageClass(alicloud-disk-topology-alltype)。

      kubectl get pvc

      返回結果如下:

      NAME       STATUS   VOLUME                   CAPACITY   ACCESS MODES    STORAGECLASS                      AGE
      disk-pvc   Bound    d-bp18pbai447qverm****   20Gi       RWO             alicloud-disk-topology-alltype    49s

您可以通過以下命令取消預設儲存類型的配置。

kubectl annotate storageclass alicloud-disk-topology-alltype storageclass.kubernetes.io/is-default-class-

Container Service for Kubernetes的StorageClass模板說明

StorageClass

匹配的儲存卷類型

說明

alicloud-disk-efficiency

高效雲端硬碟

上一代雲端硬碟

alicloud-disk-ssd

SSD雲端硬碟

上一代雲端硬碟

alicloud-disk-essd

ESSD雲端硬碟

通過該StorageClass預設建立的為PL1層級的ESSD雲端硬碟。

alicloud-disk-topology-alltype

提供高可用選項,優先建立ESSD雲端硬碟。

  • 如果ESSD雲端硬碟售盡或當前節點不支援ESSD雲端硬碟,則嘗試建立SSD雲端硬碟。

  • 如果SSD雲端硬碟售罄或當前節點不支援SSD雲端硬碟,則嘗試建立高效雲端硬碟。

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: alicloud-disk-topology-alltype
    parameters:
      type: cloud_essd,cloud_ssd,cloud_efficiency
    provisioner: diskplugin.csi.alibabacloud.com
    reclaimPolicy: Delete
    allowVolumeExpansion: true
    volumeBindingMode: WaitForFirstConsumer

多可用性區域情境推薦

alibabacloud-cnfs-nas

建立叢集時,可預設建立CNFS託管的NAS儲存類,通過CNFS託管NAS使用時,可直接使用該儲存類。更多資訊,請參見使用CNFS管理NAS儲存卷

CNFS託管NAS使用情境

相關文檔

關於Container Service for Kubernetes儲存相關的更多資訊,請參見儲存