跳转到文档内容
版本:v1.14

集群污点管理

集群中的污点,具体体现在 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 定义了一个名为 fooClusterTaintPolicy,该策略管理 member1member2 集群上的污点。当集群状态中的 KubeComponentsHealthy 条件不为 True 时,它会为集群添加一个键为 kube-component-unhealthyNoSchedule 污点,当集群状态 KubeComponentsHealthy 条件为 True 时则从集群中移除该污点。

这确保了应用程序不会被调度到 Kubernetes 组件出现故障的集群中,通过自动重调度到健康的集群来提高多集群的可靠性。

选择一组目标集群

TargetClusters 字段指定了 ClusterTaintPolicy 需要关注的集群。它使用 PropagationPolicy API 中的ClusterAffinity 结构来选 择目标集群,其用法完全相同,因此你可以直接参考其文档 获取用户指南。

注意:如果您修改 TargetClusters 字段或更改集群的标签,使集群不再符合 ClusterTaintPolicy 的标准,此前由该 ClusterTaintPolicy 添加的现有污点将不会自动移除。

AddOnConditions 匹配后添加污点

AddOnConditions 字段定义了触发系统在集群对象上添加污点的匹配条件。匹配条件采用 “与” 关系。如果 AddOnConditions 为空,则不会添加 任何污点。

可以配置如下:

apiVersion: policy.karmada.io/v1alpha1
kind: ClusterTaintPolicy
metadata:
name: foo
spec:
#...
addOnConditions:
- conditionType: Ready
operator: NotIn
statusValues:
- "True"
- conditionType: NetworkAvailable
operator: NotIn
statusValues:
- "True"
#...

上述示例指定,当集群的状态条件满足以下情况时:

  • Ready 条件值不为 "True"
  • NetworkAvailable 条件值不为 "True",

该策略将为 TargetClusters 字段中定义的目标集群添加污点。

RemoveOnConditions 匹配后移除污点

RemoveOnConditions 字段定义了触发系统从集群对象中移除污点的匹配条件。匹配条件采用 “与” 关系。如果 RemoveOnConditions 为空,则不 会移除任何污点。

可以配置如下:

apiVersion: policy.karmada.io/v1alpha1
kind: ClusterTaintPolicy
metadata:
name: foo
spec:
#...
removeOnConditions:
- conditionType: Ready
operator: In
statusValues:
- "True"
- conditionType: NetworkAvailable
operator: In
statusValues:
- "True"
#...

上述示例指定,当集群的状态条件满足以下条件时:

  • Ready 条件值为 "True"
  • NetworkAvailable 条件值为 "True"

该策略将从目标集群中移除污点。

注意:当控制器调协 ClusterTaintPolicy 时,它首先评估 AddOnConditions 以确定应将哪些污点添加到目标集群,然后评估 RemoveOnConditions 以识别要移除的污点,并在单个操作中以原子方式应用所有更改。此顺序意味着,如果一个污点既通过 AddOnConditions 预期要添加,又通过 RemoveOnConditions 要移除,则在最终状态中移除操作优先。为避免预期的污点无法应用的情况,请确保添加和移除同一污点的条件相互排斥,因为重叠的配置可能会在协调过 程中导致意外行为。

污点配置

Taints 字段指定了需要在与 TargetClusters 匹配的集群对象上添加或删除的污点。

可以配置如下:

apiVersion: policy.karmada.io/v1alpha1
kind: ClusterTaintPolicy
metadata:
name: foo
spec:
#...
taints:
- key: not-ready
effect: NoSchedule
- key: not-ready
effect: NoExecute
#...
  • 当集群的状态条件同时满足 AddOnConditions 时,该策略将向目标集群添加污点。
  • 当集群的状态条件同时满足 RemoveOnConditions 时,该策略将从目标集群移除污点。

注意:修改 ClusterTaintPolicy 中的 Taints 字段(例如,删除污点定义)不会自动清除该策略已应用的现有污点。控制器仅根据更新后的配置管理污点。

注意:删除 ClusterTaintPolicy 不会自动清除该策略已应用的现有污点。

允许 NoExecute Effect 污点

鉴于 NoExecute 污点的重大影响,它会将所有无法容忍该污点的应用程序从整个集群中驱逐,因此默认情况下,使用 ClusterTaintPolicy 配置 NoExecute 污点是禁用的。这一预防措施可防止意外的大规模中断。要启用此功能,您必须显式配置 karmada-webhook 组件以允许 NoExecute 污点配置:

  • karmada-webhook
    --allow-no-execute-taint-policy bool: Allows configuring taints with NoExecute effect in ClusterTaintPolicy. Given the impact of NoExecute, applying such a taint to a cluster may trigger the eviction of workloads that do not explicitly tolerate it, potentially causing unexpected service disruptions.
    This parameter is designed to remain disabled by default and requires careful evaluation by administrators before being enabled.

为了使 NoExecute 生效,在 karmada-webhook 组件中配置 --allow-no-execute-taint-policy=true 参数后,您还需要在 karmada-controller-manager 组件中配置以下参数:

  • karmada-controller-manager:
    --enable-no-execute-taint-eviction bool: Enables controller response to NoExecute taints on clusters, which triggers eviction of workloads without explicit tolerations. Given the impact of eviction caused by NoExecute Taint.
    This parameter is designed to remain disabled by default and requires careful evaluation by administrators before being enabled.

Failover FeatureGate

集群污点管理功能需要启用 Failover FeatureGateFailover FeatureGate 目前处于 Beta 阶段,默认是关闭的。如果您想通过 ClusterTaintPolicy 为集群启用自动污点管理,可以在 karmada-controller-manager 中按如下方式进行配置:

--feature-gates=Failover=true

Karmada 系统管理的污点

在当前 Karmada 系统中,由 cluster-controller 自动处理的具有 NoSchedule 效果的污点如下:

污点键何时添加何时删除
cluster.karmada.io/unreachable当集群 Ready 条件为 Unknown当集群 Ready 条件为 True 或 False
cluster.karmada.io/not-ready当集群 Ready 条件为 False当集群 Ready 条件为 True 或 Unknown

在 1.14 版本之前,Karmada 会根据集群状态条件的变化自动添加或移除污点。从 1.14 版本开始,Karmada 不再自动添加或移除 NoExecute 污点。

配置应用容忍

集群对象上的污点可以被应用程序容忍,这在PropagationPolicy/ClusterPropagationPolicy 的 .spec.placement.clusterTolerations 字段中进行了定义。

当应用程序容忍 NoSchedule 污点时,即使集群上存在 NoSchedule 污点,该应用程序也能够调度到集群中。

当应用程序容忍 NoExecute 污点时,即使集群上存在 NoExecute 污点,该应用程序仍能够在集群上运行。