- 目标:**在每个节点上至少调度一个pod(即"日志抓取器")一次,但不超过一次
- 假设群集具有以下节点**
节点
1.主/控制平面
1.工人-1
1.工人-2
1.工人-2
"与我共事的花苞"
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
类型的每个node
都运行一个且仅一个**pod
- 问题1:如何确保
- 问题2:**应应用/添加哪些其他清单来实现这一目标?
3条答案
按热度按时间kmbjn2e31#
您可能应该使用Daemonsets,它正是为此目的而设计的,即为每个节点调度一个pod,并在群集自动扩展的情况下自动添加到新节点。
q1qsirdb2#
概念
将Pod分配给节点时有两件重要的事情-"关联"和"反关联"。
In
、NotIn
、Exist
、DoesNotExist
、Gt
和Lt
等操作符,当使用NotIn
和DoesNotExist
时,则变为反亲和性。现在,在关联/反关联中,您有两个选择-节点关联/反关联和pod间关联/反关联
节点关联/反关联
Node affinity在概念上类似于nodeSelector--它允许您根据节点上的标签来约束您的pod有资格被调度到哪些节点上。
舱间亲和力/反亲和力
通过Pod间关联性和反关联性,您可以根据节点上已运行的Pod上的标签(而不是节点上的标签)来限制有资格计划Pod的节点。
您的解决方案
基本上,你需要的是"Antiaffinity"和"Pod antiaffinity",而不是节点。所以,你的解决方案应该看起来像下面这样(请注意,因为我没有3节点集群,所以我不能测试这个,所以你可能要做轻微的代码调整的机会很小):
在这里阅读更多内容,特别是在这里阅读示例。
2ledvvac3#
使用Pod拓扑扩散约束
另一种方法是使用Pod拓扑扩散约束。
您将像往常一样设置污点和容差,以控制可以在哪些节点上调度pod。然后向pod添加一些标签。我将在示例中使用pod标签
id: foo-bar
。然后,为了允许每个节点仅调度来自replicaSet
、deployment
或其他的一个pod,请在pod规范中添加以下内容。topologyKey
是节点的标签。kubernetes.io/hostname
是每个节点的默认标签集。请将pod标签放在matchLabels
内。创建资源后,kubesscheduler应使用每个节点的匹配标签调度单个pod。要了解更多信息,请查看文档here和此excellent blog post。