目标: 在每个节点上至少安排一个 pod(即“log-scraper”)一次但不超过一次
假设一个集群有以下节点
节点
我正在使用的 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-ONEpod
类型log-scraper
问题 2: 应应用/添加哪些其他清单来实现此目的?
您可能应该使用 Daemonsets,它正是为此目的而制作的,每个节点调度一个 pod,并在集群自动缩放的情况下自动添加到新节点。
在将 Pod 分配给节点时,有两件重要的事情 - “亲和力” 和 “反亲和力”。
In
、NotIn
、Exist
、DoesNotExist
、Gt
和 Lt
等运算符。当你使用NotIn
和DoesNotExist
时,它就变成反亲和了。现在,在 Affinity/Antiaffinity 中,您有 2 个选择 - Node affinity/antiaffinity 和 Inter-pod affinity/antiaffinity
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
labelSelector:
- matchExpressions:
- key: worker
operator: In
values:
- log-scraper
另一种方法是使用 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。