集群污点管理
集群中的污点,具体体现在 Cluster 对象的 .spec.taints 字段中,对应用程序的调度和执行有重大影响。例如,如果一个集群有 NoSchedule 污点,
它可以阻止新的应用程序被调度到该集群上。污点对应用程序的影响取决于污点的 Effect 值。
Karmada 根据 Effect 值支持不同类型的污点:
NoSchedule:阻止新应用程序调度到集群,除非应用程序明确容忍该污点。NoExecute:阻止新应用程序调度到集群,并将 现有应用程序从集群中驱逐,除非应用程序明确容忍该污点。
请注意,NoExecute 的驱逐功能默认是禁用的,要启用它,您需要在 karmada-controller-manager 组件中设置 --enable-no-execute-taint-eviction=true
参数,并且还需要显式启用 Failover 特性门控。
本文档介绍了 Karmada 如何管理集群上的污点,包括:
- 基于集群条件的自定义污点管理。
- 由 Karmada 系统管理的污点。
- 配置应用容忍度以忽略污点影响。
自定义污点管理
ClusterTaintPolicy API 允许管理员自定义基于特定条件为指定目标集群添加或移除污点的规则,这对于实施高级调度策略或故障迁移策略特别有用。
集群条件不仅可以由 Karmada 系统确定,还可以由任何第三方系统确定。这为管理员在定义集群健康标准方面提供了极大的灵活性。例如,Karmada 系统
根据其内置的健康检查设置 Ready 条件。第三方系统也可以引入额外的条件,如 SchedulerDown,以表明集群调度器无法正常工作。与 ClusterTaintPolicy
结合使用时,这些自定义条件可用于防止新应用程序被调度到受影响的集群上,从而对应用程序的放置提供更精细的控制,并提高整体系统的可靠性。

ClusterTaintPolicy 是一个集群范围的资源,其 apiVersion 为 policy.karmada.io/v1alpha1。
以下是一个 ClusterTaintPolicy 的示例,该策略用于向目标集群添加或移除污点:
apiVersion: policy.karmada.io/v1alpha1
kind: ClusterTaintPolicy
metadata:
name: foo
spec:
targetClusters:
clusterNames:
- member1
- member2
addOnConditions:
- conditionType: KubeComponentsHealthy
operator: NotIn
statusValues:
- "True"
removeOnConditions:
- conditionType: KubeComponentsHealthy
operator: In
statusValues:
- "True"
taints:
- key: kube-components-unhealthy
effect: NoSchedule
上述 YAML 定义了一个名为 foo 的 ClusterTaintPolicy,该策略管理 member1 和 member2 集群上的污点。当集群状态中的 KubeComponentsHealthy
条件不为 True 时,它会为集群添加一个键为 kube-component-unhealthy 的 NoSchedule 污点,当集群状态 KubeComponentsHealthy
条件为 True 时则从集群中移除该污点。
这确保了应用程序不会被调度到 Kubernetes 组件出现故障的集群中,通过自动重调度到健康的集群来提高多集群的可靠性。