应用背景:
使用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 |
操作步骤:
- 创建pod查看运行节点情况
[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>
多次尝试发现pod只运行在kube-node-02,kube-node-02节点上,不会往master节点调度
- 查看master节点信息
[root@kube-node-01 ~]# kubectl describe node kube-node-01
……
Taints: node-role.kubernetes.io/master:NoSchedule
Unschedulable: false
……
发现master节点污点参数Taints为node-role.kubernetes.io/master:NoSchedule
- 解决方案
- 去掉“污点”(taints)【生产环境不推荐】
[root@kube-node-01 ~]# kubectl taint nodes kube-node-01 node-role.kubernetes.io/master-
- 让pod能够容忍(tolerations)该节点上的“污点”
……
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
发现问题已解决,kube-node-01节点可以调度pod了
- 备注
- 让 master节点恢复不参与POD负载的命令为
[root@kube-node-01 ~]# kubectl taint nodes <node-name> node-role.kubernetes.io/master=:NoSchedule
- 让 master节点恢复不参与POD负载,并将Node上已经存在的Pod驱逐出去的命令
[root@kube-node-01 ~]# kubectl taint nodes <node-name> node-role.kubernetes.io/master=:NoExecute