使用 Azure Kubernetes Fleet Manager 资源放置在多个群集之间部署群集作用域资源

适用于: ✔️具有中心群集的 Fleet Manager

Azure Kubernetes Fleet Manager 的资源放置功能使您能够跨 Fleet 中的多个群集分发和同步群集作用域资源,包括命名空间及其子资源。 此功能通过确保整个基础结构中的资源配置一致、减少手动开销,并使你能够使用单个事实来源大规模管理复杂的工作负荷,从而简化了多群集部署。 本文逐步介绍如何 ClusterResourcePlacement 将命名空间及其工作负载分发到成员群集。

若要在命名空间内分发单个资源,请参阅 有关命名空间范围资源放置的文档

可以使用Azure门户或Azure CLI完成本文中的步骤。

注释

可以将 Fleet Manager 的资源放置功能与 AKS 和已启用 Azure Arc 的 Kubernetes 群集配合使用。

在您开始之前

将命名空间及其资源分发到成员群集

使用拥有一个 DeploymentService 的简单场景,将其部署到 fleet 中的所有集群。 在您的 Fleet Manager 中心群集上创建一个命名空间,将工作负载添加到其中,然后使用 ClusterResourcePlacement 并通过 PickAll 放置策略,将该命名空间及其所有内容分发到所有成员群集。

  1. 为订阅 ID、资源组和 Kubernetes 舰队资源设置以下环境变量:

    export SUBSCRIPTION_ID=<subscription-id>
    export GROUP=<resource-group-name>
    export FLEET=<fleet-name>
    
  2. 使用 [az account set][az-account-set] 命令设置默认Azure订阅:

    az account set \
        --subscription ${SUBSCRIPTION_ID}
    
  3. 使用 [az fleet get-credentials][az-fleet-get-credentials] 命令获取 Kubernetes Fleet 中心群集的 kubeconfig 文件:

    az fleet get-credentials \
        --resource-group ${GROUP} \
        --name ${FLEET}
    

    输出应如下所示。

    Merged "hub" as current context in /home/fleet/.kube/config
    

    注释

    如果您收到类型为 InvalidHubOperation 的错误,且错误消息提示该 fleet 没有 hub,请添加一个 hub 集群。 有关详细信息,请参阅 升级中心群集类型

  4. 在中心群集上创建命名空间。

    kubectl create namespace test-app
    
  5. 将以下 YAML 另存为 test-workload.yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
      namespace: test-app
    spec:
      selector:
        matchLabels:
          app: nginx
      replicas: 2
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: mcr.microsoft.com/azurelinux/base/nginx:1.28@sha256:3352a36cbcab4708883a3e77b64f64159e11e1aab358c010e1c4e465dbfb4f57
            ports:
            - containerPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-service
      namespace: test-app
    spec:
      selector:
        app: nginx
      ports:
      - protocol: TCP
        port: 80
        targetPort: 80
      type: LoadBalancer
    
  6. 使用 kubectl将测试工作负荷暂存到 Fleet Manager 中心群集上。

    kubectl apply -f test-workload.yaml
    
  7. 将以下 YAML 另存为 crp-distribute-workload.yaml

    apiVersion: placement.kubernetes-fleet.io/v1
    kind: ClusterResourcePlacement
    metadata:
      name: distribute-test-app
    spec:
      resourceSelectors:
        - group: ""
          kind: Namespace
          version: v1          
          name: test-app
      policy:
        placementType: PickAll
    
  8. 将部署位置清单应用到 Fleet Manager 中心集群。

    kubectl apply -f crp-distribute-workload.yaml
    

    注释

    清单一经应用,资源部署便会立即开始。 使用隐式 RollingUpdate 策略。 若要了解如何对推出进行其他控制,请参阅 定义资源放置的推出策略

  9. 查看资源部署进度。

kubectl get clusterresourceplacement distribute-test-app

输出应类似于以下示例:

NAME                   GEN   SCHEDULED   SCHEDULEDGEN   APPLIED   APPLIEDGEN   AGE
distribute-test-app    2     True        2              True      2            10s
  1. 查看投放详情。
kubectl describe clusterresourceplacement distribute-test-app

输出应类似于以下示例:

Name:         distribute-test-app
Namespace:    
Labels:       <none>
Annotations:  <none>
API Version:  placement.kubernetes-fleet.io/v1
Kind:         ClusterResourcePlacement
Metadata:
  Creation Timestamp:  2024-04-01T18:55:31Z
  Finalizers:
    kubernetes-fleet.io/crp-cleanup
    kubernetes-fleet.io/scheduler-cleanup
  Generation:        2
  Resource Version:  6949
  UID:               815b1d81-61ae-4fb1-a2b1-06794be3f986
