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



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

假设集群有以下节点

节点
  1. 主/控制平面
  2. 1
  3. worker 2
  4. worker 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

添加亲和性以只选择'worker'节点(或非matter节点)

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

问题1:如何确保每个node都运行一个且仅一个log-scraperpod

问题2:应该应用/添加哪些其他清单来实现这一点?

您可能应该使用daemonset,它们正是为此目的而创建的,每个节点调度一个pod,并且在集群自动伸缩的情况下自动添加到新节点。

概念

在将pod分配给节点时,有两件重要的事情—"Affinity">"AntiAffinity">.

  • 亲和性将根据给定的标准进行选择,而反亲和性将根据给定的标准进行避免。
  • 对于亲和性和反亲和性,您可以使用In,NotIn,Exist,DoesNotExist,GtLt等操作符。当你使用NotInDoesNotExist时,它变成反亲和的。

现在,在亲和/反亲和,你有2个选择-节点亲和/反亲和和pod间亲和/反亲和

节点亲和性/反亲和性

节点关联在概念上类似于nodeSelector——它允许您根据节点上的标签约束您的pod有资格被调度到哪些节点上。

荚果间亲和/反亲和

pod间亲和性和反亲和性允许您根据已经在节点上运行的pod上的标签(而不是基于节点上的标签)来约束pod有资格调度哪些节点。

<标题>解决方案基本上你需要的是"反亲和",在"Pod反亲和"而不是节点。所以,你的解决方案应该像下面这样(请注意,因为我没有3个节点集群,所以我无法测试这个,所以你可能不得不做小的代码调整的可能性很小):
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
labelSelector:
- matchExpressions:
- key: worker
operator: In
values:
- log-scraper

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

使用Pod拓扑扩展约束

另一种方法是使用Pod拓扑扩展约束

.您将像往常一样设置污点和公差,以控制可以调度pod的节点。然后给pod添加一些标签。我将在示例中使用pod标签id: foo-bar。然后,要允许每个节点只调度一个来自replicaSetdeployment或其他类型的pod,请在pod规范中添加以下内容:

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

topologyKey为节点的标号。kubernetes.io/hostname是每个节点的默认标签集。将pod标签放入matchLabels中。创建资源,kubesscheduler应该用每个节点匹配的标签调度一个pod。

要了解更多信息,请查看这里的文档和这篇优秀的博客文章。

最新更新