使用群集资源传播(预览版)

Azure Kubernetes 舰队管理器(舰队)资源传播基于开源云原生多群集解决方案,允许根据指定条件将任何 Kubernetes 对象部署到舰队成员群集。 工作负荷业务流程可以处理许多需要跨多个群集部署应用程序(包括以下内容等)的用例:

  • 需要位于舰队中的所有群集上的基础结构应用程序
  • 一个 Web 应用程序,应部署到不同区域中的多个群集以实现高可用性,并且应以不中断的方式推出更新
  • 批处理计算应用程序,应部署到具有廉价现成节点池的群集

舰队工作负荷放置可以将任何 Kubernetes 对象部署到群集,以便将资源部署到中心成员群集,必须在舰队中心群集中创建对象,并且必须创建 ClusterResourcePlacement 对象来指示应如何放置对象。

显示 Kubernetes 资源如何传播到成员群集的示意图。

重要

Azure Kubernetes 舰队管理器预览功能是可选择启用的自助功能。 预览功能是“按现状”和“按可用”提供的,不包括在服务级别协议和有限保证中。 客户支持部门会尽力为 Azure Kubernetes 舰队管理器预览功能提供部分支持。 因此,这些功能并不适合用于生产。

先决条件

  • 阅读此功能的概念概述,其中对本文档中引用的 MemberClusterClusterResourcePlacement 进行了说明。
  • 必须具有包含一个中心群集和多个成员群集的舰队资源。 如果没有此资源,请按照快速入门:创建舰队资源并加入成员群集进行操作。
  • 必须在中心群集中适当标记成员群集,以匹配所需的选择条件。 示例标签可能包括区域、环境、团队、可用性区域、节点可用性或所需的任何其他内容。
  • 必须按照访问舰队资源的 Kubernetes API 中的步骤获取中心群集 Kubernetes API 的访问权限。

具有 ClusterResourcePlacement 资源的资源放置

ClusterResourcePlacement 对象用于告知舰队日程安排如何将给定的群集范围对象从中心群集放置到成员群集中。 选择命名空间范围的对象(如 Deployment、StatefulSets、DaemonSets、ConfigMaps、Secrets 和 PersistentVolumeClaims)包含的命名空间时,包含这些对象。 (为了传播到成员群集,且不产生任何意外的副作用,ClusterResourcePlacement 对象支持使用 ConfigMap 来封装对象。)可以使用多种选择方法:

  • 组、版本和种类 - 选择并放置给定类型的所有资源
  • 组、版本、种类和名称 - 选择并放置给定类型的一个特定资源
  • 组、版本、种类和标签 - 选择并放置与提供的标签匹配的给定类型的所有资源

选择资源后,可以使用多种类型的放置:

  • PickAll 将资源放入所有可用成员群集中。 此策略可用于放置基础结构工作负荷,例如群集监视或报告应用程序。
  • PickFixed 按名称将资源放入成员群集的特定列表中。
  • PickN 是最灵活的放置选项,允许根据相关性或拓扑分布约束选择群集,并且在将工作负荷分散到多个适当的群集以确保可用性时非常有用。

使用 PickAll 放置策略

若要在舰队中的所有成员群集上部署工作负荷(可选匹配一组条件),可以使用 PickAll 放置策略。 若要在标有 environment: production 的所有群集中部署 test-deployment命名空间及其中的所有对象,请创建 ClusterResourcePlacement 对象,如下所示:

apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ClusterResourcePlacement
metadata:
  name: crp-1
spec:
  policy:
    placementType: PickAll
    affinity:
        clusterAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
                clusterSelectorTerms:
                - labelSelector:
                    matchLabels:
                        environment: production
  resourceSelectors:
    - group: ""
      kind: Namespace
      name: prod-deployment
      version: v1

此简单策略采用 test-deployment 命名空间及其中包含的所有资源,并将其部署到具有给定 environment 标签的舰队中的所有成员群集。 如果需要所有群集,请完全移除 affinity 术语。

使用 PickFixed 放置策略

如果工作负荷应部署到一组已知的成员群集中,则可以使用 PickFixed 策略按名称选择群集。 此 ClusterResourcePlacementtest-deployment 命名空间部署到成员群集 cluster1cluster2

apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ClusterResourcePlacement
metadata:
  name: crp-2
