我们已经把master 节点设置了:SchedulingDisabled :
$ kubectl get node
NAME STATUS ROLES AGE VERSION
10.2.2.120 Ready,SchedulingDisabled master 239d v1.13.3
10.2.2.121 Ready metallb-speaker,node 239d v1.13.3
10.2.2.122 Ready metallb-speaker,node 239d v1.13.3
10.2.2.123 Ready node 105d v1.13.3
但是我部署的DaemonSet 还是有pod被调度在设置了SchedulingDisabled的节点(10.2.2.120)上,如下:
$ kubectl get po -l app=nginx -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
web-7l4s6 1/1 Running 0 35s 172.20.0.100 10.2.2.120 <none> <none>
web-clvgl 1/1 Running 0 35s 172.20.3.122 10.2.2.123 <none> <none>
web-j7plz 1/1 Running 0 35s 172.20.1.182 10.2.2.121 <none> <none>
web-zgbnd 1/1 Running 0 35s 172.20.2.139 10.2.2.122 <none> <none>
要想防止pod被调度到SchedulingDisabled的节点上,可以把DaemonSet设置一个nodeSelector,让po运行在指定标签的节点上:
1. 先把节点打上标签:
kubectl label nodes 10.2.2.121 key=val
kubectl label nodes 10.2.2.122 key=val
kubectl label nodes 10.2.2.123 key=val
2. 然后在DaemonSet上增加节点选择:nodeSelector:
$ cat daemonset.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: web
namespace: default
labels:
app: nginx
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
nodeSelector:
key: val
containers:
- name: nginx
image: nginx:latest
3. 再检查,已经运行正确调度在我们选择的node上:
$ kubectl get po -l app=nginx -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
web-6rnk8 1/1 Running 0 34s 172.20.3.123 10.2.2.123 <none> <none>
web-9jdpc 1/1 Running 0 22s 172.20.2.140 10.2.2.122 <none> <none>
web-l5gvj 1/1 Running 0 56s 172.20.1.183 10.2.2.121 <none> <none>
还有其他的方法,参考:
https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/#taints-and-tolerations
kubernetes-K8S调度之Taints and Tolerations
其他参考:
https://stackoverflow.com/questions/40493395/kubernetes-1-4-3-why-daemonset-is-scheduled-on-master
https://kubernetes.io/zh/docs/concepts/workloads/controllers/daemonset/