在 Azure Arc 启用的 AKS 中使用容器存储接口 (CSI) 磁盘驱动程序

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

本文介绍如何使用容器存储接口 (CSI) 内置存储类动态创建磁盘永久性卷,并在 Arc 启用的 AKS 中创建自定义存储类。

Arc 启用的 AKS 中的 CSI 概述

容器存储接口 (CSI) 是有关在 Kubernetes 上的容器化工作负载中公开任意块和文件存储系统的一套标准。 通过使用 CSI,Arc 启用的 AKS 可以编写、部署和迭代插件,以公开新的存储系统。 使用 CSI 还可以改进 Kubernetes 中的现有存储系统,而无需修改核心 Kubernetes 代码并等待其发布周期。

AKS Arc 使用的磁盘和文件 CSI 驱动程序是符合 CSI 规范的驱动程序。

AKS Arc 上的 CSI 存储驱动程序支持允许使用:

  • 可用于创建 Kubernetes DataDisk 资源的 AKS Arc 磁盘。 这些磁盘以 ReadWriteOnce 模式装载,因此一次仅可用于单个 Pod。 对于可由多个 Pod 同时访问的存储卷,请使用 AKS Arc 文件

  • AKS Arc 文件,可用于将 SMB 或 NFS 共享装载到 Pod。 这些文件以 ReadWriteMany 模式装载,因此你可以在多个节点和 Pod 之间共享数据。 它们还可以根据 PVC(永久性卷声明)规范以 ReadWriteOnce 模式装载。

使用内置存储类动态创建磁盘永久性卷

存储类用于定义使用永久性卷动态创建存储单位的方式。 有关如何使用存储类的详细信息,请参阅 Kubernetes 存储类

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

若要利用此存储类,请创建 一个 PVC 和一个引用和使用它的相应 Pod。 PVC 用于基于存储类自动预配存储。 PVC 可以使用一个预先创建的存储类或用户定义的存储类,来创建所需大小的 VHDX。 创建 Pod 定义时,将指定 PVC 来请求所需的存储。

为磁盘创建自定义存储类

默认存储类适用于最常见的方案。 但在某些情况下,你可能希望创建自己的存储类,以用于在映射到特定性能层的特殊位置存储 PV。

如果你有 Linux 工作负载 (Pod),则必须使用参数 fsType: ext4 创建自定义存储类。 此要求适用于 Kubernetes 版本 1.19 和 1.20 或更高版本。 以下示例演示定义了参数的 fsType 自定义存储类定义:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: aks-hci-disk-custom
parameters:
  blocksize: "33554432"
  container: SqlStorageContainer
  dynamic: "true"
  group: clustergroup-summertime
  hostname: TESTPATCHING-91.sys-sqlsvr.local
  logicalsectorsize: "4096"
  physicalsectorsize: "4096"
  port: "55000"
  fsType: ext4
provisioner: disk.csi.akshci.com
reclaimPolicy: Delete
volumeBindingMode: Immediate
allowVolumeExpansion: true  

如果你要创建自定义存储类,可以指定 PV 的存储位置。 如果底层基础结构是 Azure Stack HCI,则此新位置可能是由高性能 SSD/NVMe 支持的卷,也可以是 HDD 支持的成本优化卷。

创建自定义存储类的过程包括两个步骤:

  1. 使用 stack-hci-vm storagepath cmdlet 创建新的存储路径,以创建、显示和列出 Azure Stack HCI 群集上的存储路径。 有关创建存储路径的详细信息,请参阅 存储路径

    对于 $path,创建名为 的 $storagepathname存储路径;例如 ,C:\ClusterStorage\test-storagepath

    az stack-hci-vm storagepath create --resource-group $resource_group --custom-location $customLocationID --name $storagepathname --path $path
    

    获取存储路径资源 ID:

    $storagepathID = az stack-hci-vm storagepath show --name $storagepathname --resource-group $resource_group --query "id" -o tsv 
    
  2. 使用新的存储路径创建新的自定义存储类。

    1. 创建名为 sc-aks-hci-disk-custom.yaml 的文件,然后从以下 YAML 文件复制清单。 该存储类与默认存储类相同,只不过它包含新的 container。 使用storage path ID在上一步中创建的 。container 对于 grouphostname,通过运行 kubectl get storageclass default -o yaml查询默认存储类,然后使用指定的值:

      kind: StorageClass
      apiVersion: storage.k8s.io/v1
      metadata:
       name: aks-hci-disk-custom
      provisioner: disk.csi.akshci.com
      parameters:
       blocksize: "33554432"
       container: <storage path ID>
       dynamic: "true"
       group: <e.g clustergroup-akshci> # same as the default storageclass
       hostname: <e.g. ca-a858c18c.ntprod.contoso.com> # same as the default storageclass
       logicalsectorsize: "4096"
       physicalsectorsize: "4096"
       port: "55000"
       fsType: ext4 # refer to the note above to determine when to include this parameter
      allowVolumeExpansion: true
      reclaimPolicy: Delete
      volumeBindingMode: Immediate
      
    2. 使用 kubectl apply 命令创建存储类,并指定 sc-aks-hci-disk-custom.yaml 文件:

       $ kubectl apply -f sc-aks-hci-disk-custom.yaml
       storageclass.storage.k8s.io/aks-hci-disk-custom created
      

后续步骤