你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

配置 Cloud Ingest 子卷(预览版)

本文描述了如何在 Azure Arc 启用的 Azure 容器存储中配置云引入子卷。云引入子卷可促进从边缘到 Blob(包括 ADLSgen2)的无限数据引入。 写入此存储类型的文件会无缝传输到 Blob 存储,并在确认上传后在本地清除。 此删除可确保新数据的空间可用性。 此外,此存储选项支持断开连接的环境中的数据完整性,这样在重新连接到网络时,本地存储和同步即可。

例如,可以将文件写入云引入永久性卷声明(PVC),进程会每分钟运行扫描以检查是否有新文件。 标识后,将发送文件以上传到指定的 Blob 目标。 确认成功上传后,Cloud Ingest 子卷会等待 5 分钟,然后删除文件的本地版本。

先决条件

如果最终目标是 Blob 存储或 ADLSgen2,请继续遵循本文中的先决条件和说明。 如果最终目标是 OneLake,请先按照为云子卷配置 OneLake Identity 中的说明操作。

  1. 按照 “创建 Azure 存储帐户”中的说明创建存储帐户。

    注释

    创建存储帐户时,建议在 Kubernetes 群集所在的资源组和区域/位置下创建存储帐户。

  2. 在你之前创建的存储帐户中创建一个容器,按照快速入门:使用 Azure 门户上传、下载和列出 Blob >中的创建容器的说明进行操作。

配置扩展标识

边缘卷允许使用系统分配的扩展标识来访问 Blob 存储。 本部分介绍如何使用系统分配的扩展标识授予对存储帐户的访问权限,从而允许将 Cloud Ingest 子卷上传到这些存储系统。

如果要将工作负载身份与已启用 Azure Arc 的 Azure 容器存储配合使用,请按照 配置云子卷的工作负载身份中的说明进行操作。

Azure 门户

  1. 导航到已启用 Arc 的群集。
  2. 选择扩展
  3. 选择通过 Azure Arc 扩展启用的 Azure 容器存储。
  4. 记下 群集扩展详细信息下的主体 ID。

为扩展标识配置 Blob 存储帐户

向存储帐户添加扩展标识权限

  1. 在 Azure 门户中导航到存储帐户。
  2. 选择“访问控制 (IAM)”。
  3. 选择 “Add+ -> 添加角色分配”
  4. 选择 存储 Blob 数据所有者,然后选择 下一步
  5. 选择 +选择成员
  6. 要将您的主体 ID 添加到 所选成员: 列表中,请粘贴该 ID,然后选择其旁边的 +
  7. 单击“选择”。
  8. 若要查看和分配权限,请选择“ 下一步”,然后选择“ 审阅 + 分配”。

创建云引入永久性卷声明 (PVC)

若要为引入子卷创建 PVC,请使用以下过程:

  1. 创建包含以下内容的文件 cloudIngestPVC.yaml

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      ### Create a name for your PVC ###
      name: <create-persistent-volume-claim-name-here>
      ### Use a namespace that matched your intended consuming pod, or "default" ###
      namespace: <intended-consuming-pod-or-default-here>
    spec:
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 2Gi
      storageClassName: cloud-backed-sc
    

    注释

    只使用小写字母和短划线。 有关详细信息,请参阅 Kubernetes 对象命名文档

    • 编辑metadata.name值并为 PVC 创建名称。 在下一步中,此名称在 deploymentExample.yaml 的最后一行上引用。
    • 使用预期的消耗 Pod 更新 metadata.namespace 值。 如果没有预期的使用 Pod,请将其值设置为 default
    • spec.resources.requests.storage 参数确定永久性卷的大小。 此示例中为 2 GB,但可以修改以满足你的需求。
  2. 若要应用 cloudIngestPVC.yaml,请运行:

    kubectl apply -f "cloudIngestPVC.yaml"
    

将引入子卷附加到 Edge 卷

