在硬件升级、硬件维护等情况下,我们需要将某些Node进行隔离,脱离Kubernetes集群的调度范围。Kubernetes提供了一种机制,即可以将Node纳入调度范围,也可以将Node脱离调度范围。
创建配置文件unschedule_node.yaml
,在spec部分指定unschedulable
为true
:
apiVersion: V1
kind: Node
metadata:
name: kube-node1
lables:
kubernetes.io/hostname: kubernetes-minion1
spec:
unschedulable: true
然后,通过 kubectl replace
命令完成对 Node
状态的修改:
kubectl replace -f unschedule_node.yaml
nodes kube-node1 replaced
查看 Node 的状态,可以观察到在Node的状态中增加了一项SchedulingDisabled
:
kubectl get nodes
NAME STATUS ROLES AGE VERSION
kube-node1 Ready,SchedulingDisabled <none> 21d v1.10.4
kube-node2 Ready <none> 21d v1.10.4
kube-node3 Ready <none> 21d v1.10.4
对于后续创建的pod
,系统将不会再向该 Node 进行调度。
另一种方法是不使用配置文件,直接使用 kubectl patch
命令完成:
kubectl patch node kube-node1 -p '{"spec":{"unschedulable":true}}'
需要注意的是,将某个 Node 脱离调度范围时,在其上运行的pod并不会自动停止,管理员需要手动停止在该 Node 上运行的 Pod。
同样,如果需要将某个 Node 重新纳入集群调度范围,则将 unschedulable
设置为 false
,再次执行 kubectl replace 或 kubectl patch 命令就能恢复系统对改 Node 的调度。
kubectl的子命令cordon
和uncordon
也用于实现将Node进行隔离和恢复调度的操作。
例如,使用kubectl cordon
kubectl cordon k8s-node1
node "kube-node1" cordoned
恢复
kubectl uncordon k8s-node1
node "kube-node1" uncordoned
与cordon和uncordon的区别是什么
一个隔离,一个取消隔离。
抱歉,unschedulable与cordon的区别是什么
执行cordon命令的行为,其实就是给node标记
unschedulable":true
。