spec:
  policy:
    placementType: PickFixed
    clusterNames:
    - cluster1
    - cluster2
  resourceSelectors:
    - group: ""
      kind: Namespace
      name: test-deployment
      version: v1

使用 PickN 放置策略

PickN 放置策略是最灵活的选项,允许根据相关性和拓扑分布约束将资源放置在可配置数量的群集中。

具有相关性的 PickN

将相关性与 PickN 函数一起使用与将相关性与 Pod 日程安排一起使用类似。 可以同时设置必需和首选相关性。 必需相关性可防止放置与它们不匹配的群集;首选相关性允许在做出放置决策时对有效群集集进行排序。

例如,以下 ClusterResourcePlacement 对象将工作负荷放置于三个群集中。 只有具有标签 critical-allowed: "true" 的群集是有效的放置目标,并优先选择具有标签 critical-level: 1 的群集:

apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ClusterResourcePlacement
metadata:
  name: crp
spec:
  resourceSelectors:
    - ...
  policy:
    placementType: PickN
    numberOfClusters: 3
    affinity:
        clusterAffinity:
            preferredDuringSchedulingIgnoredDuringExecution:
              weight: 20
              preference:
              - labelSelector:
                  matchLabels:
                    critical-level: 1
            requiredDuringSchedulingIgnoredDuringExecution:
                clusterSelectorTerms:
                - labelSelector:
                    matchLabels:
                      critical-allowed: "true"

具有拓扑分布约束的 PickN

拓扑分布约束可用于强制跨拓扑边界划分群集放置,以满足可用性要求(例如,跨区域拆分放置或更新通道)。 如果无法满足约束(whenUnsatisfiable: DoNotSchedule)或尽可能安排(whenUnsatisfiable: ScheduleAnyway),还可以配置拓扑分散约束以防止日程安排。

ClusterResourcePlacement 对象将给定的资源集分散到多个区域,并尝试在不同的更新日跨成员群集进行日程安排:

apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ClusterResourcePlacement
metadata:
  name: crp
spec:
  resourceSelectors:
    - ...
  policy:
    placementType: PickN
    topologySpreadConstraints:
    - maxSkew: 2
      topologyKey: region
      whenUnsatisfiable: DoNotSchedule
    - maxSkew: 2
      topologyKey: updateDay
      whenUnsatisfiable: ScheduleAnyway

有关放置如何与拓扑分散约束配合使用的更多详细信息,请查看有关该主题的开源舰队项目中的文档。

更新策略

Azure Kubernetes 舰队使用滚动更新策略来控制如何在多个群集放置上推出更新。 此示例中的默认设置为:

apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ClusterResourcePlacement
metadata:
  name: crp
spec:
  resourceSelectors:
    - ...
  policy:
    ...
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 25%
      maxSurge: 25%
      unavailablePeriodSeconds: 60

计划程序将按顺序滚动更新到每个群集,至少在群集之间等待 unavailablePeriodSeconds。 如果所有资源都已正确应用于群集,则推出状态被视为成功。 推出状态检查不会级联到子资源 - 例如,它不会确认部署创建的 Pod 是否已准备就绪。

有关群集推出策略的更多详细信息,请参阅开源项目中的推出策略文档。

放置状态

舰队计划程序将有关放置决策的详细信息和状态更新到 ClusterResourcePlacement 对象。 可以通过 kubectl describe crp <name> 命令查看此信息。 输出包括以下信息:

  • 当前适用于放置的条件,包括是否已成功完成放置
  • 每个成员群集的放置状态部分,其中显示了部署到该群集的状态

此示例显示了一个 ClusterResourcePlacement,它使用 PickNtest 命名空间及其包含的 test-1 ConfigMap 部署到两个成员群集中。 放置已成功完成,资源已放入 aks-member-1aks-member-2 群集中。

Name:         crp-1
Namespace:
Labels:       <none>
Annotations:  <none>
API Version:  placement.kubernetes-fleet.io/v1beta1
Kind:         ClusterResourcePlacement
Metadata:
  ...
Spec:
  Policy:
    Number Of Clusters:  2
    Placement Type:      PickN
  Resource Selectors:
    Group:
    Kind:                  Namespace
    Name:                  test
    Version:               v1
  Revision History Limit:  10