要为 Ingest 创建子卷,请使用扩展标识连接到存储帐户容器,并按照以下过程操作:

  1. 运行以下命令以获取您创建的 Edge Volume 的名称:

    kubectl get edgevolumes
    
  2. 创建包含以下内容的文件 ingestSubvolume.yaml

    apiVersion: "arccontainerstorage.azure.net/v1"
    kind: IngestSubvolume
    metadata:
      name: <create-a-subvolume-name-here>
    spec:
      edgevolume: <your-edge-volume-name-here>
      path: ingestSubDir # Don't use a preceding slash
      authentication:
        authType: MANAGED_IDENTITY
      storageAccountEndpoint: "https://<STORAGE ACCOUNT NAME>.blob.core.windows.net/"
      containerName: <your-blob-storage-account-container-name>
      ingest:
        order: newest-first
        minDelaySec: 60
      eviction:
        order: unordered
        minDelaySec: 120
      onDelete: trigger-immediate-ingest
    

    注释

    只使用小写字母和短划线。 有关详细信息,请参阅 Kubernetes 对象命名文档

    • metadata.name:为子卷创建名称。
    • spec.edgevolume:此名称是从上一步检索的。
    • spec.path:在装载路径下创建自己的子目录名称。 默认名称为 ingestSubDir
    • spec.authentication.authType:这应该是 MANAGED_IDENTITYWORKLOAD_IDENTITY,具体取决于所选的身份验证机制。
    • spec.storageAccountEndpoint:在 Azure 门户中导航到存储帐户。 在屏幕右上角的“概述”页上,选择“JSON 视图”。 可以在 properties.primaryEndpoints.blob 下找到链接。 复制整个链接。
    • spec.containerName:存储帐户中的容器名称。

    以下变量具有合理的默认值,但可以更改:

    • spec.ingest.order:上传脏文件的顺序。 这是尽最大努力,而不是保证。 顺序选项为:oldest-firstnewest-first
    • spec.ingest.minDelaySec:脏文件符合引入条件前的最小秒数。 此数字可以介于 0 到 31536000 之间(以秒为单位的年份)。
    • spec.eviction.order:将文件上传到云后如何删除它们。 逐出顺序的选项为:unorderednever
    • spec.eviction.minDelaySec:干净文件符合逐出条件前的秒数。 此数字可以介于 0 到 31536000 之间(以秒为单位的年份)。
    • spec.onDelete:请求删除此 IngestSubVolume 时执行的操作。 trigger-immediate-ingest选项将立即将所有文件标记为符合引入条件并尝试引入这些文件,或者abandon将放弃此引入子卷中的所有数据并删除子卷。

    注释

    如果为 值选择spec.onDelete,则子卷中的所有脏数据都会丢失。 在选择此选项之前,请小心并注意这一点。

  3. 若要应用 ingestSubvolume.yaml,请运行:

    kubectl apply -f "ingestSubvolume.yaml"
    

连接您的应用程序(Kubernetes 原生应用程序)

为 PVC 配置一个通用的单一 Pod(Kubernetes 原生应用程序)以利用引入功能,请按照以下步骤进行:

  1. 创建包含以下内容的文件 deploymentExample.yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: cloudingestsubvol-deployment ### This must be unique for each deployment you choose to create.
    spec:
      replicas: 2
      selector:
        matchLabels:
          name: acsa-testclientdeployment
      template:
        metadata:
          name: acsa-testclientdeployment
          labels:
            name: acsa-testclientdeployment
        spec:
          affinity:
            podAntiAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
              - labelSelector:
                  matchExpressions:
                  - key: app
                    operator: In
                    values:
                    - acsa-testclientdeployment
                topologyKey: kubernetes.io/hostname
          containers:
            ### Specify the container in which to launch the busy box. ###
            - name: ingest-deployment-container
              image: mcr.microsoft.com/azure-cli:2.57.0@sha256:c7c8a97f2dec87539983f9ded34cd40397986dcbed23ddbb5964a18edae9cd09
              command:
                - "/bin/sh"
                - "-c"
                - "dd if=/dev/urandom of=/data/ingestSubDir/acsaingesttestfile count=16 bs=1M && while true; do ls /data &>/dev/null || break; sleep 1; done"
              volumeMounts:
                ### This name must match the volumes.name attribute below ###
                - name: acsa-volume
                  ### This mountPath is where the PVC is attached to the pod's filesystem ###
                  mountPath: "/data"
          volumes:
              ### User-defined 'name' that's used to link the volumeMounts. This name must match volumeMounts.name as previously specified. ###
            - name: acsa-volume
              persistentVolumeClaim:
                ### This claimName must refer to your PVC metadata.name (Line 5)
                claimName: <your-pvc-metadata-name-from-line-5-of-pvc-yaml>
    

    注释

    只使用小写字母和短划线。 有关详细信息,请参阅 Kubernetes 对象命名文档

    • 编辑containers.namevolumes.persistentVolumeClaim.claimName值。
    • 如果在 spec.path 中编辑了 值,则必须使用新的路径名称更新此文件上的 ingestSubDir 值。
    • spec.replicas 参数确定要创建的副本 Pod 数。 在此示例中为 2,但可以修改以满足你的需求。
  2. 若要应用 deploymentExample.yaml 并创建 Pod,请运行:

    kubectl apply -f "deploymentExample.yaml"
    
  3. 请查找您的 Pod 的名称,以便在下一步中使用:

    kubectl get pods
    

    注释

    由于在 spec.replicas 中使用 2 指定 ,因此会创建两个 Pod。 可以将任意一个 Pod 名称用于下一步。

  4. 运行以下命令以启动 pod 中的 exec。 请将 <name-of-pod> 替换为上一步骤中的 Pod 名称。

    kubectl exec -it <name-of-pod> -- sh
    
  5. 将目录更改为 /data 文件指定的 装载路径:

    cd /data
    
  6. 应会看到一个与您在spec.path中设置的匹配的目录。 如果使用了默认值,则其名称为 ingestSubDir。 切换到该子目录:

    cd ingestSubDir
    
  7. 例如,创建一个名为file1.txt的文件并写入内容:

    echo "Hello World" > file1.txt
    

    此文件将上传到 Blob 存储帐户容器,然后在 5 分钟后在本地清除。

  8. 在 Azure 门户中,导航到存储帐户,找到与您在spec.containerName中设置的值匹配的容器。 应在容器中找到填充的file1.txt。 如果文件尚不存在,请等待大约 1 分钟,因为 Edge Volumes 在上传之前会等待一分钟。

后续步骤