内容简介
处理「当使用DaemonSet时,没有在主节点创建Pod实例」问题。
问题描述
在以DaemonSet方式部署Traefik Ingress Controller之后,没有在Master节点上创建Pod实例。因此不能通过Master节点来访问服务,但是我们希望Master节点中也运行Pod实例。
经过一番Google查找,学习「Taints and Tolerations」文档。
问题原因(正常情况)
因为从1.6开始,不会再将DaemonSet调度到主节点上。由于主节点上有node-role.kubernetes.io/master及NoSchedule污点,而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:NoSchedule与kubectl 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实例。
参考文献
WikiNotes/使用DaemonSet时,主节点没有运行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