Kubernetes:如何确保在每个工作节点上安排一个 pod?
Kubernetes : How to ensure one pod gets scheduled on each worker node?
目标:让一个 pod(即 'log-scraper')在每个节点上至少调度一次但不超过一次
假设一个集群有以下节点
节点
- master/control-plane
- 工人-1
- 工人 2
- 工人 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 基于给定的标准,而反亲和力将根据给定的标准避免。
- 借助亲和力和反亲和力,您可以使用
In
、NotIn
、Exist
、DoesNotExist
、Gt
和 [=16 等运算符=].当你使用NotIn
和DoesNotExist
时,它就变成反亲和了。
现在,在 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
目标:让一个 pod(即 'log-scraper')在每个节点上至少调度一次但不超过一次
假设一个集群有以下节点
节点
- master/control-plane
- 工人-1
- 工人 2
- 工人 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 基于给定的标准,而反亲和力将根据给定的标准避免。
- 借助亲和力和反亲和力,您可以使用
In
、NotIn
、Exist
、DoesNotExist
、Gt
和 [=16 等运算符=].当你使用NotIn
和DoesNotExist
时,它就变成反亲和了。
现在,在 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