Status:
  Conditions:
    Last Transition Time:  2023-11-10T08:14:52Z
    Message:               found all the clusters needed as specified by the scheduling policy
    Observed Generation:   5
    Reason:                SchedulingPolicyFulfilled
    Status:                True
    Type:                  ClusterResourcePlacementScheduled
    Last Transition Time:  2023-11-10T08:23:43Z
    Message:               All 2 cluster(s) are synchronized to the latest resources on the hub cluster
    Observed Generation:   5
    Reason:                SynchronizeSucceeded
    Status:                True
    Type:                  ClusterResourcePlacementSynchronized
    Last Transition Time:  2023-11-10T08:23:43Z
    Message:               Successfully applied resources to 2 member clusters
    Observed Generation:   5
    Reason:                ApplySucceeded
    Status:                True
    Type:                  ClusterResourcePlacementApplied
  Placement Statuses:
    Cluster Name:  aks-member-1
    Conditions:
      Last Transition Time:  2023-11-10T08:14:52Z
      Message:               Successfully scheduled resources for placement in aks-member-1 (affinity score: 0, topology spread score: 0): picked by scheduling policy
      Observed Generation:   5
      Reason:                ScheduleSucceeded
      Status:                True
      Type:                  ResourceScheduled
      Last Transition Time:  2023-11-10T08:23:43Z
      Message:               Successfully Synchronized work(s) for placement
      Observed Generation:   5
      Reason:                WorkSynchronizeSucceeded
      Status:                True
      Type:                  WorkSynchronized
      Last Transition Time:  2023-11-10T08:23:43Z
      Message:               Successfully applied resources
      Observed Generation:   5
      Reason:                ApplySucceeded
      Status:                True
      Type:                  ResourceApplied
    Cluster Name:            aks-member-2
    Conditions:
      Last Transition Time:  2023-11-10T08:14:52Z
      Message:               Successfully scheduled resources for placement in aks-member-2 (affinity score: 0, topology spread score: 0): picked by scheduling policy
      Observed Generation:   5
      Reason:                ScheduleSucceeded
      Status:                True
      Type:                  ResourceScheduled
      Last Transition Time:  2023-11-10T08:23:43Z
      Message:               Successfully Synchronized work(s) for placement
      Observed Generation:   5
      Reason:                WorkSynchronizeSucceeded
      Status:                True
      Type:                  WorkSynchronized
      Last Transition Time:  2023-11-10T08:23:43Z
      Message:               Successfully applied resources
      Observed Generation:   5
      Reason:                ApplySucceeded
      Status:                True
      Type:                  ResourceApplied
  Selected Resources:
    Kind:       Namespace
    Name:       test
    Version:    v1
    Kind:       ConfigMap
    Name:       test-1
    Namespace:  test
    Version:    v1
Events:
  Type    Reason                     Age                    From                                   Message
  ----    ------                     ----                   ----                                   -------
  Normal  PlacementScheduleSuccess   12m (x5 over 3d22h)    cluster-resource-placement-controller  Successfully scheduled the placement
  Normal  PlacementSyncSuccess       3m28s (x7 over 3d22h)  cluster-resource-placement-controller  Successfully synchronized the placement
  Normal  PlacementRolloutCompleted  3m28s (x7 over 3d22h)  cluster-resource-placement-controller  Resources have been applied to the selected clusters

放置更改

舰队计划程序优先考虑现有工作负荷放置的稳定性,因此导致移除和重新计划工作负荷的更改数量受到限制。

  • ClusterResourcePlacement 对象中的放置策略更改可能会触发工作负荷的删除和重新安排
    • 横向扩展操作(增加 numberOfClusters 且无其他更改)只会在新群集上放置工作负荷,不会影响现有放置。
  • 群集更改
    • 如果新群集满足放置策略(例如 PickAll 策略),则新群集可能触发放置。
    • 从舰队中移除放置的群集将尝试重新放置所有受影响的工作负荷,而不会影响其他放置。

仅资源更改(更新 ClusterResourcePlacement 对象中的资源或更新 ResourceSelector)将在现有放置逐步推出,但不会触发工作负荷重新安排。

访问舰队资源群集的 Kubernetes API

如果创建 Azure Kubernetes 舰队管理器资源时启用了集线器群集,则可将其用于集中控制 Kubernetes 对象传播等方案。 若要访问舰队资源群集的 Kubernetes API,请按照使用 Azure Kubernetes 舰队管理器访问舰队资源群集的 Kubernetes API 中的步骤进行操作。

后续步骤