在 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 永久性卷。