共用方式為


在 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 掛接選項重新掛接現有的永續性磁碟區。
  • 關於 blobfuse 快取

    • 根據預設,blobfuse 快取位於 /mnt 目錄中。 如果 VM SKU 提供暫存磁碟,則會將 /mnt 目錄掛接在暫存磁碟上。 不過,如果 VM SKU 未提供暫存磁碟,/mnt 目錄會掛接在 OS 磁碟上,您可以設定 --tmp-path= 掛接選項來指定不同的快取目錄

動態佈建磁碟區

本節可為想要佈建一或多個永續性磁碟區的叢集管理員提供指導,這些磁碟區中包含 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 指定要儲存帳戶金鑰的祕密命名空間。 defaultkube-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 永續性磁碟區文件。

  1. 建立名為 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
    
  2. 使用 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」路徑。

  1. 建立名為 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
    
  2. 使用 kubectl apply 命令建立 Pod:

    kubectl apply -f blob-nfs-pv.yaml
    
  3. Pod 處於執行中狀態之後,請執行下列命令建立名為 test.txt 的新檔案。

    kubectl exec mypod -- touch /mnt/blob/test.txt
    
  4. 為驗證磁碟已正確掛接,請執行下列命令,然後確認在輸出中看見 test.txt 檔案:

    kubectl exec mypod -- ls /mnt/blob
    

    此命令的輸出與下列範例類似:

    test.txt
    

建立自訂儲存類別

預設儲存類別符合最常見的案例,但並非全部。 在某些情況下,您可能想要使用自有參數來自訂自己的儲存類別。 在本節中,我們提供兩個範例。 第一個使用 NFS 通訊協定,而第二個使用 blobfuse。

使用 NFS 通訊協定的儲存體類別

在此範例中,下列資訊清單會使用 NFS 通訊協定來設定掛接 Blob 儲存體容器。 使用它來新增 tags 參數。

  1. 建立名為 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
    
  2. 使用 kubectl apply 命令建立儲存體類別:

    kubectl apply -f blob-nfs-sc.yaml
    

    此命令的輸出與下列範例類似:

    storageclass.storage.k8s.io/blob-nfs-premium created
    

使用 blobfuse 的儲存體類別

在此範例中,下列資訊清單會使用 blobfuse 進行設定,並掛接 Blob 儲存體容器。 使用它來更新 skuName 參數。

  1. 建立名為 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.
    
  2. 使用 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 儲存體容器掛接為永續性磁碟區。

  1. 建立名為 pv-blob-nfs.yaml 的檔案,然後將下列 YAML 複製進來。 在 storageClass 之下,更新 resourceGroupstorageAccountcontainerName

    注意

    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 屬性的值僅用於 PersistentVolumesPersistentVolumeClaims 之間的大小比對。 我們建議使用虛構的高值。 Pod 會看到已掛接的磁碟區,其虛構大小為 5 PB。

  2. 執行下列命令,以使用參考稍早所建立 YAML 檔案的 kubectl create 命令來建立永續性磁碟區:

    kubectl create -f pv-blob-nfs.yaml
    
  3. 使用 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
    
  4. 執行下列命令,以使用參考稍早所建立 YAML 檔案的 kubectl create 命令來建立永續性磁碟區宣告:

    kubectl create -f pvc-blob-nfs.yaml
    

使用永續性磁碟區

下列 YAML 會建立一個 Pod,該 Pod 會使用稍早建立名為 pvc-blob 的永續性磁碟區或永續性磁碟區宣告,在 /mnt/blob 路徑掛接 Azure Blob 儲存體。

  1. 建立名為 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
    
  2. 執行下列命令,以使用參考稍早所建立 YAML 檔案的 kubectl create 命令來建立 Pod 及掛接 PVC:

    kubectl create -f nginx-pod-blob.yaml
    
  3. 執行下列命令來建立具有 Pod 的互動式殼層工作階段,確認已掛接 Blob 儲存體:

    kubectl exec -it nginx-blob -- df -h
    

    此命令的輸出與下列範例類似:

    Filesystem      Size  Used Avail Use% Mounted on
    ...
    blobfuse         14G   41M   13G   1% /mnt/blob
    ...
    

下一步