使用 Azure Blob 存储容器存储接口 (CSI) 驱动程序

Azure Blob 存储容器存储接口 (CSI) 驱动程序是符合 CSI 规范的驱动程序,供 Azure Kubernetes 服务 (AKS) 用来管理 Azure Blob 存储的生命周期。 CSI 是有关对 Kubernetes 上的容器化工作负载公开任意块和文件存储系统的一个标准。

现在,AKS 可以采用 CSI 来编写、部署和迭代插件,以在 Kubernetes 中公开新的或改进现有的存储系统。 在 AKS 中使用 CSI 驱动程序可以避免改动核心 Kubernetes 代码并等待完成代码发布周期。

将 Azure Blob 存储作为文件系统装载到容器或 pod 后,它使你能够将 Blob 存储与处理大量非结构化数据的各种应用程序一起使用。 例如:

  • 日志文件数据
  • 图像、文档和流式传输视频或音频
  • 灾难恢复数据

使用 BlobFuse 或网络文件系统 (NFS) 3.0 协议的应用程序可以访问对象存储上的数据。 在引入 Azure Blob 存储 CSI 驱动程序之前,只能手动安装不受支持的驱动程序,从而借助在 AKS 上运行的应用程序访问 Blob 存储。 在 AKS 上启用 Azure Blob 存储 CSI 驱动程序后,有两个内置存储类:azureblob-fuse-premium 和 azureblob-nfs-premium。

若要创建支持 CSI 驱动程序的 AKS 群集,请参阅 AKS 上的 CSI 驱动程序。 若要详细了解使用 NFS 协议的每种 Azure 存储类型之间的访问差异,请参阅使用 NFS 比较对 Azure 文件存储、Blob 存储和 Azure NetApp 文件的访问

Azure Blob 存储 CSI 驱动程序功能

Azure Blob 存储 CSI 驱动程序支持以下功能:

  • BlobFuse 和网络文件系统 (NFS) 版本 3.0 协议

准备阶段

注意

如果在安装开源驱动程序期间未启用 blobfuse-proxy,那么开源驱动程序的卸载将中断现有的 blobfuse 装载。 但是,NFS 装载将不受影响。

在新的或现有 AKS 群集上启用 CSI 驱动程序

借助 Azure CLI,可以在新的或现有 AKS 群集上启用 Blob 存储 CSI 驱动程序,然后再配置永久性卷以供群集中的 Pod 使用。

若要在新群集上启用驱动程序,请在 az aks create 命令中包含 --enable-blob-driver 参数,如以下示例所示:

az aks create --enable-blob-driver -n myAKSCluster -g myResourceGroup

若要在现有群集上启用驱动程序,请在 az aks update 命令中包含 --enable-blob-driver 参数,如以下示例所示:

az aks update --enable-blob-driver -n myAKSCluster -g myResourceGroup

系统会提示你确认未安装开放源代码 Blob CSI 驱动程序。 确认后,可能需要几分钟才能完成此操作。 完成后,你应会在输出中看到在群集上所启用驱动程序的状态。 以下示例类似于指示上一个命令结果的部分:

"storageProfile": {
    "blobCsiDriver": {
      "enabled": true
    },

在现有 AKS 群集上禁用 CSI 驱动程序

借助 Azure CLI,从群集中删除永久性卷后,可禁用现有 AKS 群集上的 Blob 存储 CSI 驱动程序。

若要在现有群集上禁用驱动程序,请在 az aks update 命令中包含 --disable-blob-driver 参数,如以下示例所示:

az aks update --disable-blob-driver -n myAKSCluster -g myResourceGroup

将永久性卷与 Azure Blob 存储结合使用

永久性卷 (PV) 表示已经过预配的可用于 Kubernetes Pod 的存储块。 PV 可供一个或多个 Pod 使用,并可动态或静态预配。 如果多个 Pod 需要并发访问同一存储卷,可以使用 Azure Blob 存储通过网络文件系统 (NFS) 或 blobfuse 进行连接。 本文介绍如何动态创建 Azure Blob 存储容器,以供 AKS 群集中的多个 Pod 使用。

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

使用内置存储类动态创建 Azure Blob 存储 PV

存储类用于定义创建 Azure Blob 存储容器的方法。 节点资源组中会自动创建一个存储帐户,用于与存储类一起来保存 Azure Blob 存储容器。 为“skuName”选择以下 Azure 存储冗余 SKU 之一:

  • Standard_LRS:标准本地冗余存储
  • Premium_LRS:高级本地冗余存储
  • Standard_GRS:标准异地冗余存储
  • Standard_RAGRS:标准读取访问异地冗余存储

在 AKS 上使用存储 CSI 驱动程序时,有两个附加的内置 StorageClass,两者均使用了 Azure Blob CSI 存储驱动程序。

针对这两个存储类的回收策略可确保在删除相应 PV 时删除基础 Azure Blob 存储。 默认情况下,存储类还会将容器配置为可扩展,因为 set allowVolumeExpansion 参数设置为 true。

使用 kubectl get sc 命令查看存储类。 以下示例显示了 AKS 群集中提供的 azureblob-fuse-premiumazureblob-nfs-premium 存储类:

NAME                                  PROVISIONER       RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION     AGE
azureblob-fuse-premium               blob.csi.azure.com   Delete          Immediate              true                   23h
azureblob-nfs-premium                blob.csi.azure.com   Delete          Immediate              true                   23h

若要使用这些存储类,请创建一个引用并使用这些类的 PVC 和相应 Pod。 PVC 用于基于存储类自动预配存储。 PVC 可以使用一个预先创建的存储类或用户定义的存储类来为所需的 SKU、大小和协议创建 Azure Blob 存储容器,用于与之通信。 创建 Pod 定义时,将指定 PVC 来请求所需的存储。

使用 StatefulSet

若要为工作负载保留存储卷,可以使用 StatefulSet。 这样,可以更轻松地将现有卷与替换任何失败的 Pod 相匹配。 以下示例演示如何使用 Blobfuse 或 NFS 协议为 Blob 存储设置 StatefulSet。

先决条件

  • 你的 AKS 群集控制平面标识(即 AKS 群集名称)将被添加到 VNet 和 NetworkSecurityGroup 中的参与者角色。
  1. 创建名为 azure-blob-nfs-ss.yaml 的文件,并将其复制到以下 YAML 中。

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: statefulset-blob-nfs
      labels:
        app: nginx
    spec:
      serviceName: statefulset-blob-nfs
      replicas: 1
      template:
        metadata:
          labels:
            app: nginx
        spec:
          nodeSelector:
            "kubernetes.io/os": linux
          containers:
            - name: statefulset-blob-nfs
              image: mcr.azk8s.cn/oss/nginx/nginx:1.19.5
              volumeMounts:
                - name: persistent-storage
                  mountPath: /mnt/blob
      updateStrategy:
        type: RollingUpdate
      selector:
        matchLabels:
          app: nginx
      volumeClaimTemplates:
        - metadata:
            name: persistent-storage
          spec:
            storageClassName: azureblob-nfs-premium
            accessModes: ["ReadWriteMany"]
            resources:
              requests:
                storage: 100Gi
    
  2. 使用 kubectl create 命令创建 StatefulSet:

    kubectl create -f azure-blob-nfs-ss.yaml
    

后续步骤