跳到主要内容

为集群配置 Pod 亲和性

亲和性控制了 Pod 在节点上的分配逻辑。合理地将 Kubernetes 的 Pod 分配到不同的节点上,可以提高业务的可用性、资源使用率和稳定性。

可以通过集群的 CR YAML 文件来设置亲和性和容忍度。CR YAML 文件可以支持集群级别和组件级别的配置。

使用 YAML 文件配置亲和性

你可以在集群配置文件或组件配置文件中配置 Pod 亲和性和容忍度。

集群级配置是所有组件的默认配置;如果组件中存在 Pod 亲和性配置,组件级配置将生效,并覆盖默认的集群级配置。

spec:
affinity:
podAntiAffinity: Preferred
topologyKeys:
- kubernetes.io/hostname
nodeLabels:
topology.kubernetes.io/zone: us-east-1a
tolerations:
- key: EngineType
operator: Equal
value: mysql
effect: NoSchedule
componentSpecs:
- name: mysql
componentDefRef: mysql
affinity:
podAntiAffinity: Required
topologyKeys:
- kubernetes.io/hostname
......

YAML 文件中的参数

  • 亲和性

    与 Pod 亲和性相关的参数位于集群的 CR YAML 文件的 spec.affinity 对象下。

    Pod 亲和性配置可以应用于集群或组件,组件级配置将覆盖集群级配置。

  • 容忍度

    与容忍度相关的参数位于集群 CR YAML 文件的 spec.tolerations 对象下,使用 Kubernetes 的原生语义。有关容忍度参数配置,请参考 Kubernetes 官方文档污点和容忍度

    与亲和性配置类似,容忍度也支持组件级和集群级配置。默认使用集群级配置,组件级别的配置会覆盖集群级别的配置。

参数描述
podAntiAffinity- Required
- Preferred (default)

表示当前组件下 Pod 的反亲和性级别。

- Required 表示 Pod 必须均匀分布在由 topologyKeys 指定的故障域中。

- Preferred 表示 Pod 最好能够均匀分布在由 topologyKeys 指定的故障域中。

topologyKeys

TopologyKey 是节点标签的 key。具有相同 key 值的节点属于相同的拓扑,即相同的故障域。

例如,如果 TopologyKey 是 kubernetes.io/hostname,每个节点都是该拓扑的一个域。如果 TopologyKey 是 topology.kubernetes.io/zone,每个可用的区域都是该拓扑的一个域。

nodeLabelsNodeLabels 指定 Pod 只能被调度到具有指定节点标签的节点上。
tenancy

- SharedNode (default)

- DedicatedNode

表示 Pod 的租户类型:

- SharedNode 表示多个 Pod 共享一个节点。

- DedicatedNode 表示一个节点专用于一个 Pod。

示例

以下示例展示了如何进行 Pod 亲和性和容忍度配置。

默认配置

无需使用亲和性参数。

尽量打散

如果你希望集群的 Pod 部署在不同的拓扑域,但是不希望在节点资源充足的时候,因为不满足分布条件而部署失败,那么可以配置尽量打散,可以将 Pod 亲和性配置为“Preferred”。

下面的示例创建了一个尽可能跨节点的集群。

spec:
affinity:
podAntiAffinity: Preferred

强制打散

如果集群的 Pod 必须部署在不同的拓扑域,以确保集群能够跨拓扑域具备容灾能力,你可以将 Pod 亲和性配置为“Required”。

下面的示例创建了一个必须跨节点部署的集群。

spec:
affinity:
podAntiAffinity: Required

在指定节点上部署

可以通过节点标签在指定的节点上部署集群。

下面的示例创建了一个在带有拓扑标签 topology.kubernetes.io/zone=us-east-1a 的节点上部署的集群。

spec:
affinity:
nodeLabels:
topology.kubernetes.io/zone: us-east-1a

独享主机组

如果想通过污点和节点标签来管理节点分组,并且需要将集群部署在独享的主机分组中,可以设置容忍度并指定一个节点标签。

例如,如果有一个用于部署数据库集群的主机分组,并且该主机添加了一个名为 database=true:NoSchedule 的污点和一个名为 database=true 的标签,那么可以按照以下命令创建一个集群。

spec:
affinity:
podAntiAffinity: Preferred
topologyKeys:
- kubernetes.io/hostname
nodeLabels:
database: true
tolerations:
- key: database
operator: Equal
value: true
effect: NoSchedule

集群 Pod 独占一个节点

如果需要一个仅用于线上核心业务的集群,并且需要确保该集群的每个 Pod 都有自己的节点以避免受到集群中其他 Pod 的影响,你可以将 tenancy 设置为“DedicatedNode”。

spec:
affinity:
tenancy: DedicatedNode
备注

只有为这些节点添加污点之后,命令才能成功执行。否则,未由 KubeBlocks 托管的业务仍然可以部署在这些节点上。