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

内容简介

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

问题描述

在以DaemonSet方式部署Traefik Ingress Controller以后,没有在Master节点上建立Pod实例。所以不能经过Master节点来访问服务,可是咱们但愿Master节点中也运行Pod实例。安全

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

问题缘由(正常状况)

由于从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

问题缘由(个人状况)

个人状况有点特殊:症状是常见的症状,可是成因却稍微有所不一样。kubernetes

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

解决办法(个人状况)

不是常规成因,因此也不是常规的解决办法。io

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

注意事项

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

参考文献

Kubernetes ds won't run pod on master nodeScheduler is not scheduling Pod for DaemonSet in Master nodekubernetes/Concepts/DaemonSet#Taints and Tolerations