Spec:
  Policy:
    Placement Type:  PickAll
  Resource Selectors:
    Group:                 
    Kind:                  Namespace
    Name:                  test-app
    Version:               v1
  Revision History Limit:  10
  Strategy:
    Type:  RollingUpdate
Status:
  Conditions:
    Last Transition Time:   2024-04-01T18:55:31Z
    Message:                found all the clusters needed as specified by the scheduling policy
    Observed Generation:    2
    Reason:                 SchedulingPolicyFulfilled
    Status:                 True
    Type:                   ClusterResourcePlacementScheduled
    Last Transition Time:   2024-04-01T18:55:36Z
    Message:                All 3 cluster(s) are synchronized to the latest resources on the hub cluster
    Observed Generation:    2
    Reason:                 SynchronizeSucceeded
    Status:                 True
    Type:                   ClusterResourcePlacementSynchronized
    Last Transition Time:   2024-04-01T18:55:36Z
    Message:                Successfully applied resources to 3 member clusters
    Observed Generation:    2
    Reason:                 ApplySucceeded
    Status:                 True
    Type:                   ClusterResourcePlacementApplied
  Observed Resource Index:  0
  Placement Statuses:
    Cluster Name:  membercluster1
    Conditions:
      Last Transition Time:  2024-04-01T18:55:31Z
      Message:               Successfully scheduled resources for placement in membercluster1 (affinity score: 0, topology spread score: 0): picked by scheduling policy
      Observed Generation:   2
      Reason:                ScheduleSucceeded
      Status:                True
      Type:                  ResourceScheduled
      Last Transition Time:  2024-04-01T18:55:36Z
      Message:               Successfully Synchronized work(s) for placement
      Observed Generation:   2
      Reason:                WorkSynchronizeSucceeded
      Status:                True
      Type:                  WorkSynchronized
      Last Transition Time:  2024-04-01T18:55:36Z
      Message:               Successfully applied resources
      Observed Generation:   2
      Reason:                ApplySucceeded
      Status:                True
      Type:                  ResourceApplied
    Cluster Name:            membercluster2
    Conditions:
      Last Transition Time:  2024-04-01T18:55:31Z
      Message:               Successfully scheduled resources for placement in membercluster2 (affinity score: 0, topology spread score: 0): picked by scheduling policy
      Observed Generation:   2
      Reason:                ScheduleSucceeded
      Status:                True
      Type:                  ResourceScheduled
      Last Transition Time:  2024-04-01T18:55:36Z
      Message:               Successfully Synchronized work(s) for placement
      Observed Generation:   2
      Reason:                WorkSynchronizeSucceeded
      Status:                True
      Type:                  WorkSynchronized
      Last Transition Time:  2024-04-01T18:55:36Z
      Message:               Successfully applied resources
      Observed Generation:   2
      Reason:                ApplySucceeded
      Status:                True
      Type:                  ResourceApplied
    Cluster Name:            membercluster3
    Conditions:
      Last Transition Time:  2024-04-01T18:55:31Z
      Message:               Successfully scheduled resources for placement in membercluster3 (affinity score: 0, topology spread score: 0): picked by scheduling policy
      Observed Generation:   2
      Reason:                ScheduleSucceeded
      Status:                True
      Type:                  ResourceScheduled
      Last Transition Time:  2024-04-01T18:55:36Z
      Message:               Successfully Synchronized work(s) for placement
      Observed Generation:   2
      Reason:                WorkSynchronizeSucceeded
      Status:                True
      Type:                  WorkSynchronized
      Last Transition Time:  2024-04-01T18:55:36Z
      Message:               Successfully applied resources
      Observed Generation:   2
      Reason:                ApplySucceeded
      Status:                True
      Type:                  ResourceApplied
  Selected Resources:
    Kind:     Namespace
    Name:     my-namespace
    Version:  v1
