Kubernetes:如何确保在每个工作节点上安排一个 pod?

Kubernetes : How to ensure one pod gets scheduled on each worker node?

目标:让一个 pod(即 'log-scraper')在每个节点上至少调度一次但不超过一次

假设一个集群有以下节点

节点

  1. master/control-plane
  2. 工人-1
  3. 工人 2
  4. 工人 2

我正在使用的 Pod

apiVersion: v1
kind: Pod
metadata:
  name: log-scraper
spec:
  volumes:
  - name: container-log-dir
    hostPath:
      path: /var/log/containers
  containers:
    - image: "logScraper:latest"
      name: log-munger
      volumeMounts:
      - name: container-log-dir
        mountPath: /var/log/logging-app

仅向 select 添加亲和力 'worker' 个节点(或非主节点)

  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
          - matchExpressions:
            - key: "worker"
              operator: In
              values:
              - "true"

问题 1: 我如何确保每个 node 运行 ONE-AND-ONLY-ONE pod 类型 log-scraper

问题 2: 还应该 applied/added 哪些清单才能实现此目的?

您可能应该使用 Daemonsets,它正是为此目的而设计的,每个节点调度一个 pod,并在集群自动缩放的情况下自动添加到新节点。

概念

在将 Pods 分配给节点时有两件重要的事情 - "Affinity""AntiAffinity" .

  • 亲和力基本上 select 基于给定的标准,而反亲和力将根据给定的标准避免。
  • 借助亲和力和反亲和力,您可以使用 InNotInExistDoesNotExistGt 和 [=16 等运算符=].当你使用NotInDoesNotExist时,它就变成反亲和了。

现在,在 Affinity/Antiaffinity 中,您有 2 个选择 - Node affinity/antiaffinity 和 Inter-pod affinity/antiaffinity

节点affinity/antiaffinity

节点亲和力在概念上类似于 nodeSelector——它允许您根据节点上的标签来限制您的 pod 有资格被调度到哪些节点上。

跨组 affinity/antiaffinity

pod 间亲和力和反亲和力允许您根据 pods 上已经在节点上 运行 上的标签而不是基于节点上的标签来限制您的 pod 有资格被调度的节点。

你的解决方案

基本上你需要的是 "Antiaffinity" 而不是 Node.js "Pod antiaffinity"。因此,您的解决方案应如下所示(请注意,由于我没有 3 节点集群,所以我无法对此进行测试,因此您可能需要进行较小的代码调整的可能性很小):
  affinity:
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        labelSelector:
          - matchExpressions:
            - key: worker
              operator: In
              values:
              - log-scraper

继续阅读 here, and especially go through example over here