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
# kubectl cordon node
node/node cordoned
# kubectl get nodes
NAME STATUS ROLES AGE VERSION
node Ready,SchedulingDisabled <none> 82d v1.25.2
也可以运行 kubectl uncordon
# kubectl uncordon node
node/node uncordoned
# kubectl get nodes
NAME STATUS ROLES AGE VERSION
node Ready <none> 82d v1.25.2
需要注意的是,某个Node脱离调度范围时,其上运行的Pod并不会自动停止,需要其手动停止。