本文已超過一年。較舊的文章可能包含過時的內容。請檢查頁面中的資訊自發布以來是否已變得不正確。

Kubernetes 中的動態佈建和儲存類別

編輯註記:這篇文章是關於 Kubernetes 1.6 新功能的深入文章系列的一部分

儲存是執行具狀態容器的關鍵部分,而 Kubernetes 提供了強大的基本元件來管理它。動態磁碟區佈建是 Kubernetes 獨有的功能,允許按需建立儲存磁碟區。在動態佈建之前,叢集管理員必須手動呼叫其雲端或儲存供應商來佈建新的儲存磁碟區,然後建立 PersistentVolume 物件以在 Kubernetes 中表示它們。透過動態佈建,這兩個步驟都自動化了,消除了叢集管理員預先佈建儲存的需求。相反,可以使用 StorageClass 物件指定的佈建器動態佈建儲存資源(請參閱 使用者指南)。StorageClass 本質上是藍圖,可以抽象化底層儲存供應商以及其他參數,例如磁碟類型(例如;固態磁碟與標準磁碟)。

StorageClass 使用特定於儲存平台或雲端供應商的佈建器,以使 Kubernetes 能夠存取正在使用的實體媒體。樹狀結構中提供了幾個儲存佈建器(請參閱 使用者指南),但現在也支援樹狀結構外的佈建器(請參閱 kubernetes-incubator)。

Kubernetes 1.6 版本中,動態佈建已升級為穩定版(在 1.4 中進入 Beta 版)。這是完成 Kubernetes 儲存自動化願景的一大步,它允許叢集管理員控制資源的佈建方式,並讓使用者能夠更專注於他們的應用程式。憑藉所有這些優勢,在使用 Kubernetes 1.6 之前,有一些重要的使用者介面變更(如下所述)需要理解

Storage Class 和如何使用它們

StorageClass 是動態佈建的基礎,允許叢集管理員為底層儲存平台定義抽象概念。使用者只需在使用 “storageClassName” 參數的 PersistentVolumeClaim (PVC) 中按名稱引用 StorageClass 即可。

在以下範例中,PVC 引用了名為 “gold” 的特定儲存類別。

apiVersion: v1

kind: PersistentVolumeClaim

metadata:

 name: mypvc

 namespace: testns

spec:

 accessModes:

 - ReadWriteOnce

 resources:

   requests:

     storage: 100Gi

 storageClassName: gold

為了促進動態佈建的使用,此功能允許叢集管理員指定預設 StorageClass。當存在時,使用者可以建立 PVC 而無需指定 storageClassName,進一步減少使用者了解底層儲存供應商的責任。使用預設 StorageClass 時,在建立 PersistentVolumeClaim (PVC) 時,需要注意一些操作上的細微之處。如果您已經有想要重複使用的現有 PersistentVolume (PV),則這一點尤其重要

  • 已經「綁定」到 PVC 的 PV 在遷移到 1.6 後仍將保持綁定

    • 除非使用者手動添加,否則它們不會與 StorageClass 關聯
    • 如果 PV 變成「可用」(即;如果您刪除 PVC 並且相應的 PV 被回收),則它們將受到以下影響
  • 如果在 PVC 中未指定 storageClassName,則預設儲存類別將用於佈建。

    • 不具有預設儲存類別標籤的現有「可用」PV 將不被考慮用於綁定到 PVC
  • 如果在 PVC 中 storageClassName 設定為空字串 (‘’),則不會使用儲存類別(即;此 PVC 的動態佈建已停用)

    • 不具有指定 storageClassName 的現有「可用」PV 將被考慮用於綁定到 PVC
  • 如果 storageClassName 設定為特定值,則將使用相符的儲存類別

    • 具有相符 storageClassName 的現有「可用」PV 將被考慮用於綁定到 PVC
    • 如果不存在對應的儲存類別,則 PVC 將失敗。為了減輕在叢集中設定預設 StorageClass 的負擔,從 1.6 開始,Kubernetes (透過附加元件管理器) 為幾個雲端供應商安裝了預設儲存類別。若要使用這些預設 StorageClass,使用者不需要按名稱引用它們 – 也就是說,PVC 中不需要指定 storageClassName。

下表提供了有關雲端供應商預先安裝的預設儲存類別以及這些預設使用的特定參數的更多詳細資訊。

雲端供應商預設 StorageClass 名稱預設佈建器
Amazon Web Servicesgp2aws-ebs
Microsoft Azurestandardazure-disk
Google Cloud Platformstandardgce-pd
OpenStackstandardcinder
VMware vSpherethinvsphere-volume

