在 Azure Kubernetes 服务 (AKS) 中通过 Azure 磁盘创建静态卷

基于容器的应用程序通常需要访问数据并将数据保存在外部数据卷中。 如果单个 Pod 需要访问存储,则可以使用 Azure 磁盘来提供本机卷供应用程序使用。 本文介绍了如何手动创建 Azure 磁盘并将其附加到 AKS 中的 Pod。

注意

Azure 磁盘一次只能装载到单个 Pod 中。 如果需要在多个 Pod 之间共享永久性卷,请使用 Azure 文件存储

有关 Kubernetes 卷的详细信息,请参阅 AKS 中应用程序的存储选项

开始之前

本文假设你已有一个版本不低于 1.21 的 AKS 群集。 如果需要 AKS 群集,请参阅使用 Azure CLI 的 AKS 快速入门、使用 Azure PowerShell 的 AKS 快速入门或使用 Azure 门户的 AKS 快速入门。

若要使用 1.20 或更低版本的 AKS 群集与 Azure 磁盘进行交互,请参阅用于 Azure 磁盘的 Kubernetes 插件

Azure 磁盘 CSI 驱动程序存在每个节点 32 个卷的限制。 卷计数因节点/节点池的大小而异。 运行以下命令以确定可为每个节点分配的卷数:

kubectl get CSINode <nodename> -o yaml

存储类静态预配

下表介绍了 Azure 磁盘 CSI 驱动程序静态预配的存储类参数:

名称 含义 可用值 必需 默认值
volumeHandle Azure 磁盘 URI /subscriptions/{sub-id}/resourcegroups/{group-name}/providers/microsoft.compute/disks/{disk-id} 空值
volumeAttributes.fsType 文件系统类型 ext4ext3ext2xfsbtrfs(适用于 Linux)、ntfs(适用于 Windows) ext4(适用于 Linux)、ntfs(适用于 Windows)
volumeAttributes.partition 现有磁盘的分区号(仅在 Linux 上受支持) 123 空(无分区)
- 确保分区格式类似于 -part1
volumeAttributes.cachingMode 磁盘主机缓存设置 NoneReadOnlyReadWrite ReadOnly

创建 Azure 磁盘

创建用于 AKS 的 Azure 磁盘时,可以在节点资源组中创建磁盘资源。 此方法允许 AKS 群集访问和管理磁盘资源。 如果改为在单独的资源组中创建磁盘,则必须向群集的 Azure Kubernetes 服务 (AKS) 托管标识授予磁盘资源组的 Contributor 角色。 在本练习中,你将在群集所在的资源组中创建磁盘。

  1. 使用 az aks show 命令标识资源组名称并添加 --query nodeResourceGroup 参数。 以下示例获取名为 myResourceGroup 的资源组中 AKS 群集名称 myAKSCluster 的节点资源组:

    $ az aks show --resource-group myResourceGroup --name myAKSCluster --query nodeResourceGroup -o tsv
    
    MC_myResourceGroup_myAKSCluster_chinaeast2
    
  2. 使用 az disk create 命令创建磁盘。 指定在上一命令中获取的节点资源组名称,然后指定磁盘资源的名称,例如 myAKSDisk。 以下示例创建一个 20GiB 的磁盘,并在创建后输出磁盘的 ID。 如果需要创建与 Windows Server 容器一起使用的磁盘,请添加 --os-type windows 参数以正确格式化该磁盘。

    az disk create \
      --resource-group MC_myResourceGroup_myAKSCluster_chinaeast2 \
      --name myAKSDisk \
      --size-gb 20 \
      --query id --output tsv
    

    注意

    Azure 磁盘依据特定大小的 SKU 收取费用。 这些 SKU 的范围为 32 GiB(适用于 S4 或 P4 磁盘)到 32 TiB(适用于 S80 或 P80 磁盘),属于预览版。 高级托管磁盘的吞吐量和 IOPS 性能取决于 SKU 和 AKS 群集中节点的实例大小。 请参阅托管磁盘的定价和性能

    在命令成功完成后将显示磁盘资源 ID,如以下示例输出中所示。 下一部分将使用此磁盘 ID 来装载磁盘。

    /subscriptions/<subscriptionID>/resourceGroups/MC_myAKSCluster_myAKSCluster_chinaeast2/providers/Microsoft.Compute/disks/myAKSDisk
    

将磁盘作为卷进行装载

  1. 使用 PersistentVolume 创建 pv-azuredisk.yaml 文件。 使用上一步骤中的磁盘资源 ID 更新 volumeHandle。 例如:

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv-azuredisk
    spec:
      capacity:
        storage: 20Gi
      accessModes:
        - ReadWriteOnce
      persistentVolumeReclaimPolicy: Retain
      storageClassName: managed-csi
      csi:
        driver: disk.csi.azure.com
        readOnly: false
        volumeHandle: /subscriptions/<subscriptionID>/resourceGroups/MC_myAKSCluster_myAKSCluster_chinaeast2/providers/Microsoft.Compute/disks/myAKSDisk
        volumeAttributes:
          fsType: ext4
    
  2. 创建一个 pvc-azuredisk.yaml 文件,其中包含使用 PersistentVolume 的 PersistentVolumeClaim。 例如:

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: pvc-azuredisk
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 20Gi
      volumeName: pv-azuredisk
      storageClassName: managed-csi
    
  3. 使用 kubectl 命令创建 PersistentVolume 和 PersistentVolumeClaim,引用前面创建的两个 YAML 文件:

    kubectl apply -f pv-azuredisk.yaml
    kubectl apply -f pvc-azuredisk.yaml
    
  4. 若要验证 PersistentVolumeClaim 是否已创建并绑定到 PersistentVolume,请运行以下命令:

    $ kubectl get pvc pvc-azuredisk
    
    NAME            STATUS   VOLUME         CAPACITY    ACCESS MODES   STORAGECLASS   AGE
    pvc-azuredisk   Bound    pv-azuredisk   20Gi        RWO                           5s
    
  5. 创建 azure-disk-pod.yaml 文件以引用 PersistentVolumeClaim。 例如:

    apiVersion: v1
    kind: Pod
    metadata:
      name: mypod
    spec:
      nodeSelector:
        kubernetes.io/os: linux
      containers:
      - image: mcr.azk8s.cn/oss/nginx/nginx:1.15.5-alpine
        name: mypod
        resources:
          requests:
            cpu: 100m
            memory: 128Mi
          limits:
            cpu: 250m
            memory: 256Mi
        volumeMounts:
          - name: azure
            mountPath: /mnt/azure
      volumes:
        - name: azure
          persistentVolumeClaim:
            claimName: pvc-azuredisk
    
  6. 运行以下命令以应用配置并装载卷,引用在前面的步骤中创建的 YAML 配置文件:

    kubectl apply -f azure-disk-pod.yaml
    

后续步骤

若要了解建议的存储和备份做法,请参阅 AKS 中的存储和备份的最佳做法