跳到主要内容

为集群配置 Pod 亲和性

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

可以通过 kbcli 件来设置亲和性和容忍度。kbcli 仅支持集群级别的配置,如需实现集群级别和组件级别的配置,可使用 CR YAML 文件,具体操作可参考API 文档

执行 kbcli cluster create -h 命令查看示例,并配置亲和性及容忍度的参数。

kbcli cluster create -h
>
Create a cluster

Examples:
......

# 创建一个强制分散在节点上的集群
kbcli cluster create --cluster-definition apecloud-mysql --topology-keys kubernetes.io/hostname --pod-anti-affinity
Required

# 在特定标签的节点上创建一个集群
kbcli cluster create --cluster-definition apecloud-mysql --node-labels
'"topology.kubernetes.io/zone=us-east-1a","disktype=ssd,essd"'

# 创建一个具有两个容忍度的集群
kbcli cluster create --cluster-definition apecloud-mysql --tolerations
'"key=engineType,value=mongo,operator=Equal,effect=NoSchedule","key=diskType,value=ssd,operator=Equal,effect=NoSchedule"'

# 创建一个集群,其中每个 Pod 在自己的专用节点上运行
kbcli cluster create --tenancy=DedicatedNode

Options:
......
--node-labels=[]:
Node label selector

--pod-anti-affinity='Preferred':
Pod anti-affinity type, one of: (Preferred, Required)

--tenancy='SharedNode':
Tenancy options, one of: (SharedNode, DedicatedNode)

--tolerations=[]:
Tolerations for cluster, such as '"key=engineType,value=mongo,operator=Equal,effect=NoSchedule"'

--topology-keys=[]:
Topology keys for affinity
......
.......

示例

以下示例使用 kbcli 创建集群实例,并展示了如何进行 Pod 亲和性和容忍度配置。

默认配置

无需使用亲和性参数。

尽量打散

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

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

kbcli cluster create --topology-keys kubernetes.io/hostname --pod-anti-affinity Preferred

强制打散

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

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

kbcli cluster create --topology-keys kubernetes.io/hostname --pod-anti-affinity Required

在指定节点上部署

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

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

kbcli cluster create --node-labels '"topology.kubernetes.io/zone=us-east-1a"'

独享主机组

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

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

kbcli cluster create --node-labels '"databa=true"' --tolerations '"key=database,value=true,operator=Equal,effect=NoSchedule"

集群 Pod 独占一个节点

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

kbcli cluster create --tenancy=DedicatedNode
备注

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