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

Kubernetes 中的動態製備和儲存類

編者注:本文是關於 Kubernetes 1.6 新功能的一系列深度文章的一部分

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

StorageClass 使用特定於儲存平臺或雲提供商的供應器,為 Kubernetes 提供對所使用的物理介質的訪問。樹內提供了多個儲存供應器(請參閱使用者指南),但現在也支援樹外供應器(請參閱kubernetes-incubator)。

Kubernetes 1.6 版本中,動態儲存供應已升級為穩定版(在 1.4 版本中進入測試版)。這是完成 Kubernetes 儲存自動化願景的一大步,它允許叢集管理員控制資源的供應方式,並讓使用者能夠更多地關注其應用程式。儘管有所有這些好處,但在使用 Kubernetes 1.6 之前,有一些重要的面向使用者的更改(如下所述)需要了解

StorageClass 及其使用方法

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

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

apiVersion: v1

kind: PersistentVolumeClaim

metadata:

 name: mypvc

 namespace: testns

spec:

 accessModes:

 - ReadWriteOnce

 resources:

   requests:

     storage: 100Gi

 storageClassName: gold

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

  • 已“繫結”到 PVC 的 PV 在升級到 1.6 後將保持繫結

    • 除非使用者手動新增,否則它們將沒有關聯的 StorageClass
    • 如果 PV 變為“可用”(即,如果您刪除 PVC 並且相應的 PV 被回收),則它們將受到以下限制:
  • 如果在 PVC 中未指定 storageClassName,則預設儲存類將用於供應

    • 沒有預設儲存類標籤的現有“可用”PV 將不被考慮繫結到 PVC
  • 如果在 PVC 中將 storageClassName 設定為空字串 (‘‘),則不會使用任何儲存類(即,此 PVC 的動態供應已停用)

    • 現有“可用”PV(未指定 storageClassName)將被考慮繫結到 PVC
  • 如果 storageClassName 設定為特定值,則將使用匹配的儲存類

    • 具有匹配 storageClassName 的現有“可用”PV 將被考慮繫結到 PVC
    • 如果沒有相應的儲存類存在,PVC 將會失敗。為了減少在叢集中設定預設 StorageClass 的負擔,從 1.6 版本開始,Kubernetes(透過附加元件管理器)為幾個雲提供商安裝了預設儲存類。要使用這些預設 StorageClass,使用者不需要按名稱引用它們——也就是說,不需要在 PVC 中指定 storageClassName。

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

雲提供商預設 StorageClass 名稱預設供應器
亞馬遜網路服務gp2aws-ebs
微軟 Azure標準版azure-disk
谷歌雲平臺標準版gce-pd
OpenStack標準版cinder
VMware vSpherevsphere-volume

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

動態供應的卷和回收策略

所有 PV 都具有關聯的回收策略,該策略規定了 PV 從宣告中釋放後會發生什麼(請參閱使用者指南)。由於動態供應的目標是完全自動化儲存資源的生命週期,因此動態供應卷的預設回收策略是“刪除”。這意味著當 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 上名為“gold”的 StorageClass 示例,它建立了一個“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) 會發生什麼?
如果卷是動態供應的,則預設回收策略設定為“刪除”。這意味著,預設情況下,當 PVC 被刪除時,底層 PV 和儲存資產也將被刪除。如果您想保留儲存在捲上的資料,則必須在 PV 供應後將回收策略從“刪除”更改為“保留”。