工作负载反亲和性¶
创建Elasticsearch 搜索服务、Kafka 消息队列、MinIO 对象存储、MySQL 数据、RabbitMQ 消息、PostgreSQL 数据库、Redis 数据库、MongoDB 数据库实例时,可以在服务设置页面配置工作负载反亲和性。
工作负载反亲和性的作用原理是,在一定的拓扑域(作用域)范围内,如果检测到已经有工作负载带有反亲和性配置中添加的某个标签,则不会将新建的工作负载部署到该拓扑域。这样做的好处是:
-
性能优化
通过工作负载反亲和性,将实例的多个副本部署到不同的节点/可用区/区域,避免副本间的资源竞争,确保每个副本都有充足的可用资源,从而提供应用的性能和可靠性。
-
故障隔离
实例副本分布在不同的节点/可用区/区域,有效避免了单点故障问题。某个环境中的副本出现故障时,其他环境中的副本不受影响,从而保障服务整体的可用性。
操作步骤¶
下面以 Redis
为例,介绍如何设置工作负载反亲和性
。
Note
本文侧重介绍如何配置工作负载反亲和性
。如需了解详细的 Redis
实例创建过程,可参考创建实例。
-
在创建
Redis
实例过程中,在服务设置
->高级设置
中启用工作负载反亲和性
。 -
参考以下说明填写工作负载反亲和性的配置。
- 条件:分为
尽量满足
和必须满足
两种。- 尽量满足:尽量尝试满足反亲和性要求,最终的部署结果不一定满足反亲和性要求
- 必须满足:必须满足反亲和性要求。如果找不到可调度的节点/可用区/区域,则 Pod 会一直处于 Pending 状态。
- 权重:条件设置为
必须满足
时无需设置权重。条件设置为尽量满足
时,为反亲和性规则设置权重值,优先满足权重高的规则。 - 拓扑域:拓扑域定义反亲和性的作用范围,可以为节点标签、zone 标签、region 标签,也可以由用户自定义。
- Pod 选择器:设置 Pod 标签。同一个拓扑域内,只能有一个带有此标签的 Pod。
-
有关反亲和性以及各种操作符的详细介绍,可参考操作符
Note
上图配置的含义是,在同一个节点上只能有一个带有
app.kubernetes.io/name
标签且值为redis-test
的 Pod。如果没有满足条件的节点,则 Pod 会一直处于 Pending 状态。 - 条件:分为
-
参考创建实例完成后续操作。
效果验证¶
配置好工作负载反亲和性并且实例创建成功后,进入容器管理模块查看 Pod
调度信息。
可见一共 3 个 Pod,两个已经在正常运行并且分布在不同的节点上。
第三个 Pod 处于等待状态,点击 Pod 名称查看详情,发现原因是污点和反亲和性规则导致没有可以部署的节点。
Success
这说明前面配置的工作负载反亲和性已经生效,即一个节点上之后只能有一个带有 app.kubernetes.io/name
标签且值为 redis-test
的 Pod。如果没有满足条件的节点,则 Pod 一直处于 Pending 状态。