「Kubernetes」-

当使用 DaemonSet 资源时,Master 节点没有运行 Pod 实例

处理问题:当使用 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 nodeScheduler 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