本节讲解Node管理方面的内容。
在硬件升级、维护等情况下,我们需要将某些Node隔离,使其脱离Kubernetes集群的调度范围。Kubernetes提供了一种机制,既可以将Node纳入调度范围,也可以将Node脱离调度范围。我们可以使用YAML文件或者kubectl命令进行调整,示例如下。
创建配置文件unschedule_node.yaml,在spec部分指定unschedulable为true:

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

查看Node的状态,可以观察到其中增加了一项SchedulingDisabled:

这样,系统就不会将后续创建的Pod调度向该Node了。
如果需要将某个Node重新纳入集群调度范围,则将unschedulable设置为false,再次运行kubectl replace命令,就能恢复系统对该Node的调度了。
我们也可以直接运行kubectl patch命令实现Node隔离调度的效果,不使用配置文件:

另外,使用kubectl子命令cordon和uncordon也可以实现Node的隔离调度和恢复调度。例如,运行kubectl cordon <node_name>命令对某个Node进行隔离调度操作:

又如,运行kubectl uncordon <node_name>命令对某个Node进行恢复调度操作:

需要注意的是,某个Node脱离调度范围时,其上运行的Pod并不会自动停止,用户需要对其手动停止。
在实际生产系统中经常会出现服务器容量不足的情况,这时就需要购买新的服务器,然后将应用系统进行水平扩展来完成对系统的扩容。
在Kubernetes集群中,一个新Node的加入是非常简单的。在新的Node上安装docker、kubelet和kube-proxy服务,然后配置kubelet和kube-proxy服务的启动参数,将Master URL指定为当前Kubernetes集群Master的地址,最后启动这些服务。通过kubelet服务默认的自动注册机制,新的Node将自动加入现有的Kubernetes集群中,如图10.1所示。

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