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

问题描述 投票:0回答:3

目标: 在每个节点上至少安排一个 pod(即“log-scraper”)一次但不超过一次

假设一个集群有以下节点

节点

  1. 主/控制平面
  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

添加亲和力以仅选择“工作”节点(或非母节点)

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

问题1:我如何确保每个

node
运行ONE-AND-ONLY-ONE
pod
类型
log-scraper

问题 2: 应应用/添加哪些其他清单来实现此目的?

kubernetes google-kubernetes-engine
3个回答
7
投票

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


2
投票

概念

在将 Pod 分配给节点时,有两件重要的事情 - “亲和力”“反亲和力”

  • 亲和性基本上会根据给定的标准进行选择,而反亲和性会根据给定的标准避免。
  • 借助亲和力和反亲和力,您可以使用
    In
    NotIn
    Exist
    DoesNotExist
    Gt
    Lt
    等运算符。当你使用
    NotIn
    DoesNotExist
    时,它就变成反亲和了。

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

节点亲和/反亲和

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


Pod 间亲和/反亲和

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


您的解决方案

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

这里阅读更多内容,特别是在这里通过示例。


0
投票

使用 Pod 拓扑扩展约束

另一种方法是使用 Pod Topology Spread Constraints.

您将像往常一样设置污点和容差来控制可以在哪些节点上调度 pod。然后向 pod 添加一些标签。我将在示例中使用 pod 标签

id: foo-bar
。然后只允许每个节点调度来自
replicaSet
deployment
或其他的单个 pod,在 pod 规范中添加以下内容。

topologySpreadConstraints:
  - maxSkew: 1
    topologyKey: kubernetes.io/hostname
    whenUnsatisfiable: DoNotSchedule
    labelSelector:
      matchLabels:
        id: foo-bar

topologyKey
是节点的标签。
kubernetes.io/hostname
是每个节点设置的 default 标签。将 pod 标签放在
matchLabels
内。创建资源,kubescheduler 应该为每个节点安排一个具有匹配标签的 pod。

要了解更多信息,请查看文档here以及这篇优秀的博客文章

© www.soinside.com 2019 - 2024. All rights reserved.