Kubernetes:动态识别节点和污点

时间:2018-10-25 03:33:59

标签: kubernetes

我有一个应用程序Pod,它将部署在k8s集群上 但是随着Kubernetes调度程序决定该Pod需要在哪个节点上运行

现在,我想向使用NOschedule运行我的应用程序pod的节点动态添加污点,以便在该节点上不再安排新的pod。

我知道如果知道节点名称,我们可以将kubectl taint节点与NOschedule一起使用,但是我想根据此应用程序pod正在运行的节点来动态实现

我要执行此操作的原因是这是至关重要的应用程序容器,它不应停机,并且出于很好的原因,我在整个集群中只有一个用于该应用程序的容器

请提出建议

2 个答案:

答案 0 :(得分:0)

您可以使用以下内容获取运行pod的节点:

$ kubectl get pod myapp-pod -o=jsonpath='{.spec.nodeName}'

然后您可以对其进行污染:

$ kubectl taint nodes <node-name-from-above> key=value:NoSchedule

或整个命令合在一起:

$ kubectl taint nodes $(kubectl get pod myapp-pod -o=jsonpath='{.spec.nodeName}') key=value:NoSchedule

答案 1 :(得分:0)

除了@Rico答案。

您可以使用名为node affinity的功能,该功能仍是测试版,但已经实现了某些功能。

您应将label添加到节点,例如test-node-affinity: test。完成此操作后,您可以在PodSpec中添加字段nodeAffinity的{​​{1}}。

affinity

这将意味着spec: ... affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: test-node-affinity operator: In values: - test 将查找具有键POD和值test-node-affinity的节点,并将其部署在其中。

我建议阅读Toader Sebastian撰写的博客Taints and tolerations, pod and node affinities demystified

还要熟悉Kubernetes文档中的Taints and Tolerations