Node 的隔离与恢复

Kubernetes在硬件升级、维护等情况下。需要将某些Node隔离,使其脱离Kubernetes集群的调度范围。Kubernetes提供了一种机制,既可以将Node纳入调度范围,也可以将Node脱离调度范围。可以使用YAML文件或者kubectl命令进行调整。

1.使用YAML文件

创建配置文件unschedule_node.yaml,在spec部分指定unschedulabletrue

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子命令cordonuncordon也可以实现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的加入是非常简单的:

  1. 在新的Node上安装docker、kubelet、和kube-proxy服务。
  2. 然后配置kubelet和kube-proxy服务的启动参数,将Master URL指定为当前Kubernetes集群Master的地址。
  3. 最后启动这些服务。

通过kubelet服务默认的自动注册机制,新的Node将自动加入现有的Kubernetes集群中。Kubernetes Master在接受新Node的注册之后,会自动将其纳入当前集群的调度范围,之后创建容器时就可以对新的Node进行调度了。

参考:《Kubernetes权威指南(第五版)》