应用背景:
使用kubeadm部署的kubernetes集群,其master节点默认拒绝将pod调度运行于其上的,加点官方的术语就是:master默认被赋予了一个或者多个“污点(taints)”,“污点”的作用是让该节点拒绝将pod调度运行于其上。那么存在某些情况,比如想让master也成为工作节点可以调度pod运行怎么办呢?
两种方式:①去掉“污点”(taints)【生产环境不推荐】;②让pod能够容忍(tolerations)该节点上的“污点”。
测试环境:
节点名称 | 节点类型 | 版本号 | 部署方式 |
kube-node-01 | Master | v1.11.2 | kubeadm init |
kube-node-02 | Node | v1.11.2 | kubeadm join |
kube-node-03 | Node | v1.11.2 | kubeadm join |
操作步骤:
1. 当前环境
[root@kube-node-01 ~]# kubectl get pod -o wide No resources found.
2. 准备一个yaml文件创建pod(2副本)
[root@kube-node-01 ~]# kubectl apply -f test-springboot-rc.yaml
replicationcontroller/test-springboot created
[root@kube-node-01 ~]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE test-springboot-6495q 1/1 Running 0 2m 10.244.2.113 kube-node-03 <none> test-springboot-b5sq2 1/1 Running 0 2m 10.244.1.76 kube-node-02 <none>
以上运行的2个pod分别被调度到节点2和节点3上,目前还不足以说明调度不到节点1上,继续操作;
3. 扩容pod副本观察
[root@kube-node-01 ~]# kubectl scale rc test-springboot --replicas=3 replicationcontroller/test-springboot scaled
[root@tlsw-pre-01 ~]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE test-springboot-6495q 1/1 Running 0 4m 10.244.2.113 kube-node-03 <none> test-springboot-68qtw 1/1 Running 0 9s 10.244.2.114 kube-node-03 <none> test-springboot-b5sq2 1/1 Running 0 4m 10.244.1.76 kube-node-02 <none>
一般情况下,kubernetes的pod调度策略会尽量的安排相同的pod安排至不同的节点,上面推测因为节点1含有污点,pod不得不再次调度到节点2或者节点3上去。
再次测试默认调度,添加pod副本至5个:
[root@tlsw-pre-01 home]# kubectl scale rc test-springboot --replicas=5 replicationcontroller/test-springboot scaled [root@tlsw-pre-01 home]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE test-springboot-4875k 1/1 Running 0 1m 10.244.1.77 kube-node-02 <none> test-springboot-6495q 1/1 Running 0 14m 10.244.2.113 kube-node-03 <none> test-springboot-68qtw 1/1 Running 0 10m 10.244.2.114 kube-node-03 <none> test-springboot-b5sq2 1/1 Running 0 14m 10.244.1.76 kube-node-02 <none> test-springboot-hghwb 1/1 Running 0 1m 10.244.2.115 kube-node-03 <none>
以上显而易见,master节点(kube-node-01)上一直没有pod运行,因为含有“污点”作祟。
4. 查看master节点的容忍参数
[root@kube-node-01 ~]# kubectl describe node kube-node-01 …… Taints: node-role.kubernetes.io/master:NoSchedule Unschedulable: false ……
5.添加污点容忍(并再次增加副本数至6)
根据容忍参数在pod对应的yaml文件中添加“容忍”段,如下:
……
replicas: 6 // 在当前的运行环境副本数(5个)上增加1个副本,用来观察pod调度
……
spec: tolerations: - key: node-role.kubernetes.io/master operator: Exists effect: NoSchedule containers: - name: test-springboot ……
[root@tlsw-pre-01 home]# kubectl apply -f test-springboot-rc.yaml replicationcontroller/test-springboot configured [root@tlsw-pre-01 home]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE test-springboot-4875k 1/1 Running 0 10m 10.244.1.77 kube-node-02 test-springboot-6495q 1/1 Running 0 23m 10.244.2.113 kube-node-03 test-springboot-68qtw 1/1 Running 0 19m 10.244.2.114 kube-node-03 test-springboot-6pz2x 0/1 ContainerCreating 0 3s <none> kube-node-01 test-springboot-b5sq2 1/1 Running 0 23m 10.244.1.76 kube-node-02 test-springboot-hghwb 1/1 Running 0 10m 10.244.2.115 kube-node-03
很明显,最新的一个pod已经调度至master节点,还在创建中,等待一下即可正常running。
结束.