Node 的隔离与恢复
Kubernetes在硬件升级、维护等情况下。需要将某些Node隔离,使其脱离Kubernetes集群的调度范围。Kubernetes提供了一种机制,既可以将Node纳入调度范围,也可以将Node脱离调度范围。可以使用YAML文件或者kubectl命令进行调整。
1.使用YAML文件
创建配置文件unschedule_node.yaml,在spec部分指定unschedulable
为true
:
apiVersion: v1
kind: Node
metadata:
name: node1
labels:
kubernetes.io/hostname: node1
spec:
unschedulable: true
注意:执行该yaml,会把原来node的labels替换掉。所以要注意先备份原来的label信息。
执行kubectl replace
命令,完成对Node状态的修改:
[root@master1 ~# kubectl replace -f unschedule_node.yaml
node/node1 replaced
[root@master1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master1 Ready <none> 76d v1.19.15
master2 Ready <none> 76d v1.19.15
node1 Ready,SchedulingDisabled <none> 5m36s v1.19.15
node2 Ready <none> 76d v1.19.15
这样,系统就不会将后续创建的Pod调度到该Node了。
如果需要将某个Node重新纳入集群调度范围,则将unschedulable
设置为false
,再次运行kubectl replace
命令,就能恢复系统对该Node的调度了。
2. 使用kubectl path命令
也可以直接运行kubectl path
命令实现Node隔离调度效果,不使用配置文件:
[root@master1 ~]# kubectl patch node node1 -p '{"spec":{"unschedulable":true}}'
node/node1 patched
[root@master1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master1 Ready <none> 76d v1.19.15
master2 Ready <none> 76d v1.19.15
node1 Ready,SchedulingDisabled <none> 22m v1.19.15
node2 Ready <none> 76d v1.19.15
[root@master1 ~]# kubectl patch node node1 -p '{"spec":{"unschedulable":false}}'
node/node1 patched
[root@master1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master1 Ready <none> 76d v1.19.15
master2 Ready <none> 76d v1.19.15
node1 Ready <none> 22m v1.19.15
node2 Ready <none> 76d v1.19.15
3. 使用 kubectl cordon 和 uncordon 命令
使用kubectl
子命令cordon
和uncordon
也可以实现Node的隔离调度和恢复调度:
[root@master1 ~]# kubectl cordon node1
node/node1 cordoned
[root@master1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master1 Ready <none> 76d v1.19.15
master2 Ready <none> 76d v1.19.15
node1 Ready,SchedulingDisabled <none> 28m v1.19.15
node2 Ready <none> 76d v1.19.15
[root@master1 ~]# kubectl uncordon node1
node/node1 uncordoned
[root@master1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master1 Ready <none> 76d v1.19.15
master2 Ready <none> 76d v1.19.15
node1 Ready <none> 29m v1.19.15
node2 Ready <none> 76d v1.19.15
Node的扩容
在Kubernetes集群中,一个新Node的加入是非常简单的:
- 在新的Node上安装docker、kubelet、和kube-proxy服务。
- 然后配置kubelet和kube-proxy服务的启动参数,将Master URL指定为当前Kubernetes集群Master的地址。
- 最后启动这些服务。
通过kubelet服务默认的自动注册机制,新的Node将自动加入现有的Kubernetes集群中。Kubernetes Master在接受新Node的注册之后,会自动将其纳入当前集群的调度范围,之后创建容器时就可以对新的Node进行调度了。
参考:《Kubernetes权威指南(第五版)》