「Kubernetes」- 使用DaemonSet时,主节点没有运行Pod实例

  CREATED BY JENKINSBOT

内容简介

处理「当使用DaemonSet时,没有在主节点创建Pod实例」问题。

问题描述

在以DaemonSet方式部署Traefik Ingress Controller之后,没有在Master节点上创建Pod实例。因此不能通过Master节点来访问服务,但是我们希望Master节点中也运行Pod实例。

经过一番Google查找,学习「Taints and Tolerations」文档。

问题原因(正常情况)

因为从1.6开始,不会再将DaemonSet调度到主节点上。由于主节点上有node-role.kubernetes.io/masterNoSchedule污点,而Pod没有容忍该污点,所以不会调度到主节点上。

!!!既然官方已经不建议这么做了,如果没有必要就不要向主机调度Pod了,除非是出于监控或者指标收集等原因。

解决办法(正常情况)

我参考了「Kubernetes ds won’t run pod on master node」与「Scheduler is not scheduling Pod for DaemonSet in Master node」这两个问题。

正确的解决办法其实是在DaemonSets的Pod定义中添加如下配置:

tolerations:
- key: node-role.kubernetes.io/master
  effect: NoSchedule

问题原因(我的情况)

我的情况有点特殊:症状是常见的症状,但是成因却稍微有所不同。

因为在第一次遇到这个问题之后,由于不懂,我一顿搜索搜索之后,执行了kubectl taint nodes k8s-master key=value:NoSchedulekubectl taint nodes --all node-role.kubernetes.io/master-命令。当执行第一条命令之后,将不会有Pod调度到主节点上。之后,执行第二条命令,虽然删除了node-role.kubernetes.io/master污点,但是依旧不能调度,因为Pod不能容忍第一个污点。

解决办法(我的情况)

不是常规成因,所以也不是常规的解决办法。

最后我也发现:由于之前的测试,在Master节点上添加了Taint的NoSchedule标记,从而导致后面创建的Pod示例无法调度到该节点上。因此去掉该Taint即可。(而最好的解决办法是把Master的node-role.kubernetes.io/master污点还给人家,然后运行正常的解决办法。)

注意事项

由于主节点具有一定的特殊性,出于安全及角色的原因,其实不建议在Master节点上运行Pod实例。

参考文献

Kubernetes ds won’t run pod on master node
Scheduler is not scheduling Pod for DaemonSet in Master node
kubernetes/Concepts/DaemonSet#Taints and Tolerations