我有一个跨多个数据中心的 Openshift 集群。每个数据中心都配置了一个区域,这样 NodeSelector 可用于选择将 Pod 分配到哪个数据中心。我还有一个配置了 10 个 Pod 的 StatefulSet。
我希望配置 StatefulSet,使 Pod 在各个数据中心均匀分布。但这不能是一个严格定义的配置,因为如果一个数据中心发生灾难,我希望 Pod 被分配到剩余的数据中心。
如果不实现自定义控制器,这可能吗?
答案1
你正在寻找的是亲和力/反亲和力[1],[2]
您应该能够在 StatefulSet 定义中添加一些反亲和性规则:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: openldap
spec:
selector:
matchLabels:
name: openldap
replicas: 3
template:
metadata:
labels:
name: openldap
spec:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- podAffinityTerm:
labelSelector:
matchExpressions:
- key: name
operator: In
values: [ openldap ]
topologyKey: kubernetes.io/hostname
weight: 42
...
上述操作将确保调度程序不会将两个带有name=openldap
标签的 Pod 放置到共享同一个标签的机器上topologyKey
。
虽然常见示例会将其称为kubernetes.io/hostname
拓扑键,但您完全可以依赖某些自定义标签。假设您的 DC-A 节点具有标签dc=a
,而 DC-B 具有标签dc=b
,那么您可以将dc
用作topologyKey
。
请注意,上述示例表达的是偏好,而不是强制规则。除了preferredDuringSchedulingIgnoredDuringExecution
(or preferredDuringSchedulingRequiredDuringExecution
),您还可以使用requiredDuringSchedulingIgnoredDuringExecution
or requiredDuringSchedulingRequiredDuringExecution
-- 语法略有不同,您将无法设置强制放置规则的权重,...
[2]https://kubernetes.io/docs/concepts/configuration/assign-pod-node/