Events:
  Type    Reason                     Age   From                                   Message
  ----    ------                     ----  ----                                   -------
  Normal  PlacementScheduleSuccess   108s  cluster-resource-placement-controller  Successfully scheduled the placement
  Normal  PlacementSyncSuccess       103s  cluster-resource-placement-controller  Successfully synchronized the placement
  Normal  PlacementRolloutCompleted  103s  cluster-resource-placement-controller  Resources have been applied to the selected clusters
  1. 在 Azure 门户中,转到你的车队管理器。

  2. 在服务菜单上的 “机群资源”下,选择“ 命名空间>+ 创建”。

    注释

    如果未看到 “舰队资源”,则群管理器没有中心群集。 有关如何添加群集的详细信息,请参阅 升级中心群集类型

  3. 在菜单中,选择 命名空间,输入 名称,然后选择“ 创建”。

    Azure门户的屏幕截图,其中显示了在 Fleet Manager 中心群集上创建的名为测试应用的命名空间。

    片刻之后,页面将刷新,命名空间显示在 Fleet Manager 中心群集的命名空间列表中。 现在它已准备就绪,可以托管你想要分发到各个成员集群的任何资源。

  4. 在命名空间列表顶部,选择“ + 创建>应用 YAML”,并使用以下示例。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
      namespace: test-app
    spec:
      selector:
        matchLabels:
          app: nginx
      replicas: 2
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: mcr.microsoft.com/azurelinux/base/nginx:1.28@sha256:3352a36cbcab4708883a3e77b64f64159e11e1aab358c010e1c4e465dbfb4f57
            ports:
            - containerPort: 80
    
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-service
      namespace: test-app
    spec:
      selector:
        app: nginx
      ports:
      - protocol: TCP
        port: 80
        targetPort: 80
      type: LoadBalancer
    

    复制并粘贴这些示例,然后按照下图所示逐个应用。

    Azure 门户的屏幕截图,显示“使用 YAML 应用”对话框,其中已填入一个可应用到 Fleet Manager 中心群集的部署。

    命名空间及其工作负载现已准备好分发到成员群集。 部署和服务未在 Fleet Manager 中心群集上计划。

  5. 在服务菜单上的 “机群资源”下,选择 “资源位置>+ 创建”。

  6. 在“基本信息”选项卡上,配置以下选项:

    • “投放详情”中,输入投放名称。

    • “资源详细信息”下,将 范围 保留为 群集范围 ,并输入要分发的资源的组版本类型(GVK)和名称。 在此示例中,使用以下值。

      group: ""
      kind: Namespace
      version: v1          
      name: test-app
      
    • “成员集群选择” 中,将 “放置类型” 选择为 “所有集群”

    • 对于 Rollout,请保持 滚动更新 策略为选中状态。

    Azure 门户的屏幕截图,显示了名为 test-app 的命名空间的群集范围资源放置已填写完成的“基本信息”选项卡。

  7. 选择 “下一步 ”以查看生成的 ClusterResourcePlacement 清单。 如果需要,可以修改清单,使用 “验证”(试运行) 选项进行验证,或选择“ 查看 + 创建 ”以继续进行最终确认。

    Azure 门户的屏幕截图,显示“查看 YAML”选项卡,其中名为 test-app 的命名空间的群集范围资源放置已通过试运行验证。

  8. 选择 “创建 ”以立即开始分发命名空间。

    Azure 门户的截图,显示了名为 test-app 的命名空间的群集范围资源放置的“查看 + 创建”选项卡。

    注释

    使用所选的 RollingUpdate 策略应用资源放置后,资源部署会立即开始。 若要了解如何进一步控制部署,请参阅 定义资源放置的部署策略

  9. 页面刷新后,资源放置位置列表中会显示新创建的放置位置。 它显示所选集群的数量,以及舰队调度器是否可以满足放置策略要求。

    Azure门户的屏幕截图,其中显示了资源放置列表,其中包含名为 distribut-test-app 的单个资源放置。

  10. 在列表中选择相应的投放位置名称,即可查看其投放状态。 选择单个群集以查看该群集上的资源部署情况。

    Azure门户的屏幕截图,其中显示了名为 distribut-test-app 的资源放置的详细推出信息。

在选定的 Kubernetes 群集上,可以找到已部署和操作的命名空间、部署和服务。

删除该部署以移除资源

删除 Fleet Manager 中心群集上的资源位置时,将从所选成员群集中删除分布式资源。

kubectl delete clusterresourceplacement distribute-test-app
  1. 在服务菜单中的舰队资源下,选择资源位置

  2. 在资源放置列表中,选择相应的放置项,然后选择删除

  3. “删除”上,验证是否选择了正确的位置。 准备就绪后,选择“确认删除”“删除”。>

    Azure门户的屏幕截图,其中显示了正在删除的名为 distribut-test-app 的资源放置。

  4. 页面将刷新,位置不再显示在列表中。 将从成员群集中删除资源。

若要了解有关资源放置的详细信息,请参阅以下资源: