Kubernetes AntiAffinity over Labels - 通过节点标签传播副本

Kubernetes AntiAffinity over Labels - Spread Replicas via Node-Labels

我们有 3 台 ESXi 主机,每台主机上有 2 个 Kubernetes worker。所有节点都标有 "esxhost: esxN",我想在这些主机上传播副本。将副本分布在工作人员上很容易,在一台主机上没有相同的服务,但我想分布在 ESXi 主机上,以获得 HA,即使两个工作人员死亡,因为 ESXi 主机死亡。

我该如何处理?尝试了一些选择,但没有成功。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo
  namespace: someNS
spec:
  replicas: 2
  selector:
    matchLabels:
      app: demo
  template:
    metadata:
      labels:
        app: demo
    spec:    
      containers:
        - name: demo-mos-node
          image: registry.docker.dev...../demo:2.1.2
          ports:
            - containerPort: 80
          env:
            - name: CONFIG
              value: "https://config.git.dev....."

您可以定义反关联规则。这些用于使 pods 彼此远离。有 2 种变体:

  • 软(preferredDuringSchedulingIgnoredDuringExecution)

  • 困难(requiredDuringSchedulingIgnoredDuringExecution)

如果指定硬变体,如果该节点上已经有一个 pod,则不会将 pod 调度到该节点

如果您指定软变体,如果该节点已经是 运行 标签具有键“app”和值“demo”的 pod

spec:
  affinity:
    podAntiAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 100
        podAffinityTerm:
          labelSelector:
            matchExpressions:
            - key: app
              operator: In
              values:
              - demo
          topologyKey: "kubernetes.io/hostname"

此外,如果你想在主节点上调度pods,你必须删除主节点的默认污点:

 kubectl get nodes 

 kubectl describe node master_node_name

 kubectl taint nodes master_node_name key:NoSchedule-

https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity

正如@iliefa 所说,您应该使用 pod 反亲和力,但您必须定义 2 个亲和力术语。第一个将阻止(软或硬)pods 在相同节点上的分布,第二个将阻止(软或硬)pods 在相同可用区(如您称它们为 ESXi 主机)。也许您可以使用 built in labes,或者更具体地说 - failure-domain.beta.kubernetes.io/zone。另一种选择是根据可用区标记您的节点。这是我的意思的一个例子:

affinity:
  podAntiAffinity:
    preferredDuringSchedulingIgnoredDuringExecution:
      - weight: <define-importance-here>
        podAffinityTerm:
          topologyKey: kubernetes.io/hostname
          labelSelector:
            matchLabels:
              <insert-your-pod-labels-here>
      - weight: <define-importance-here>
        podAffinityTerm:
          topologyKey: failure-domain.beta.kubernetes.io/zone
          labelSelector:
            matchLabels:
              <insert-your-pod-labels-here>

您设置的权重将定义每个反亲和性规则与其他规则相比的重要性。