kubernetes Node的隔离与恢复

一,Node 的隔离与恢复

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

1. 使用YAML文件

创建unschedule_node.yaml,在spec部分指定unschedulable为true:

apiVersion: v1
kind: Node
metadata:
  name: node
  labels:
    kubernetes.io/hostname: node
spec:
  unschedulable: true

执行kubectl replace 命令,完成对Node状态的修改:

# kubectl replace -f unschedule_node.yaml 
node/node replaced

查看Node的状态,可以看到STATUS一列增加了 SchedulingDisabled:

# kubectl get nodes
NAME   STATUS                     ROLES    AGE   VERSION
node   Ready,SchedulingDisabled   <none>   82d   v1.25.2

这样,系统就不会将后续创建的Pod调度向该Node了。

如果你需要将某个Node重新纳入集群的调度范围,则将unschedulable 设置成false,再次运行kubectl replace命令,该Node就能调度了。

2.使用kubectl patch 命令

我们也可以运行kubectl patch 命令实现Node隔离调度,命令如下:

# kubectl patch node node -p '{"spec":{"unschedulable":true}}'
node/node patched
# kubectl get nodes
NAME   STATUS                     ROLES    AGE   VERSION
node   Ready,SchedulingDisabled   <none>   82d   v1.25.2

重新纳入调度范围,命令如下:

# kubectl patch node node -p '{"spec":{"unschedulable":false}}'
node/node patched
# kubectl get nodes
NAME   STATUS   ROLES    AGE   VERSION
node   Ready    <none>   82d   v1.25.2

3.使用kubectl cordon 和uncordon 命令

运行 kubectl cordon 命令对某个Node进行隔离调度操作:

# kubectl cordon node
node/node cordoned
# kubectl get nodes  
NAME   STATUS                     ROLES    AGE   VERSION
node   Ready,SchedulingDisabled   <none>   82d   v1.25.2

也可以运行 kubectl uncordon 命令对某个Node进行恢复调度操作:

# kubectl uncordon node
node/node uncordoned
# kubectl get nodes    
NAME   STATUS   ROLES    AGE   VERSION
node   Ready    <none>   82d   v1.25.2

需要注意的是,某个Node脱离调度范围时,其上运行的Pod并不会自动停止,需要其手动停止。

发表回复 0

Your email address will not be published. Required fields are marked *