Kubernetes集群中如何升级节点

50次阅读
没有评论

问题描述

想知道如何在Kubernetes集群中升级节点,以保持节点的最新状态,包括内核修复等。用户想知道一旦有更新的镜像可用(即ASG已重新配置,以便新节点使用更近期的AMI生成),应该如何替换现有节点。用户还想知道是否有命令可以禁止所有现有(或旧的)节点进行Pod调度。在尝试排空节点之前,是否有必要执行滚动重启部署等操作。即使其他剩余节点(已禁止或部分排空)几乎空闲/未占用,新节点是否会根据Pod调度需求自动启动?还是最好取消自动缩放并进行手动缩放?节点排空后多久会自动终止实例?在Kubernetes中手动删除节点(在AWS集群中)是否会导致AWS集群自动缩放器立即终止该实例?还是应该使用AWS CLI进行终止?在完全排空之前删除(或终止)节点是否会丢失持久数据?此外,是否可以为某些Pod授予例外(例如,长时间运行的交互式用户会话,如JupyterHub),同时确保在这些Pod完成后尽快刷新其主机节点?如果可以,是否可以在有紧急安全补丁时覆盖此设置?

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

在Kubernetes或Kubernetes集群中,要升级节点并保持高可用性的在线服务,可以使用以下步骤:
1. 使用kubectl drain命令排空节点。这将禁止节点上的新Pod调度,并优雅地驱逐当前的Pod。请注意,这不会影响静态/镜像Pod(这些Pod在API控制之外)和守护程序Pod(因为它们的控制器忽略了污点)。kubectl drain命令会阻塞直到完成(如果需要排空多个节点,则需要并行调用),如果节点上有任何无控制器的裸Pod(没有控制器来替换它们),则需要使用--force参数。
2. 使用kubectl delete node命令手动删除节点。这将触发Kubernetes删除节点对象,该对象表示当前可用的实例。请注意,Kubernetes中的删除通常会级联进行。删除节点可能会导致动态分配的“持久”卷中的数据丢失,因此请确保没有数据存储在节点上。
3. 使用AWS CLI命令aws autoscaling terminate-instance-in-auto-scaling-group手动终止实例。这将通知AWS EC2自动缩放组(ASG)终止指定的实例。请注意,如果ASG已达到其MinSize,则可能需要使用--no-should-decrement-desired-capacity选项。Kubelet应该尝试(使用systemd)检测实例何时正在关闭,并延迟关闭时间以使剩余的Pod有机会正常关闭。
4. 在排空节点之前,确保没有数据存储在节点上。删除节点将丢弃节点上存储的任何数据。
5. 在升级节点之前,确保已经备份了重要的数据和配置文件。

方案2

另一种方法是使用Kubernetes的滚动重启功能来升级节点。滚动重启是一种替换Pod的方法,它确保在删除旧Pod之前,新Pod已经准备好。以下是使用滚动重启升级节点的步骤:
1. 使用kubectl get deployments命令获取所有部署的列表。
2. 对于每个部署,使用kubectl rollout restart deployment <deployment-name>命令执行滚动重启。这将逐步替换每个Pod,确保在删除旧Pod之前,新Pod已经准备好。
3. 使用kubectl get pods命令检查滚动重启的进度。确保新Pod已经准备好并且旧Pod已经被删除。
4. 重复上述步骤,直到所有部署的Pod都已经被替换为新的Pod。

请注意,滚动重启期间,应用程序的可用性将在一定程度上受到影响。因此,在执行滚动重启之前,请确保已经备份了重要的数据和配置文件,并在非高峰期执行升级操作。

方案3

如果您使用的是托管的Kubernetes服务(如AWS EKS或Google GKE),建议参考它们的文档和最佳实践来升级节点。这些服务通常提供了更高级的工具和功能来简化节点升级过程,并确保高可用性。

总结

在Kubernetes集群中升级节点可以使用kubectl drain命令排空节点,然后使用kubectl delete node命令手动删除节点。另一种方法是使用滚动重启功能来逐步替换Pod。无论使用哪种方法,请确保在升级之前备份重要的数据和配置文件,并在非高峰期执行升级操作。如果您使用的是托管的Kubernetes服务,请参考其文档和最佳实践来执行节点升级操作。

正文完