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

配置云镜像子卷(预览版)

本文介绍如何在 Azure Arc 启用的 Azure 容器存储中配置云镜像子卷(将数据从云同步到边缘)。从概念上讲,云镜像子卷是将数据从云目标 镜像 到边缘作为只读副本的位置。 频率控制镜像同步何时发生,而无需直接用户干预,例如每小时或某一天一次。 OneShot 功能允许用户在选择时立即执行同步,但同时系统会执行一次性同步操作,之后系统会按设定频率恢复到正常安排。

重要

云镜像子卷目前处于预览状态。 不建议对生产工作负荷使用此功能。 如果有任何问题或需要有关配置的帮助,或者要提供反馈, 请联系我们的团队

先决条件

如果镜像根位置是 Blob 存储或 ADLSgen2,请继续遵循本文中的先决条件和说明。 如果镜像根位置为 OneLake,请先按照 配置 OneLake Identity for Cloud 子卷 中的说明进行操作。

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

    注释

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

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

配置扩展标识

边缘卷允许使用系统分配的扩展标识来访问 Blob 存储。 本部分介绍如何使用系统分配的扩展标识授予对存储帐户的访问权限,以便将数据从这些位置镜像到边缘位置。

如果要将工作负载身份与已启用 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. 创建包含以下内容的文件 cloudMirrorPVC.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. 若要应用 cloudMirrorPVC.yaml,请运行:

    kubectl apply -f "cloudMirrorPVC.yaml"
    

将镜像子卷附加到边缘卷

要为 Mirror 创建一个子卷,并使用扩展标识连接到存储帐户容器,请按照以下步骤操作:

  1. 运行以下命令以获取您创建的 Edge Volume 的名称:
