在 Azure Kubernetes 服务 (AKS) 中动态创建永久性卷并将其用于 Azure 文件

永久性卷表示已经过预配可以用于 Kubernetes Pod 的存储块。 永久性卷可供一个或多个 Pod 使用,并可动态或静态预配。 如果多个 Pod 需要同时访问同一存储卷,则可以使用 Azure 文件存储通过服务器消息块 (SMB) 协议进行连接。 本文介绍如何动态创建 Azure 文件共享以供 Azure Kubernetes 服务 (AKS) 群集中的多个 Pod 使用。

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

开始之前

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

还需安装并配置 Azure CLI 2.0.59 或更高版本。 运行 az --version 即可查找版本。 如果需要进行安装或升级,请参阅安装 Azure CLI

创建存储类

存储类用于定义如何创建 Azure 文件共享。 节点资源组中会自动创建一个存储帐户来与存储类配合使用,以保存 Azure 文件共享。 为 skuName 选择下列任一 Azure 存储冗余

  • Standard_LRS - 标准本地冗余存储 (LRS)

  • Standard_GRS - 标准异地冗余存储 (GRS)

  • Standard_ZRS - 标准区域冗余存储 (ZRS)

  • Standard_RAGRS - 标准读取访问异地冗余存储 (RA-GRS)

  • Premium_LRS - 高级本地冗余存储 (LRS)

注意

最小的高级文件共享为 100 GB。

有关 Azure 文件存储的 Kubernetes 存储类的详细信息,请参阅 Kubernetes 存储类

创建名为 azure-file-sc.yaml 的文件,并将其复制到以下示例清单中。 有关 mountOptions 的详细信息,请参阅装载选项部分。

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: my-azurefile
provisioner: file.csi.azure.com # replace with "kubernetes.io/azure-file" if aks version is less than 1.21
allowVolumeExpansion: true
mountOptions:
  - dir_mode=0777
  - file_mode=0777
  - uid=0
  - gid=0
  - mfsymlinks
  - cache=strict
  - actimeo=30
parameters:
  skuName: Premium_LRS

使用 kubectl apply 命令创建存储类:

kubectl apply -f azure-file-sc.yaml

创建永久性卷声明

永久性卷声明 (PVC) 使用存储类对象来动态预配 Azure 文件共享。 可使用以下 YAML 创建大小为 100 GB、访问权限为 ReadWriteMany 的永久性卷声明。 有关访问模式的详细信息,请参阅 Kubernetes 永久性卷文档。

现在,创建名为 azure-file-pvc.yaml 的文件,并将其复制到以下 YAML 中。 请确保 storageClassName 与上一步骤中创建的存储类匹配:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-azurefile
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: my-azurefile
  resources:
    requests:
      storage: 100Gi

注意

如果将 Premium_LRS SKU 用于存储类,则存储的最小值必须为 100Gi。

使用 kubectl apply 命令创建永久性卷声明:

kubectl apply -f azure-file-pvc.yaml

完成此步骤后,文件共享即创建完毕。 同时还会创建一个包含连接信息和凭据的 Kubernetes 机密。 可以使用 kubectl get 命令查看 PVC 的状态:

$ kubectl get pvc my-azurefile

NAME           STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      AGE
my-azurefile   Bound     pvc-8436e62e-a0d9-11e5-8521-5a8664dc0477   10Gi       RWX            my-azurefile      5m

使用永久性卷

以下 YAML 创建的 Pod 使用永久性卷声明 my-azurefile 将 Azure 文件共享装载到 /mnt/azure 路径 。 对于 Windows Server 容器,请使用 Windows 路径约定指定 mountPath,例如“D:”。

创建名为 azure-pvc-files.yaml 的文件,并将其复制到以下 YAML 中。 请确保 claimName 与上一步骤中创建的 PVC 匹配。

kind: Pod
apiVersion: v1
metadata:
  name: mypod
spec:
  containers:
  - name: mypod
    image: mcr.azk8s.cn/oss/nginx/nginx:1.15.5-alpine
    resources:
      requests:
        cpu: 100m
        memory: 128Mi
      limits:
        cpu: 250m
        memory: 256Mi
    volumeMounts:
    - mountPath: "/mnt/azure"
      name: volume
  volumes:
    - name: volume
      persistentVolumeClaim:
        claimName: my-azurefile

使用 kubectl apply 命令创建 Pod。

kubectl apply -f azure-pvc-files.yaml

现有一个正在运行的 Pod,其中的 Azure 文件存储共享已装载到 /mnt/azure 目录中。 通过 kubectl describe pod mypod 检查 pod 时,可以看到此配置。 以下精简示例输出显示容器中装载的卷:

Containers:
  mypod:
    Container ID:   docker://053bc9c0df72232d755aa040bfba8b533fa696b123876108dec400e364d2523e
    Image:          mcr.azk8s.cn/oss/nginx/nginx:1.15.5-alpine
    Image ID:       docker-pullable://nginx@sha256:d85914d547a6c92faa39ce7058bd7529baacab7e0cd4255442b04577c4d1f424
    State:          Running
      Started:      Fri, 01 Mar 2019 23:56:16 +0000
    Ready:          True
    Mounts:
      /mnt/azure from volume (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-8rv4z (ro)
[...]
Volumes:
  volume:
    Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
    ClaimName:  my-azurefile
    ReadOnly:   false
[...]

装载选项

对于 Kubernetes 版本 1.13.0 及更高版本,fileMode 和 dirMode 的默认值为 0777。 如果使用存储类动态创建永久性卷,则可以在存储类对象上指定装载选项。 以下示例设置 0777

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: my-azurefile
provisioner: file.csi.azure.com # replace with "kubernetes.io/azure-file" if aks version is less than 1.21
allowVolumeExpansion: true
mountOptions:
  - dir_mode=0777
  - file_mode=0777
  - uid=0
  - gid=0
  - mfsymlinks
  - cache=strict
  - actimeo=30
parameters:
  skuName: Premium_LRS

使用 Azure 标记

有关如何使用 Azure 标记的详细信息,请参阅在 Azure Kubernetes 服务 (AKS) 中使用 Azure 标记

后续步骤

如需相关的最佳做法,请参阅在 AKS 中存储和备份的最佳做法

有关存储类参数,请参阅动态预配

详细了解使用 Azure 文件的 Kubernetes 永久性卷。