使用 Fleet Manager 的群集资源放置(CRP)的管理员可以发现他们需要删除以前放置在成员群集上的资源,同时确保关键资源放置不会中断。
在本文中,我们将探讨如何使用 Fleet Manager 和ClusterResourcePlacementEviction
ClusterResourcePlacementDisruptionBudget
对象来实现这些目标。
注释
如果不熟悉 Fleet Manager 的群集资源放置(CRP),请在阅读本文之前阅读 资源放置的概念概述 。
重要
Azure Kubernetes 舰队管理器预览功能可以通过自助服务方式选择性启用。 预览版按“现状”和“视供应情况”提供,它们不包括在服务级别协议和有限保证范围内。 客户支持部门会尽力为 Azure Kubernetes 舰队管理器预览功能提供部分支持。 因此,这些功能并不适合用于生产。
逐出放置的资源(预览版)
从舰队管理器中心群集传播资源后,使用 ClusterResourcePlacementEviction
对象从成员群集中移除资源。
若要成功从群集中逐出资源,需要指定:
- 将资源传播到目标群集的对象的名称
ClusterResourcePlacement
。 - 需要从中逐出资源的目标群集的名称。
逐出可用于群集资源放置的 PickAll
和 PickN
策略。 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-01
和member-cluster-02
的两个群集,并且我们确定不希望在member-cluster-02
上部署资源,因此我们希望将其删除。
创建
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
接下来,创建并应用一个
ClusterResourcePlacementEviction
。apiVersion: placement.kubernetes-fleet.io/v1beta1 kind: ClusterResourcePlacementEviction metadata: name: eviction-sample spec: placementName: crp-app-sample clusterName: member-cluster-02
检查是否已从
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 yaml
。 message
值显示中断预算阻止了逐出。
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
对象,该对象是表示资源在成员群集上放置的内部资源。 - 由于配置错误或群集相关问题,工作负荷无法在成员群集上正常运行。