Azure Kubernetes Service (AKS) 中的應用程式適用的儲存體選項
在 Azure Kubernetes Service (AKS) 中執行的應用程式可能會需要儲存和擷取資料。 雖然某些應用程式工作負載可以在不需要、清空的節點上使用本機、快速的儲存體,但其他工作負載則需要在 Azure 平台內保存於較一般資料磁碟區的儲存體。
可能會需要多個 Pod:
- 共用相同的資料磁碟區。
- 如果 Pod 於不同節點上進行重新排程,則重新連結資料磁碟區。
您可能也需要收集敏感性資料或應用程式組態資訊,並將其儲存到 Pod 中。
本文將介紹為 AKS 中的應用程式提供儲存體的核心概念:
暫時 OS 磁片
根據預設,Azure 會自動將虛擬機器的作業系統磁片複寫至 Azure 儲存體,以避免 VM 重新放置到另一部主機時遺失資料。 不過,由於容器並非設計為保存本機狀態,因此此行為會提供有限的值,同時提供一些缺點。 這些缺點包括,但不限於較慢的節點布建和更高的讀取/寫入延遲。
相較之下,暫時性 OS 磁碟只會儲存在主機電腦上,就像暫存磁碟一樣。 使用此設定時,您會獲得較低的讀取/寫入延遲,以及更快的節點調整和叢集升級。
注意
當您未明確要求 OS 的 Azure 受控磁片 時,如果指定的節點集區組態可能的話,AKS 會預設為暫時 OS。
Azure VM 檔中提供暫時 OS 磁片的大小需求和建議。 以下是一些一般調整大小考慮:
如果您選擇使用 AKS 預設 VM 大小 ,Standard_DS2_v2 SKU 的預設 OS 磁片大小為 100 GiB,則預設 VM 大小支援暫時 OS,但只有 86 GiB 的快取大小。 如果您未明確指定,此設定會預設為受控磁碟。 如果您要求暫時 OS,您會收到驗證錯誤。
如果您使用 60-GiB OS 磁片要求相同的 Standard_DS2_v2 SKU,此設定會預設為暫時 OS。 要求的 60 GiB 大小小於 86 GiB 的快取大小上限。
如果您選取具有 100 GB OS 磁片 的 Standard_D8s_v3 SKU,此 VM 大小支援暫時 OS,且快取空間為 200 GiB。 如果您未指定 OS 磁碟類型,則節點集區預設會收到暫時性 OS。
最新一代的 VM 系列沒有專用快取,但只有暫存儲存體。 例如,如果您選取預設 OS 磁片大小為 100 GiB 的 Standard_E2bds_v5 VM 大小,則它支援暫時 OS 磁片,但只有 75 GB 的暫存儲存體。 如果您未明確指定,此設定會預設為受控 OS 磁碟。 如果您要求暫時 OS 磁片,您會收到驗證錯誤。
如果您使用 60-GiB OS 磁片要求相同的 Standard_E2bds_v5 VM 大小,此設定預設為暫時 OS 磁片。 要求的 60 GiB 大小小於 75 GiB 的暫存儲存體上限。
如果您選取具有 100-GiB OS 磁片 的 Standard_E4bds_v5 SKU,此 VM 大小支援暫時 OS,且具有 150 GiB 的暫存儲存體。 如果您未指定 OS 磁片類型,Azure 預設會將暫時 OS 磁片布建至節點集區。
客戶自控金鑰
您可以使用 AKS 叢集上自己的金鑰來管理暫時 OS 磁片的加密。 如需詳細資訊,請參閱 在 AKS 上搭配使用客戶管理的金鑰與 Azure 磁片。
磁碟區
Kubernetes 通常會將個別 Pod 視為短暫且可處置的資源。 應用程式有不同方法可供使用及保存資料。 磁碟區就是可跨 Pod 和應用程式生命週期儲存、擷取和保存資料的方式之一。
用來儲存和擷取資料的傳統磁碟區,會建立為受 Azure 儲存體所支援的 Kubernetes 資源。 您可以手動建立要直接指派給 Pod 的資料磁片區,或讓 Kubernetes 自動建立它們。 資料磁片區可以使用:Azure 磁片、Azure 檔案儲存體、Azure NetApp Files或Azure Blob。
注意
根據您使用的 VM SKU,Azure 磁片 CSI 驅動程式可能會有每個節點的磁片區限制。 例如,針對某些高效能 VM (16 個核心) ,每個節點的限制為 64 個磁片區。 若要識別每個 VM SKU 的限制,請檢閱所提供每個 VM SKU 的 [最大資料磁片] 資料 行。 如需提供的 VM SKU 清單及其對應的詳細容量限制,請參閱 一般用途虛擬機器大小。
若要協助判斷最適合Azure 檔案儲存體與Azure NetApp Files之間的工作負載,請檢閱Azure 檔案儲存體和Azure NetApp Files比較一文中提供的資訊。
Azure 磁碟
使用 Azure 磁片 來建立 Kubernetes DataDisk 資源。 磁碟類型包括:
- Ultra 磁碟
- 進階 SSD
- 標準 SSD
- 標準 HDD
提示
針對大部分生產和開發工作負載,請使用進階 SSD。
因為 Azure 磁片會掛接為 ReadWriteOnce,所以只能供單一節點使用。 若要讓 Pod 同時存取多個節點上的儲存體磁片區,請使用 Azure 檔案儲存體。
Azure 檔案儲存體
使用Azure 檔案儲存體將伺服器訊息區掛接 (SMB) 3.1.1 版共用或網路檔案系統 (NFS) 4.1 版共用,以將 Azure 儲存體帳戶支援的共用掛接至 Pod。 Azure 檔案儲存體能讓您在多個節點和 Pod 之間共用資料:
- 高效能 SSD 支援的 Azure 進階儲存體
- 一般 HDD 支援的 Azure 標準儲存體
Azure NetApp Files
- Ultra 儲存體
- 進階儲存體
- 標準儲存體
Azure Blob 儲存體
使用 Azure Blob 儲存體建立 Blob 儲存體容器,然後使用 NFS v3.0 通訊協定或 BlobFuse 掛接。
- 區塊 Blob
磁碟區類型
Kubernetes 磁碟區不只是用來將資訊儲存和擷取的傳統磁碟。 Kubernetes 磁碟區也可用來將資料插入 Pod 中,供容器使用。
Kubernetes 中常見的其他磁碟區類型包含:
emptyDir
通常用來作為 Pod 的暫存空間。 Pod 內的所有容器都可存取磁碟區上的資料。 寫入此磁碟區類型的資料,只會在 Pod 的存留時間內保存。 只要刪除 Pod 後,磁碟區就會被刪除。 此磁碟區通常會使用基礎本機節點磁碟儲存體,但也只能留存於節點的記憶體中。
secret
您可以使用祕密磁碟區來將敏感性資料插入 Pod 中,例如密碼。
- 使用 Kubernetes API 來建立祕密。
- 定義 Pod 或部署,並要求特定的祕密。
- 祕密只會提供給已排程 Pod 所需要的祕密節點。
- 祕密會儲存至 tmpfs,而不會寫入至磁碟。
- 當您刪除節點上最後一個需要祕密的 Pod 時,即該節點的 tmpfs 祕密就會被刪除。
- 秘密會儲存在指定的命名空間內,而且只能由相同命名空間內的 Pod 存取。
configMap
您可以使用 configMap 來將機碼值組屬性插入 Pod,例如應用程式設定資訊。 將應用程式設定資訊定義為 Kubernetes 資源,不只能輕鬆更新,還能將已部署的 Pod 應用至新的執行個體。
如同使用祕密:
- 使用 Kubernetes API 來建立 ConfigMap。
- 在您定義 Pod 或部署時,可要求 ConfigMap。
- ConfigMap 會儲存在指定的命名空間內,而且只能由相同命名空間內的 Pod 存取。
永續性磁碟區
磁碟區會定義並建立為 Pod 生命週期的一部分,且在 Pod 刪除後就不會存在。 如果 Pod 在維護事件期間 (尤其是在 StatefulSet 中) 重新排程於不同的主機上,Pod 通常會預期其儲存體能持續保存。 永續性磁碟區 (PV) 是由 Kubernetes API 建立和管理的儲存體資源,可跨個別 Pod 的存留期持續保存。
您可以使用Azure 磁片或Azure 檔案儲存體來提供 PersistentVolume。 如先前關於磁碟區章節所說明,應選擇 Azure 資料箱磁碟或是檔案儲存體,通常取決於資料是否同時存取或是效能層級的需求。
叢集管理員可以 以靜態方式 建立 PersistentVolume,或由 Kubernetes API 伺服器 動態 建立磁片區。 如果已排程 Pod 並要求目前無法使用的儲存體,Kubernetes 可以建立基礎 Azure 磁片或檔案儲存體,並將其連結至 Pod。 動態佈建會使用 StorageClass 來識別需要建立的 Azure 儲存體類型。
重要
Windows 和 Linux Pod 無法共用永續性磁片區,因為兩個作業系統之間的檔案系統支援差異。
儲存類別
若要定義不同層級的儲存體 (例如進階和標準),您可以建立 StorageClass。
StorageClass 也會定義 reclaimPolicy。 當您刪除永續性磁片區時,reclaimPolicy 會控制基礎 Azure 儲存體資源的行為。 可以刪除基礎儲存體資源,或將其保留以供未來的 Pod 使用。
如果是使用容器儲存體介面 (CSI) 驅動程式的叢集,系統會建立下列額外的 StorageClasses
:
權限 | 原因 |
---|---|
managed-csi |
使用 Azure StandardSSD 本地備援儲存體 (LRS) 來建立受控磁碟。 回收原則可確保在使用基礎 Azure 磁片的永續性磁片區被刪除時,會刪除基礎 Azure 磁片。 該儲存類別也會將永續性磁碟區設定為可展開,您只需要以新的大小來編輯永續性磁碟區的宣告。 |
managed-csi-premium |
使用 Azure StandardSSD 本地備援儲存體 (LRS) 來建立受控磁碟。 再次回收原則可確保當使用基礎 Azure 磁片的永續性磁片區遭到刪除時,就會刪除基礎 Azure 磁片。 同樣地,此儲存類別允許將永續性磁片區展開。 |
azurefile-csi |
使用 Azure 標準儲存體來建立 Azure 檔案共用。 回收原則可確保刪除使用它的永續性磁片區時,會刪除基礎 Azure 檔案共用。 |
azurefile-csi-premium |
使用 Azure 進階儲存體來建立 Azure 檔案共用。 回收原則可確保在使用基礎 Azure 檔案共用的永續性磁片區被刪除時,會刪除基礎 Azure 檔案共用。 |
azureblob-nfs-premium |
使用 Azure 進階儲存體建立 Azure Blob 儲存體容器,然後使用 NFS v3 通訊協定連線。 回收原則可確保在使用基礎 Azure Blob 儲存體容器的永續性磁片區遭到刪除時,會刪除該容器。 |
azureblob-fuse-premium |
使用 Azure 進階儲存體建立 Azure Blob 儲存體容器,然後使用 BlobFuse 連線。 回收原則可確保在使用基礎 Azure Blob 儲存體容器的永續性磁片區遭到刪除時,會刪除該容器。 |
除非您為永續性磁片區指定 StorageClass,否則會使用預設的 StorageClass。 當您要求永續性磁碟區時,請確認所需要的適當儲存體。
重要事項
從 Kubernetes 1.21 版開始,AKS 預設只會使用 CSI 驅動程式,且已啟用 CSI 移轉。 雖然現有的樹狀結構內永續性磁片區會繼續運作,但從 1.26 版開始,AKS 將不再支援使用樹狀結構內驅動程式建立的磁片區,以及針對檔案和磁片布建的儲存體。
類別 default
會與 managed-csi
相同。
您可以使用 ,為其他需求 kubectl
建立 StorageClass。 下列範例會使用進階受控磁碟,並指定將 Pod 刪除後,應保留基礎 Azure 資料箱磁碟:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: managed-premium-retain
provisioner: disk.csi.azure.com
parameters:
skuName: Premium_ZRS
reclaimPolicy: Retain
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
注意
AKS 會協調預設的儲存類別,並且覆寫您對於這些儲存體類別所做的任何變更。
如需儲存體類別的詳細資訊,請參閱 Kubernetes 中的 StorageClass。
永續性磁碟區宣告
PersistentVolumeClaim 會要求特定 StorageClass、存取模式和大小的儲存體。 若根據 StorageClass 中的定義,並沒有現有資源可用來履行宣告,Kubernetes API 伺服器可在 Azure 中動態佈建基礎 Azure 儲存體資源。
在磁碟區連線至 Pod 後,Pod 定義即會包含磁碟區掛接。
可用的儲存體資源一經指派給發出要求的 Pod 後,PersistentVolume 就會繫結至 PersistentVolumeClaim。 永續性磁碟區是對應至宣告的 1:1。
下列範例 YAML 資訊清單顯示使用 managed-premium StorageClass 並要求 5Gi 磁碟的持續性磁碟區宣告:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: azure-managed-disk
spec:
accessModes:
- ReadWriteOnce
storageClassName: managed-premium-retain
resources:
requests:
storage: 5Gi
當您建立 Pod 定義時,也會指定:
- 要求所需儲存體的永續性磁碟區宣告。
- 您也會指定供應用程式來讀取和寫入資料的 volumeMount。
下列範例 YAML 資訊清單說明如何使用先前的永續性磁碟區宣告在 /mnt/azure 上掛階磁碟區:
kind: Pod
apiVersion: v1
metadata:
name: nginx
spec:
containers:
- name: myfrontend
image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine
volumeMounts:
- mountPath: "/mnt/azure"
name: volume
volumes:
- name: volume
persistentVolumeClaim:
claimName: azure-managed-disk
如果要在 Windows 容器中掛接磁碟區,請指定磁碟機代號和路徑。 例如:
...
volumeMounts:
- mountPath: "d:"
name: volume
- mountPath: "c:\k"
name: k-dir
...
後續步驟
如需相關聯的最佳做法,請參閱AKS 和 AKS 儲存體考慮中的儲存體和備份最佳做法。
若要查看如何使用 CSI 驅動程式,請參閱下列操作說明文章:
- Azure Kubernetes Service上適用于 Azure 磁片、Azure 檔案儲存體和 Azure Blob 儲存體的容器儲存體介面 (CSI) 驅動程式
- 在 Azure Kubernetes Service 中使用 Azure 磁片 CSI 驅動程式
- 在 Azure Kubernetes Service 中,使用 Azure 檔案 CSI 驅動程式
- 在 Azure Kubernetes Service 中使用 Azure Blob 儲存體 CSI 驅動程式
- 使用 Azure Kubernetes Service 設定Azure NetApp Files
如需有關 Kubernetes 及 AKS 核心概念的詳細資訊,請參閱下列文章: