在 Azure Kubernetes Service (AKS) 中建立和使用 Azure Blob 儲存體的磁碟區
容器型應用程式常常需要存取和保存外部資料磁碟區中的資料。 如果多個 Pod 需要同時存取相同的儲存體磁碟區,您可以使用 Azure Blob 儲存體來使用 blobfuse 或 網路檔案系統 (NFS) 進行連線。
本文章說明如何:
- 透過安裝容器儲存體介面 (CSI) 驅動程式,並動態建立 Azure Blob 儲存體容器來連結至 Pod,以使用動態永續性磁碟區 (PV)。
- 透過建立 Azure Blob 儲存體容器或使用現有的檔案並將其連結至 Pod,以使用靜態 PV。
如需 Kubernetes 磁碟區的詳細資訊,請參閱 AKS 中的應用程式適用的儲存體選項。
開始之前
在 AKS 叢集上啟用 Blob 儲存體 CSI 驅動程式。
若要在使用 blobfuse 掛接時支援 Azure DataLake Gen2 儲存體帳戶,您必須執行下列動作:
- 若要在動態佈建中使用驅動程式建立 ADLS 帳戶,請在儲存體類別參數中指定
isHnsEnabled: "true"
。 - 若要在靜態佈建中啟用 ADLS 帳戶的 blobfuse 存取,請在永續性磁碟區中指定掛接選項
--use-adls=true
。 - 如果您要啟用具有階層命名空間的儲存體帳戶,應使用
--use-adls=true
掛接選項重新掛接現有的永續性磁碟區。
- 若要在動態佈建中使用驅動程式建立 ADLS 帳戶,請在儲存體類別參數中指定
關於 blobfuse 快取
- 根據預設,blobfuse 快取位於
/mnt
目錄中。 如果 VM SKU 提供暫存磁碟,則會將/mnt
目錄掛接在暫存磁碟上。 不過,如果 VM SKU 未提供暫存磁碟,/mnt
目錄會掛接在 OS 磁碟上,您可以設定--tmp-path=
掛接選項來指定不同的快取目錄
- 根據預設,blobfuse 快取位於
動態佈建磁碟區
本節可為想要佈建一或多個永續性磁碟區的叢集管理員提供指導,這些磁碟區中包含 Blob 儲存體上工作負載使用的詳細資料。 永續性磁碟區宣告 (PVC) 會使用儲存體類別物件,以動態方式佈建 Azure Blob 儲存體容器。
動態永續性磁碟區的儲存類別參數
下表包含您可以用來定義自訂儲存類別,進行永續性磁碟區宣告的參數。
名稱 | 描述: | 範例 | 必要 | 預設值 |
---|---|---|---|---|
skuName | 指定 Azure 儲存體帳戶類型 (別名:storageAccountType )。 |
No | Standard_LRS |
|
location | 指定 Azure 位置。 | eastus |
No | 若空白,驅動程式將使用與目前叢集相同的位置名稱 |
resourceGroup | 指定 Azure 資源群組名稱。 | myResourceGroup | No | 若空白,驅動程式將使用與目前叢集相同的資源群組名稱。 |
storageAccount | 指定 Azure 儲存體帳戶名稱。 | storageAccountName | - 否 | 未提供特定的儲存體帳戶名稱時,驅動程式會尋找符合相同資源群組內帳戶設定的適當儲存體帳戶。 如果找不到相符的儲存體帳戶,則會建立新的帳戶。 但是,如果指定儲存體帳戶名稱,儲存體帳戶必須已經存在。 |
networkEndpointType | 為驅動程式所建立的儲存體帳戶指定網路端點類型。 如果指定 privateEndpoint,則會為儲存體帳戶建立私人端點。 若為其他情況,將會為 NFS 通訊協定建立服務端點。1 | privateEndpoint |
No | 若為 AKS 叢集,將 AKS 叢集名稱新增至裝載 VNET 之資源群組中的參與者角色。 |
protocol | 指定 blobfuse 掛接或 NFSv3 掛接。 | % | No | fuse |
containerName | 指定現有的容器 (目錄) 名稱。 | 容器 | No | 如果空白,驅動程式會建立新的容器名稱,blobfuse 的開頭為 pvc-fuse ,NFS v3 的開頭為 pvc-nfs 。 |
containerNamePrefix | 指定驅動程式建立的 Azure 儲存體目錄前置詞。 | 我的 | 只能包含小寫字母、數字、連字號和長度應該少於 21 個字元。 | No |
伺服器 | 指定 Azure 儲存體帳戶網域名稱。 | 現有的儲存體帳戶 DNS 網域名稱,例如 <storage-account>.privatelink.blob.core.windows.net 。 |
No | 如果空白,驅動程式會使用預設 <storage-account>.blob.core.windows.net 或其他主權雲端儲存體帳戶 DNS 網域名稱。 |
allowBlobPublicAccess | 允許或不允許對驅動程式所建立儲存體帳戶的所有 Blob 或容器進行公用存取。 | true /false |
No | false |
storageEndpointSuffix | 指定 Azure 儲存體端點尾碼。 | core.windows.net |
No | 如果空白,驅動程式會根據雲端環境使用預設儲存體端點尾碼。 |
標記 | 標記會在新的儲存體帳戶中建立。 | 標記格式:'foo=aaa,bar=bbb' | No | }, |
matchTags | 驅動程式嘗試尋找適當的儲存體帳戶時,比對標籤。 | true /false |
No | false |
--- | 下列參數僅適用於 blobfuse | --- | --- | --- |
subscriptionID | 指定要在其中建立 Blob 儲存體目錄的 Azure 訂閱識別碼。 | Azure 訂用帳戶識別碼 | No | 若非空白,必須提供 resourceGroup 。 |
storeAccountKey | 指定 Kubernetes 祕密的儲存體帳戶金鑰。 注意: false 表示驅動程式會使用 kubelet 身分識別來取得帳戶金鑰。 |
true /false |
No | true |
secretName | 指定要儲存帳戶金鑰的祕密名稱。 | No | ||
secretNamespace | 指定要儲存帳戶金鑰的祕密命名空間。 | default 、kube-system 等。 |
No | pvc 命名空間 |
isHnsEnabled | 啟用 Azure Data Lake 儲存體帳戶的 Hierarchical namespace 。 |
true /false |
No | false |
--- | 下列參數僅適用於 NFS 通訊協定 | --- | --- | --- |
mountPermissions | 指定掛接的資料夾權限。 | 預設值為 0777 。 如果設定為 0 ,驅動程式將不會在掛接之後執行 chmod 。 |
0777 |
No |
1 如果儲存體帳戶是由驅動程式所建立,則只需要在儲存體類別中指定 networkEndpointType: privateEndpoint
參數。 CSI 驅動程式會與帳戶一起建立私人端點。 如果您使用自己的儲存體帳戶,則必須為儲存體帳戶建立私人端點。
使用內建儲存體類別建立永續性磁碟區宣告
永續性磁碟區宣告 (PVC) 會使用儲存體類別物件,以動態方式佈建 Azure Blob 儲存體容器。 下列 YAML 可用來使用內建的儲存類別建立大小為 5 GB 且具有 ReadWriteMany 存取權的永續性磁碟區宣告。 如需存取模式的詳細資訊,請參閱 Kubernetes 永續性磁碟區文件。
建立名為
blob-nfs-pvc.yaml
的檔案,然後將下列 YAML 複製進來。apiVersion: v1 kind: PersistentVolumeClaim metadata: name: azure-blob-storage spec: accessModes: - ReadWriteMany storageClassName: azureblob-nfs-premium resources: requests: storage: 5Gi
使用 kubectl create 命令來建立永續性磁碟區宣告:
kubectl create -f blob-nfs-pvc.yaml
完成後,將會建立 Blob 儲存體容器。 您可以使用 kubectl get 命令來檢視 PVC 的狀態:
kubectl get pvc azure-blob-storage
此命令的輸出與下列範例類似:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
azure-blob-storage Bound pvc-b88e36c5-c518-4d38-a5ee-337a7dda0a68 5Gi RWX azureblob-nfs-premium 92m
使用永續性磁碟區宣告
下列 YAML 所建立的 Pod,會使用永續性磁碟區宣告 azure-blob-storage,將 Azure Blob 儲存體掛接在「/mnt/blob」路徑。
建立名為
blob-nfs-pv
的檔案,然後將下列 YAML 複製進來。 請確定claimName 與上一個步驟中建立的 PVC 相符。kind: Pod apiVersion: v1 metadata: name: mypod spec: containers: - name: mypod image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine resources: requests: cpu: 100m memory: 128Mi limits: cpu: 250m memory: 256Mi volumeMounts: - mountPath: "/mnt/blob" name: volume readOnly: false volumes: - name: volume persistentVolumeClaim: claimName: azure-blob-storage
使用 kubectl apply 命令建立 Pod:
kubectl apply -f blob-nfs-pv.yaml
Pod 處於執行中狀態之後,請執行下列命令建立名為
test.txt
的新檔案。kubectl exec mypod -- touch /mnt/blob/test.txt
為驗證磁碟已正確掛接,請執行下列命令,然後確認在輸出中看見
test.txt
檔案:kubectl exec mypod -- ls /mnt/blob
此命令的輸出與下列範例類似:
test.txt
建立自訂儲存類別
預設儲存類別符合最常見的案例,但並非全部。 在某些情況下,您可能想要使用自有參數來自訂自己的儲存類別。 在本節中,我們提供兩個範例。 第一個使用 NFS 通訊協定,而第二個使用 blobfuse。
使用 NFS 通訊協定的儲存體類別
在此範例中,下列資訊清單會使用 NFS 通訊協定來設定掛接 Blob 儲存體容器。 使用它來新增 tags 參數。
建立名為
blob-nfs-sc.yaml
的檔案,並貼上下列資訊清單範例:apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: azureblob-nfs-premium provisioner: blob.csi.azure.com parameters: protocol: nfs tags: environment=Development volumeBindingMode: Immediate allowVolumeExpansion: true mountOptions: - nconnect=4
使用 kubectl apply 命令建立儲存體類別:
kubectl apply -f blob-nfs-sc.yaml
此命令的輸出與下列範例類似:
storageclass.storage.k8s.io/blob-nfs-premium created
使用 blobfuse 的儲存體類別
在此範例中,下列資訊清單會使用 blobfuse 進行設定,並掛接 Blob 儲存體容器。 使用它來更新 skuName 參數。
建立名為
blobfuse-sc.yaml
的檔案,並貼上下列資訊清單範例:apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: azureblob-fuse-premium provisioner: blob.csi.azure.com parameters: skuName: Standard_GRS # available values: Standard_LRS, Premium_LRS, Standard_GRS, Standard_RAGRS reclaimPolicy: Delete volumeBindingMode: Immediate allowVolumeExpansion: true mountOptions: - -o allow_other - --file-cache-timeout-in-seconds=120 - --use-attr-cache=true - --cancel-list-on-mount-seconds=10 # prevent billing charges on mounting - -o attr_timeout=120 - -o entry_timeout=120 - -o negative_timeout=120 - --log-level=LOG_WARNING # LOG_WARNING, LOG_INFO, LOG_DEBUG - --cache-size-mb=1000 # Default will be 80% of available memory, eviction will happen beyond that.
使用 kubectl apply 命令建立儲存體類別:
kubectl apply -f blobfuse-sc.yaml
此命令的輸出與下列範例類似:
storageclass.storage.k8s.io/blob-fuse-premium created
靜態佈建磁碟區
本節可為想要建立一或多個永續性磁碟區的叢集管理員提供指導,這些磁碟區中包含 Blob 儲存體上工作負載使用的詳細資料。
永續性磁碟區的靜態佈建參數
下表包含您可以用來定義永續性磁碟區的參數。
名稱 | 描述: | 範例 | 必要 | 預設值 |
---|---|---|---|---|
volumeHandle | 指定一個值,可供驅動程式用來識別叢集中的儲存體 Blob 容器。 | 產生唯一值的建議方法是合併全域唯一的儲存體帳戶名稱和容器名稱:{account-name}_{container-name} 。注意: # 、/ 字元保留供內部使用,無法用於磁碟區的控制代碼。 |
Yes | |
volumeAttributes.resourceGroup | 指定 Azure 資源群組名稱。 | myResourceGroup | No | 若空白,驅動程式會使用與目前叢集相同的資源群組名稱。 |
volumeAttributes.storageAccount | 指定現有的 Azure 儲存體帳戶名稱。 | storageAccountName | Yes | |
volumeAttributes.containerName | 指定現有的容器名稱。 | 容器 | Yes | |
volumeAttributes.protocol | 指定 blobfuse 掛接或 NFSv3 掛接。 | % | No | fuse |
--- | 下列參數僅適用於 blobfuse | --- | --- | --- |
volumeAttributes.secretName | 可儲存儲存體帳戶名稱和金鑰的秘密名稱 (僅適用於 SMB)。 | No | ||
volumeAttributes.secretNamespace | 指定要儲存帳戶金鑰的祕密命名空間。 | default |
No | Pvc namespace |
nodeStageSecretRef.name | 指定儲存下列任一項目的祕密名稱:azurestorageaccountkey azurestorageaccountsastoken msisecret azurestoragespnclientsecret . |
No | 現有的 Kubernetes 秘密名稱 | |
nodeStageSecretRef.namespace | 指定秘密的命名空間。 | Kubernetes 命名空間 | Yes | |
--- | 下列參數僅適用於 NFS 通訊協定 | --- | --- | --- |
volumeAttributes.mountPermissions | 指定掛接的資料夾權限。 | 0777 |
No | |
--- | 下列參數僅適用於 NFS VNet 設定 | --- | --- | --- |
vnetResourceGroup | 指定裝載虛擬網路的 VNet 資源群組。 | myResourceGroup | No | 如果空白,驅動程式會使用 Azure 雲端組態檔中指定的 vnetResourceGroup 值。 |
vnetName | 指定虛擬網路名稱。 | aksVNet | No | 如果空白,驅動程式會使用 Azure 雲端組態檔中指定的 vnetName 值。 |
subnetName | 指定代理程式節點的現有子網路名稱。 | aksSubnet | No | 如果空白,驅動程式會使用 Azure 雲端組態檔中的 subnetName 值。 |
--- | 下列參數僅供功能使用:blobfuse 受控識別和服務主體名稱驗證 |
--- | --- | --- |
volumeAttributes.AzureStorageAuthType | 指定驗證類型。 | No | Key |
|
volumeAttributes.AzureStorageIdentityClientID | 指定識別用戶端識別碼。 | No | ||
volumeAttributes.AzureStorageIdentityResourceID | 指定識別資源識別碼。 | No | ||
volumeAttributes.MSIEndpoint | 指定 MSI 端點。 | No | ||
volumeAttributes.AzureStorageSPNClientID | 指定 Azure 服務主體名稱 (SPN) 用戶端識別碼。 | No | ||
volumeAttributes.AzureStorageSPNTenantID | 指定 Azure SPN 租用戶識別碼。 | No | ||
volumeAttributes.AzureStorageAADEndpoint | 指定 Microsoft Entra 端點。 | No | ||
--- | 下列參數僅供功能使用:Blobfuse 讀取金鑰保存庫中的帳戶金鑰或 SAS 權杖 | --- | --- | --- |
volumeAttributes.keyVaultURL | 指定 Azure Key Vault DNS 名稱。 | {vault-name}.vault.azure.net | No | |
volumeAttributes.keyVaultSecretName | 指定 Azure Key Vault 秘密名稱。 | 現有的 Azure Key Vault 秘密名稱。 | No | |
volumeAttributes.keyVaultSecretVersion | Azure Key Vault 祕密版本。 | 現有版本 | No | 如果空白,驅動程式會使用目前的版本。 |
建立 Blob 儲存體容器
當您建立要搭配 AKS 使用的 Azure Blob 儲存體資源時,您可以在節點資源群組中建立資源。 此方法可讓 AKS 叢集存取和管理 Blob 儲存體資源。
在本文中,我們會在節點資源群組中建立磁碟。 首先,使用 az aks show 命令來取得資源群組名稱,並新增 --query nodeResourceGroup
查詢參數。 下列範例會在名為 myResourceGroup 的資源群組中,取得 AKS 叢集名稱為 myAKSCluster 的節點資源群組:
az aks show --resource-group myResourceGroup --name myAKSCluster --query nodeResourceGroup -o tsv
此命令的輸出與下列範例類似:
MC_myResourceGroup_myAKSCluster_eastus
接下來,依照管理 Blob 儲存體中的步驟建立用來儲存 Blob 的容器,以授權存取,然後建立容器。
掛接磁碟區
在本節中,您會使用 NFS 通訊協定或 Blobfuse 掛接永續性磁碟區。
使用 NFS v3 通訊協定掛接 Blob 儲存體不會使用帳戶金鑰進行驗證。 您的 AKS 叢集必須位於與代理程式節點相同或對等互連的虛擬網路中。 若要保護儲存體帳戶中的資料,唯一的方法是使用虛擬網路和其他網路安全性設定。 如需有關如何設定儲存體帳戶的 NFS 存取權詳細資訊,請參閱使用網路檔案系統 (NFS) 3.0 通訊協定掛接 Blob 儲存體。
下列範例示範如何使用 NFS 通訊協定,將 Blob 儲存體容器掛接為永續性磁碟區。
建立名為
pv-blob-nfs.yaml
的檔案,然後將下列 YAML 複製進來。 在storageClass
之下,更新resourceGroup
、storageAccount
和containerName
。注意
volumeHandle
值應是叢集中每個相同儲存體 Blob 容器的唯一 volumeID。#
和/
字元保留供內部使用,因此無法使用。apiVersion: v1 kind: PersistentVolume metadata: annotations: pv.kubernetes.io/provisioned-by: blob.csi.azure.com name: pv-blob spec: capacity: storage: 1Pi accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain # If set as "Delete" container would be removed after pvc deletion storageClassName: azureblob-nfs-premium mountOptions: - nconnect=4 csi: driver: blob.csi.azure.com # make sure volumeid is unique for every identical storage blob container in the cluster # character `#` and `/` are reserved for internal use and cannot be used in volumehandle volumeHandle: account-name_container-name volumeAttributes: resourceGroup: resourceGroupName storageAccount: storageAccountName containerName: containerName protocol: nfs
注意
雖然 Kubernetes API capacity 屬性為必要項目,但 Azure Blob 儲存體 CSI 驅動程式不會使用此值,因為您可以彈性地寫入資料,直到您達到儲存體帳戶的容量限制為止。
capacity
屬性的值僅用於 PersistentVolumes 與 PersistentVolumeClaims 之間的大小比對。 我們建議使用虛構的高值。 Pod 會看到已掛接的磁碟區,其虛構大小為 5 PB。執行下列命令,以使用參考稍早所建立 YAML 檔案的 kubectl create 命令來建立永續性磁碟區:
kubectl create -f pv-blob-nfs.yaml
使用 PersistentVolumeClaim 建立
pvc-blob-nfs.yaml
檔案。 例如:kind: PersistentVolumeClaim apiVersion: v1 metadata: name: pvc-blob spec: accessModes: - ReadWriteMany resources: requests: storage: 10Gi volumeName: pv-blob storageClassName: azureblob-nfs-premium
執行下列命令,以使用參考稍早所建立 YAML 檔案的 kubectl create 命令來建立永續性磁碟區宣告:
kubectl create -f pvc-blob-nfs.yaml
使用永續性磁碟區
下列 YAML 會建立一個 Pod,該 Pod 會使用稍早建立名為 pvc-blob 的永續性磁碟區或永續性磁碟區宣告,在 /mnt/blob
路徑掛接 Azure Blob 儲存體。
建立名為
nginx-pod-blob.yaml
的檔案,然後將下列 YAML 複製進來。 請確定 claimName 符合在建立 NFS 或 Blobfuse 的永續性磁碟區時,在上一個步驟中建立的 PVC。kind: Pod apiVersion: v1 metadata: name: nginx-blob spec: nodeSelector: "kubernetes.io/os": linux containers: - image: mcr.microsoft.com/oss/nginx/nginx:1.17.3-alpine name: nginx-blob volumeMounts: - name: blob01 mountPath: "/mnt/blob" readOnly: false volumes: - name: blob01 persistentVolumeClaim: claimName: pvc-blob
執行下列命令,以使用參考稍早所建立 YAML 檔案的 kubectl create 命令來建立 Pod 及掛接 PVC:
kubectl create -f nginx-pod-blob.yaml
執行下列命令來建立具有 Pod 的互動式殼層工作階段,確認已掛接 Blob 儲存體:
kubectl exec -it nginx-blob -- df -h
此命令的輸出與下列範例類似:
Filesystem Size Used Avail Use% Mounted on ... blobfuse 14G 41M 13G 1% /mnt/blob ...
下一步
- 若要了解如何針對 Azure Blob 儲存體使用 CSI 驅動程式,請參閱使用 Azure Blob 儲存體搭配 CSI 驅動程式。
- 如需相關的最佳做法,請參閱 AKS 中的儲存和備份最佳做法。