一、什么是Kubernetes Cordon
Kubernetes Cordon 是 Kubernetes 节点管理中的一个命令,用于将一个节点标记为不可调度。使用该命令标记节点后,该节点上原有的pod不会删除,但是kube-scheduler将不会在该节点上新建pod。
二、Cordon的作用
1、避免节点被污染。 有时,在处理节点故障之前,您可能需要让kubernetes知道通知您节点故障的详细信息,以便您可以确定是否要修复该节点,还是直接删除它,并在缩小或扩展群集方案时保留该节点。k8s的Cordon命令可以允许您防止新的调度Pod运行在指定的节点上,从而避免节点被污染。
2、避免过载。 可以将Cordon命令用于您要关闭或彻底删除的节点。在指定时间范围内,您可以防止调度超出需要繁重资源的Pod,从而避免过载该节点。
3、方便维护。 您可以通过运行Cordon命令来停止可以在特定节点上运行的Pod,然后您可以完成此节点上的必要维护工作,无需担心将新的Pod调度在已停用的节点上。
三、使用场景
1、维护升级
对于长时间运行的集群环境,节点需要进行定期维护,例如,内核或系统更新、软件更新。
在升级之前,为了避免pod被强制调度到要维护的节点,可以使用Cordon命令将该节点标记为不可调度。这样kube-scheduler将不会在该节点上新建pod。并且kubelet不会自动将即将维护的节点上的Pod重启到集群中的其他节点。
当维护工作完成后,使用Kubernetes的Drain命令,可以安全地删除该节点上的Pod,以便在正常的维护周期后重新加入集群。
2、故障转移
在一些情况下,例如,节点上的硬件故障或云提供商故障,使得节点变得不可用。您可以使用kubectl drain命令将该节点上的pod迁移到集群的其他节点上,以保证业务的稳定运行。
在执行kubectl的drain命令时,将使用Cordon自动标记节点。
3、易于管理节点
在维护节点时,您可以使用Cordon命令将节点标记为不可调度,以避免节点被重新调度。同时,手动触发该节点上的删除操作。
例如,在您清理完成集群之后,您希望将节点再次纳入集群。只需使用kubectl uncordon命令即可解除Cordon ,这将启用kube-scheduler在该节点上创建Pod的能力。
四、使用实例
1、将节点标记为不可调度
$ kubectl cordon node-name
2、指定删除Pod的超时时间
在拒绝kube-scheduler分配pod到被标记为不可调度的节点上后,您可以安全地维护或故障转移。
在启用kubectl drain命令之前,您可以指定删除Pod的超时时间,如果Pod不在此期间内终止,并且没有出现任何错误,drain命令将自动失败并停止。
$ kubectl drain node-name --timeout=3600s
3、恢复节点的可调度性
当节点完成维护并且处于正常状态后,需要将其重新引入群集,以便继续分配Pod到该节点上。
$ kubectl uncordon node-name
五、总结
Kubernetes Cordon命令可以在需要对节点进行维护和故障转移时,暂时停止在该节点上调度和创建Pod, 保护集群的高可用性和可靠性,同时维护管理员对集群的控制。Cordon命令使管理员可以轻松地将以更加可预测,可维护和可控制的方式管理节点,并确保应用程序不受影响。