控制 Azure Kubernetes 舰队管理器群集资源放置的逐出和中断预算(预览版)

使用 Fleet Manager 的群集资源放置(CRP)的管理员可以发现他们需要删除以前放置在成员群集上的资源,同时确保关键资源放置不会中断。

在本文中,我们将探讨如何使用 Fleet Manager 和ClusterResourcePlacementEvictionClusterResourcePlacementDisruptionBudget对象来实现这些目标。

注释

如果不熟悉 Fleet Manager 的群集资源放置(CRP),请在阅读本文之前阅读 资源放置的概念概述

重要

Azure Kubernetes 舰队管理器预览功能可以通过自助服务方式选择性启用。 预览版按“现状”和“视供应情况”提供,它们不包括在服务级别协议和有限保证范围内。 客户支持部门会尽力为 Azure Kubernetes 舰队管理器预览功能提供部分支持。 因此,这些功能并不适合用于生产。

逐出放置的资源(预览版)

从舰队管理器中心群集传播资源后,使用 ClusterResourcePlacementEviction 对象从成员群集中移除资源。

若要成功从群集中逐出资源,需要指定:

  • 将资源传播到目标群集的对象的名称 ClusterResourcePlacement
  • 需要从中逐出资源的目标群集的名称。

逐出可用于群集资源放置的 PickAllPickN 策略。 PickedFixed 不支持,因为可以编辑目标群集并重新应用 CRP。

注释

逐出不保证资源不会再次由机队计划程序传播到成员群集。 需要应用污点来防止舰队计划程序再次选取特定群集。

请考虑以下 CRP 示例。

apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
  name: crp-app-sample
spec:
  resourceSelectors:
    - group: ""
      kind: Namespace
      name: test-namespace
      version: v1
  policy:
    placementType: PickN
    numberOfClusters: 2
    affinity:
      clusterAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          clusterSelectorTerms:
            - labelSelector:
                matchLabels:
                  fleet.azure.com/location: chinanorth3

应用此 CRP 后,我们可以 检查放置状态 以确定资源部署到的群集。

假设选择了名为member-cluster-01member-cluster-02的两个群集,并且我们确定不希望在member-cluster-02上部署资源,因此我们希望将其删除。

  1. 创建 NoSchedule 污点来阻止成员群集的放置请求。 可以阅读污点文档,了解有关使用污点的更多信息。

    apiVersion: placement.kubernetes-fleet.io/v1
    kind: MemberCluster
    metadata:
      name: member-cluster-02
    spec:
      identity:
        name: fleet-member-agent-cluster-2
        kind: ServiceAccount
        namespace: fleet-system
        apiGroup: ""
      taints:                   
        - key: any-key
          value: any-value
          effect: NoSchedule
    
  2. 接下来,创建并应用一个 ClusterResourcePlacementEviction

    apiVersion: placement.kubernetes-fleet.io/v1beta1
    kind: ClusterResourcePlacementEviction
    metadata:
      name: eviction-sample
    spec:
      placementName: crp-app-sample
      clusterName: member-cluster-02
    
  3. 检查是否已从 member-cluster-02 群集中删除指定的资源:

    kubectl get crpe eviction-sample
    

    这会产生以下输出,其中 EXECUTED 显示 True

    NAME            VALID   EXECUTED
    test-eviction   True    True 
    

现在,你已了解如何强制从群集中删除放置的资源,让我们看看如何保护关键资源免受逐出。

防止逐出(预览版)

在针对放置的资源应用 ClusterResourcePlacementDisruptionBudget 对象时,ClusterResourcePlacementEviction 对象用于防止发生自愿中断。 非自愿中断 不受保护。

对于本文前面所示的示例群集资源放置,可以定义放置中断预算对象,如下所示。

中断预算的名称必须与 CRP 匹配。

apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ClusterResourcePlacementDisruptionBudget
metadata:
  name: crp-app-sample
spec:
  minAvailable: 1

可以在规范中指定以下两个互斥字段之一:

  • maxUnavailable:由于任何形式的中断,所含放置可能不可用的最大群集数。
  • minAvailable:尽管出现任何形式的中断,但所含放置可用的最小群集数。

这两个字段可以是整数形式的绝对分类数,也可以是队列中群集总数的百分比。

指定特定 ClusterResourcePlacement 策略的中断预算时,可以参考以下支持矩阵:

CRP 策略 minAvailable (整数) minAvailable (%) maxUnavailable (整数) MaxUnavailable (%)
PickFixed
PickAll
PickN

注释

如果为放置创建无效的中断预算对象,则任何逐出尝试都失败。

验证是否阻止逐出

可以检查配置的中断预算是否阻止了逐出,如下所示。

kubectl get crpe eviction-sample

请注意,EXECUTED 字段显示 False,表明未执行驱逐过程。

NAME            VALID   EXECUTED
test-eviction   True    False

若要确认中断预算阻止了逐出,请发出相同的 kubectl 命令并添加 -o yamlmessage 值显示中断预算阻止了逐出。

status:
  conditions:
  - lastTransitionTime: "2025-01-21T15:52:29Z"
    message: Eviction is valid
    observedGeneration: 1
    reason: ClusterResourcePlacementEvictionValid
    status: "True"
    type: Valid
  - lastTransitionTime: "2025-01-21T15:52:29Z"
    message: 'Eviction is blocked by specified ClusterResourcePlacementDisruptionBudget,
      availablePlacements: 1, totalPlacements: 1'
    observedGeneration: 1
    reason: ClusterResourcePlacementEvictionNotExecuted
    status: "False"
    type: Executed

非自愿中断

放置中断预算不会阻止非自愿中断。 非自愿中断的示例包括:

  • 由于计划策略更改,机队管理器计划程序从成员群集中删除资源。
  • 手动删除成员群集上运行的工作负载资源(而不是通过逐出或更新的 CRP)。
  • 手动删除一个 ClusterResourceBinding 对象,该对象是表示资源在成员群集上放置的内部资源。
  • 由于配置错误或群集相关问题,工作负荷无法在成员群集上正常运行。

后续步骤