雖然選擇這些預先安裝的預設儲存類別對於大多數儲存使用者來說是「合理的」,但 本指南 提供了有關如何指定您自己的預設值的說明。

動態佈建的磁碟區和回收策略

所有 PV 都具有與之關聯的回收策略,該策略規定了 PV 從宣告中釋放後會發生什麼情況(請參閱 使用者指南)。由於動態佈建的目標是完全自動化儲存資源的生命週期,因此動態佈建磁碟區的預設回收策略為「delete」。這表示,預設情況下,當 PersistentVolumeClaim (PVC) 釋放時,動態佈建的磁碟區將在儲存供應商上取消佈建(刪除),並且資料很可能無法檢索。如果這不是所需的行為,則使用者必須在佈建磁碟區後變更對應 PersistentVolume (PV) 物件上的回收策略。

如何變更動態佈建磁碟區上的回收策略?

您可以透過編輯 PV 物件並將 “persistentVolumeReclaimPolicy” 欄位變更為所需的值來變更回收策略。有關各種回收策略的更多資訊,請參閱 使用者指南

常見問題

如何使用預設 StorageClass?

如果您的叢集具有滿足您需求的預設 StorageClass,那麼您只需要建立 PersistentVolumeClaim (PVC),預設佈建器就會處理剩下的事情 – 無需指定 storageClassName

apiVersion: v1

kind: PersistentVolumeClaim

metadata:

 name: mypvc

 namespace: testns

spec:

 accessModes:

 - ReadWriteOnce

 resources:

   requests:

     storage: 100Gi

我可以新增自己的儲存類別嗎?
可以。若要新增您自己的儲存類別,請先確定哪些佈建器可以在您的叢集中運作。然後,建立一個 StorageClass 物件,其參數已自訂以滿足您的需求(有關更多詳細資訊,請參閱使用者指南)。對於許多使用者來說,建立物件最簡單的方法是編寫一個 yaml 檔案並使用 “kubectl create -f” 應用它。以下是 Google Cloud Platform 的 StorageClass 範例,名為 “gold”,它建立了一個 “pd-ssd”。由於叢集中可以存在多個類別,因此管理員可以將預設值保持啟用狀態以用於大多數工作負載(因為它使用 “pd-standard”),而 “gold” 類別則保留給需要額外效能的工作負載。

kind: StorageClass

apiVersion: storage.k8s.io/v1

metadata:

 name: gold

provisioner: kubernetes.io/gce-pd

parameters:

 type: pd-ssd

如何檢查我是否已安裝預設 StorageClass?

您可以使用 kubectl 檢查 StorageClass 物件。在下面的範例中,有兩個儲存類別:“gold” 和 “standard”。“gold” 類別是使用者定義的,而 “standard” 類別是由 Kubernetes 安裝的,並且是預設值。

$ kubectl get sc

NAME                 TYPE

gold                 kubernetes.io/gce-pd   

standard (default)   kubernetes.io/gce-pd
$ kubectl describe storageclass standard

Name:     standard

IsDefaultClass: Yes

Annotations: storageclass.beta.kubernetes.io/is-default-class=true

Provisioner: kubernetes.io/gce-pd

Parameters: type=pd-standard

Events:         \<none\>

我可以刪除/關閉預設 StorageClass 嗎?
您無法刪除提供的預設儲存類別物件。由於它們是作為叢集附加元件安裝的,因此如果刪除它們,它們將被重新建立。

但是,您可以透過移除(或設定為 false)以下註解來停用預設行為:storageclass.beta.kubernetes.io/is-default-class。

如果沒有以預設註解標記的 StorageClass 物件,則 PersistentVolumeClaim 物件(未指定 StorageClass)將不會觸發動態佈建。相反,它們將退回到綁定到可用 PersistentVolume 物件的舊版行為。

我可以將現有的 PV 分配給特定的 StorageClass 嗎?
可以,您可以透過編輯適當的 PV 物件並將所需的 storageClassName 欄位新增(或設定)到其中,將 StorageClass 分配給現有的 PV。

如果我刪除 PersistentVolumeClaim (PVC) 會發生什麼事?
如果磁碟區是動態佈建的,則預設回收策略設定為「delete」。這表示,預設情況下,當 PVC 被刪除時,底層 PV 和儲存資產也將被刪除。如果您想保留儲存在磁碟區上的資料,則必須在佈建 PV 後將回收策略從「delete」變更為「retain」。