如何在 StatefulSet 中的 pod 上进行不同的 NodeSelector 配置

如何在 StatefulSet 中的 pod 上进行不同的 NodeSelector 配置

我有一个跨多个数据中心的 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),您还可以使用requiredDuringSchedulingIgnoredDuringExecutionor requiredDuringSchedulingRequiredDuringExecution-- 语法略有不同,您将无法设置强制放置规则的权重,...

[1]https://docs.openshift.com/container-platform/3.11/admin_guide/scheduling/pod_affinity.html#admin-guide-sched-affinity-config-pod-pref

[2]https://kubernetes.io/docs/concepts/configuration/assign-pod-node/

相关内容