首页 > 解决方案 > Kubernetes AntiAffinity over Labels - 通过节点标签传播副本

问题描述

我们有 3 台 ESXi 主机,每台上有 2 个 Kubernetes 工作人员。所有节点都标有“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....."

标签: kuberneteshigh-availability

解决方案


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

  • 软(preferredDuringSchedulingIgnoredDuringExecution)

  • 硬(需要DuringSchedulingIgnoredDuringExecution)

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

如果您指定软变体,如果该节点已经在运行一个标签为“app”且值为“demo”的 pod,则该 pod 不希望被调度到该节点上</p>

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

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

 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


推荐阅读