kubectl get edgevolumes
  1. 创建包含以下内容的文件 mirrorSubvolume.yaml

    apiVersion: "arccontainerstorage.azure.net/v1"
    kind: MirrorSubvolume
    metadata:
      name: <create-a-subvolume-name-here>
    spec:
      edgevolume: <your-edge-volume-name-here>
      path: mirrorSubDir # Don't use a preceding slash
      authentication:
        authType: MANAGED_IDENTITY
      blobAccount:
        accountEndpoint: "https://<STORAGE ACCOUNT NAME>.blob.core.windows.net/"
        containerName: <your-blob-storage-account-container-name>
        indexTagsMode: NoIndexTags
      blobFiltering:
        blobNamePrefix:
      schedule:
        frequency: "@hourly"
        oneshot:
    

    注释

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

    • metadata.name:为子卷创建名称。
    • spec.edgevolume:此名称是从上一步检索的。
    • spec.path:在装载路径下创建自己的子目录名称。 默认名称为 mirrorSubDir
    • spec.authentication.authType:这应该是 MANAGED_IDENTITYWORKLOAD_IDENTITY,具体取决于所选的身份验证机制。
    • spec.blobAccount.accountEndpoint:在 Azure 门户中导航到存储帐户。 在屏幕右上角的“概述”页上,选择“JSON 视图”。 可以在 properties.primaryEndpoints.blob 下找到链接。 复制整个链接。
    • spec.blobAccount.containerName:存储帐户中的容器名称。
    • spec.blobAccount.indexTagsModeNoIndexTagsMirrorIndexTagsMirrorIndexTags需要“存储 Blob 数据所有者”权限,且在设置时,索引标记将转换为相应的 azindex.<name> xattrsNoIndexTags仅需要“存储 Blob 数据读取者”权限,且在设置时,它会保持索引标记 xattrs 未设置。
    • spec.blobFiltering.blobNamePrefix:用于筛选 Blob 的可选前缀。 例如,如果值是 blobNamePrefix: a,则它仅镜像名称以 a 开头的 blob。
    • spec.schedule.frequency:设置镜像运行的时间安排。 选项包括:@annually、、@yearly@monthly、、@weekly@daily@hourly"never"或 cron 语法(五位数,第一个是分钟(0-59),第二个是小时(0-23),第三个是天(1-31),第四个是月(1-12),第五个是一周的第五天(0-6)
    • spec.schedule.oneshot:默认情况下,留空。 如果在此处指定了 uuid,则会触发“立即”同步。如果在创建时指定了 uuid,则子卷会在初始创建时执行同步,然后根据频率执行同步。 如果在创建时此参数为空,则子卷在最初创建时不进行同步,然后按照频率进行同步。 可以在 uuidgenerator.netsed -i "s/oneshot: .*/oneshot: $(uuidgen)/" mirrorSubvolume.yaml 生成 UUIDs。
  2. 若要应用 mirrorSubvolume.yaml,请运行:

    kubectl apply -f "mirrorSubvolume.yaml"
    

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

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

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

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: cloudmirrorsubvol-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: mirror-deployment-container
              image: mcr.microsoft.com/azure-cli:2.57.0@sha256:c7c8a97f2dec87539983f9ded34cd40397986dcbed23ddbb5964a18edae9cd09
              command:
                - "/bin/sh"
                - "-c"
                - "while true; do ls /data/mirrorSubDir &>/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值。
    • 如果您在 mirrorSubvolume.yaml 文件中编辑了spec.path的值,则必须将此文件中的mirrorSubDir更新为新的路径名称。
    • spec.replicas 参数确定要创建的副本 Pod 数。 在此示例中为 2,但可以修改以满足你的需求。
  2. 若要应用 deploymentExample.yaml 并创建 Pod,请运行:

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

    kubectl get pods
    

    注释

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

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

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

    cd /data
    
  6. 您应该会看到一个与您在mirrorSubvolume.yaml中设置的值匹配的目录。 如果使用了默认值,则其名称为 mirrorSubDir。 切换到该子目录,检查目录下是否有镜像的内容。

    cd mirrorSubDir
    ls
    

如果在创建时在 spec.schedule.oneshot 字段中指定了 uuid,并且/或满足指定的 spec.schedule.frequency 要求,则子卷应在初始创建时执行同步,并且应在此处看到从指定的存储帐户容器镜像的数据。 如果未满足其中任一条件,则此目录应为空。

检查云镜像子卷同步的状态

首先,检查mirrorSubvolume的状态。 接下来,请确保在 Azure 中的存储帐户容器中具有数据。 最后,再次检查 Mirror 子卷的内容,以确保数据已正确镜像。

检查镜像子卷状态

检查镜像子卷的状态,特别是检查 BACKENDCONNECTION 字段是否已“连接”

kubectl get mirrorsubvolumes

将数据添加到存储帐户容器

如果指定容器中还没有数据,请使用以下方法之一上传文件:

将文件添加或移动到 Blob 存储帐户容器,以便可以在边缘集群上镜像这些文件。

触发镜像同步

  1. 若要确保新数据从云镜像到子卷,请将文件 mirrorSubvolume.yaml 中的 spec.schedule.oneshot 字段更新为新的 uuid。 可以在 uuidgenerator.net 或使用以下命令生成 Uuid:

    sed -i "s/oneshot: .*/oneshot: $(uuidgen)/" mirrorSubvolume.yaml
    
  2. 若要应用更改,从而触发 oneshot 同步,请运行:

    kubectl apply -f "mirrorSubvolume.yaml"
    

重新检查镜像子卷

  1. 再次检查镜像子卷状态,以确保 BACKENDCONNECTION 字段仍然显示为“已连接”

    kubectl get mirrorsubvolumes
    
  2. 完成后,我们可以检查 Mirror 子卷的内容。 为此,可以运行以下命令,连接我们创建的示例 Pod:

    kubectl exec -it <name-of-pod> -- sh
    

    现在,您应该会看到云存储帐户中的文件同步到此子卷中。

后续步骤