Azure Arc 启用的 AKS 中应用程序的存储选项

适用于:Azure Stack HCI 22H2 上的 AKS、Windows Server 上的 AKS

使用 Azure Arc 启用的 Azure Kubernetes 服务 在 AKS 部署中运行的应用程序可能需要存储和检索数据。 对于某些应用程序工作负载,在删除 Pod 时,数据可在不需要的节点上使用本地快速存储(Kubernetes 使用 Pod 来运行应用程序的实例)。

其他工作负载可能需要在更常规的数据卷上保留的存储。 多个 Pod 可能需要共享相同的数据卷,或者重新附加数据卷(如果 Pod 重新安排在不同的节点上)。 此外,如果 Pod 包含敏感数据或应用程序配置信息,则可能需要存储选项。

显示群集主节点和节点的体系结构存储映像。

本文介绍在 AKS Arc 中为应用程序提供存储的核心概念,包括:

  • 永久性卷
  • 存储类
  • 永久性卷声明 (PVC)

应用程序通常需要能够存储和检索数据。 由于 Kubernetes 通常将单个 Pod 视为可释放的临时资源,因此应用程序可通过不同方法来使用和保存数据。 卷表示一种跨 Pod 和应用程序生命周期存储、检索及保存数据的方法。

在 Kubernetes 中,卷可以表示存储和检索信息的传统。 Kubernetes 卷还可以用于将数据插入 Pod 以供容器使用。 一些常见的 Kubernetes 卷类型包括:

  • emptyDir:此卷通常用作 Pod 的临时空间。 Pod 中的所有容器都可以访问卷上的数据。 写入此卷类型的数据仅在 Pod 的生命周期内持续保存,当 Pod 被删除时,卷也会删除。 此卷通常使用基础本地节点磁盘存储,但它也可以单独存在于节点的内存中。

  • secret - 此卷用于将敏感数据(如密码)包含在 Pod 中。 首先,使用 Kubernetes API 创建机密。 在定义 Pod 或部署时,可请求特定的机密。 机密仅提供给具有需要它的计划 Pod 的节点,并且机密存储在 tmpfs 中,而不是写入磁盘。 删除节点上需要机密的最后一个 Pod 时,将从节点的 tmpfs 中删除该机密。 机密存储在给定的命名空间中,只有同一命名空间中的 pod 能访问该机密。

  • configMap:此卷类型用于将键-值对属性注入 Pod,例如应用程序配置信息。 无需在容器映像中定义应用程序配置信息,而是可以将其定义为 Kubernetes 资源,以便在部署新 Pod 实例时可轻松为其更新并应用。 与使用机密类似,首先使用 Kubernetes API 创建 ConfigMap 。 然后,可以在定义 Pod 或部署时请求此 ConfigMapConfigMap 存储在给定命名空间中,只能由同一命名空间中的 Pod 访问。

永久性卷

卷作为 Pod 生命周期的一部分定义和创建,且仅在删除 Pod 之前存在。 如果在维护事件期间(尤其是在 StatefulSets 中)于另一台主机上重新计划 Pod,则 Pod 通常会预期其存储会被保留。 永久性卷是由 Kubernetes API 创建和管理的存储资源,可以在单个 Pod 的生命周期之外存在。

可以使用 VHDX 支持的 AKS 磁盘卷,这些卷装载为 ReadWriteOnce ,并且一次可供单个节点访问。 或者,可以使用 SMB 或 NFS 文件共享支持的 AKS 文件卷。 这些卷作为 ReadWriteMany 装载,可同时供多个节点使用。

群集管理员可以静态创建永久性卷,也可以由 Kubernetes API 服务器动态创建该卷。 如果已计划 Pod 并请求了当前不可用的存储,Kubernetes 可以创建基础 VHDX 文件,然后将它附加到 Pod。 动态预配使用 StorageClass 来标识需要创建的存储类型。

存储类

若要定义存储 (和位置) 的不同层,可以创建 StorageClassStorageClass 还定义 reclaimPolicy。 此 reclaimPolicy 控制删除 Pod 且不再需要永久性卷时基础存储资源的行为。 基础存储资源可能会被删除,也可能会被保留下来以用于未来的 Pod。

在 AKS Arc 中,会自动创建 默认 存储类,并使用 CSV 创建 VHDX 支持的卷。 回收策略确保在删除使用基础 VHDX 的永久性卷时删除该 VHDX。 存储类还会将永久性卷配置为可扩展的卷,这样一来,你只需使用新的大小编辑永久性卷声明即可。

如果未为永久性卷指定 StorageClass ,则使用默认 StorageClass 。 请求永久性卷时,请确保它们使用适当的存储。 可以创建 StorageClass 以满足其他需求。

永久性卷声明

PersistentVolumeClaim 请求特定 StorageClass 和大小的 ReadWriteOnceReadWriteMany 存储。 如果没有现有资源来实现基于定义的 StorageClass 的声明,Kubernetes API 服务器可以在 AKS Arc 中动态预配基础 存储资源。 卷连接到 Pod 后,Pod 定义即会包含装载。

将可用存储资源分配给请求它的 Pod 后, PersistentVolume 将绑定到 PersistentVolumeClaim 。 永久性卷与声明之间存在 1:1 的映射。

以下示例 YAML 清单显示了使用默认 StorageClass 并请求 5Gi 磁盘的永久性卷声明:

apiVersion: v1 
kind: PersistentVolumeClaim 
metadata: 
  name: aks-hci-vhdx 
spec: 
  accessModes: 
  - ReadWriteOnce 
  storageClassName: default 
  resources: 
    requests: 
      storage: 5Gi 

创建 Pod 定义时,将指定永久性卷声明来请求所需的存储。 然后,还可以为应用程序指定 volumeMount 用于读取和写入数据的 。 以下示例 YAML 清单显示如何使用先前的永久性卷声明将卷装载到 /mnt/aks-hci

kind: Pod 
apiVersion: v1 
metadata: 
  name: nginx 
spec: 
  containers: 
    - name: myfrontend 
      image: k8s.gcr.io/nginx 
      volumeMounts: 
      - mountPath: "/mnt/aks-hci" 
        name: volume
  nodeSelector:
      kubernetes.io/os: linux
  volumes: 
    - name: volume 
      persistentVolumeClaim: 
        claimName: aks-hci-vhdx 

以下示例演示如何在 Windows 容器中装载卷并指定驱动器号和路径:

volumeMounts: 
        - mountPath: "d:" 
          name: volume 
        - mountPath: "c:\k" 
          name: k-dir 

后续步骤