目标:让一个pod(即'log-scraper')在每个节点上至少调度一次,但不超过一次
假设集群有以下节点
节点- 主/控制平面
- 1
- worker 2
- 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-scraper
型pod
问题2:应该应用/添加哪些其他清单来实现这一点?
您可能应该使用daemonset,它们正是为此目的而创建的,每个节点调度一个pod,并且在集群自动伸缩的情况下自动添加到新节点。
概念
在将pod分配给节点时,有两件重要的事情—"Affinity">和"AntiAffinity">.
- 亲和性将根据给定的标准进行选择,而反亲和性将根据给定的标准进行避免。
- 对于亲和性和反亲和性,您可以使用
In
,NotIn
,Exist
,DoesNotExist
,Gt
和Lt
等操作符。当你使用NotIn
和DoesNotExist
时,它变成反亲和的。
现在,在亲和/反亲和,你有2个选择-节点亲和/反亲和和pod间亲和/反亲和
节点亲和性/反亲和性
节点关联在概念上类似于nodeSelector——它允许您根据节点上的标签约束您的pod有资格被调度到哪些节点上。
荚果间亲和/反亲和
pod间亲和性和反亲和性允许您根据已经在节点上运行的pod上的标签(而不是基于节点上的标签)来约束pod有资格调度哪些节点。
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
labelSelector:
- matchExpressions:
- key: worker
operator: In
values:
- log-scraper
在这里阅读更多内容,特别是这里的示例。
标题>使用Pod拓扑扩展约束
另一种方法是使用Pod拓扑扩展约束.您将像往常一样设置污点和公差,以控制可以调度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
是每个节点的默认标签集。将pod标签放入matchLabels
中。创建资源,kubesscheduler应该用每个节点匹配的标签调度一个pod。
要了解更多信息,请查看这里的文档和这篇优秀的博客文章。