處理「當使用DaemonSet時,沒有在主節點建立Pod實例」問題。node
在以DaemonSet方式部署Traefik Ingress Controller以後,沒有在Master節點上建立Pod實例。所以不能經過Master節點來訪問服務,可是咱們但願Master節點中也運行Pod實例。安全
通過一番Google查找,學習「Taints and Tolerations」文檔。ide
由於從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
個人狀況有點特殊:症狀是常見的症狀,可是成因卻稍微有所不一樣。kubernetes
由於在第一次遇到這個問題以後,因爲不懂,我一頓搜索搜索以後,執行了kubectl taint nodes k8s-master key=value:NoSchedule與kubectl 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