基于容器的应用程序通常需要访问数据并将数据保存在外部数据卷中。 如果单个 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 | 文件系统类型 | ext4 、ext3 、ext2 、xfs 、btrfs (适用于 Linux)、ntfs (适用于 Windows) |
否 | ext4 (适用于 Linux)、ntfs (适用于 Windows) |
volumeAttributes.partition | 现有磁盘的分区号(仅在 Linux 上受支持) | 1 、2 、3 |
否 | 空(无分区) - 确保分区格式类似于 -part1 |
volumeAttributes.cachingMode | 磁盘主机缓存设置 | None 、ReadOnly 、ReadWrite |
否 | ReadOnly |
创建 Azure 磁盘
创建用于 AKS 的 Azure 磁盘时,可以在节点资源组中创建磁盘资源。 此方法允许 AKS 群集访问和管理磁盘资源。 如果改为在单独的资源组中创建磁盘,则必须向群集的 Azure Kubernetes 服务 (AKS) 托管标识授予磁盘资源组的 Contributor
角色。 在本练习中,你将在群集所在的资源组中创建磁盘。
使用 az aks show 命令标识资源组名称并添加
--query nodeResourceGroup
参数。 以下示例获取名为 myResourceGroup 的资源组中 AKS 群集名称 myAKSCluster 的节点资源组:$ az aks show --resource-group myResourceGroup --name myAKSCluster --query nodeResourceGroup -o tsv MC_myResourceGroup_myAKSCluster_chinaeast2
使用 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
将磁盘作为卷进行装载
使用 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
创建一个 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
使用
kubectl
命令创建 PersistentVolume 和 PersistentVolumeClaim,引用前面创建的两个 YAML 文件:kubectl apply -f pv-azuredisk.yaml kubectl apply -f pvc-azuredisk.yaml
若要验证 PersistentVolumeClaim 是否已创建并绑定到 PersistentVolume,请运行以下命令:
$ kubectl get pvc pvc-azuredisk NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE pvc-azuredisk Bound pv-azuredisk 20Gi RWO 5s
创建 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
运行以下命令以应用配置并装载卷,引用在前面的步骤中创建的 YAML 配置文件:
kubectl apply -f azure-disk-pod.yaml
后续步骤
若要了解建议的存储和备份做法,请参阅 AKS 中的存储和备份的最佳做法。