Kubernetes 从集群中移除一个节点(Node)

Kubernetes 管理的一个重要方面是在必要时从集群中删除节点。无论您是需要用新节点替换旧节点,还是节点变得无响应或出现故障,都必须遵循正确的过程以避免潜在的数据丢失或应用程序中断。

1. 移除工作节点(Worker Node)

移除工作节点较为简单;工作节点(Worker Node)又称为:子节点,从节点等。

1.1 确定工作节点名称

获取所有节点的名称,并确认要移除的节点(Node)

kubectl get nodes

1.2 驱逐工作节点上的Pod

使用 kubectl drain 命令驱逐节点上的 Pod:

kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-data

参数说明:

  • --ignore-daemonsets:忽略 DaemonSet 管理的 Pod, DaemonSet 通常在每个节点上运行一个 Pod 副本,无法被迁移。
  • --delete-emptydir-data:如果 Pod 使用 emptyDir 卷,此选项允许删除这些卷中的数据。旧版本的 k8s 为 --delete-local-data

排空(drain)过程:

  • 将节点标记为不可调度(Ready,SchedulingDisabled),防止新的 Pod 被调度到该节点。
  • 逐个终止节点上的 Pod(除了 DaemonSet 的 Pod)。
  • Kubernetes 调度器会在集群的其他节点上重新创建这些 Pod。

【注】如果是临时系统维护或者突然不想移除了,可以使用下面的命令,恢复节点的调度能力:

kubectl uncordon <node-name>

1.3 删除工作节点

从集群中删除节点。

kubectl delete node <node-name>

1.4 重置该工作节点

在被移除的控制平面节点中操作。

# 重置该节点,
kubeadm reset

kubeadm reset 命令用于将节点恢复到安装 kubeadm 之前的状态。这个命令会清除所有与 Kubernetes 相关的配置和数据。

执行过程如下:

  • 停止并移除所有 Kubernetes 相关的容器。
  • 移除 /etc/kubernetes/ 目录中的所有配置文件。
  • 移除 /var/lib/kubelet/ 目录中的内容。
  • 移除 /var/lib/etcd 目录(如果存在)。
  • 删除 Kubernetes 相关的系统服务配置(如 kubelet.service)。

常用参数:

  • --force,-f: 即使出现错误也继续执行重置操作。

一般来说使用 kubeadm reset 命令可以满足很多场景;但是如果使用了自定义的 CNIiptables 规则以及 IPVS 模式的 kube-proxy ,可能还需要手动清理这些配置。

2. 移除控制平面节点(Control Plane Node)

移除控制平面节点(Control Plane Node)比较复杂,毕竟相当于是大脑;控制平面节点又称为主节点,从节点等。

移除主节点涉及更新控制平面组件配置,步骤如下:

2.1 确定控制平面节点名称

获取所有节点的名称,并确定要删除的控制平面节点名称。

kubectl get nodes

2.2 驱逐控制平面节点上的Pod

与工作节点类似,驱逐主节点上的Pod。

kubectl drain <master-node-name> --ignore-daemonsets --delete-emptydir-data

参数说明:

  • --ignore-daemonsets:忽略DaemonSet管理的Pod,简化驱逐过程,确保关键服务 Pod 在节点被驱逐时不会中断
  • --delete-emptydir-data:如果 Pod 使用 emptyDir 卷,此选项允许删除这些卷中的数据。旧版本的 k8s 为 --delete-local-data

【注】如果是临时系统维护或者突然不想移除了,可以使用下面的命令,恢复节点的调度能力:

kubectl uncordon <master-node-name>

2.3 更新 etcd 集群

在其他任意一个控制平面节点中操作,如果是外置的则在相应的机器上操作。

【注】Look here! 如果该节点中包含 etcd,还需要确保更新 etcd 集群配置以移除该节点。如果不包含的话可以跳过此步。

下面的示例为任意控制平面节点中操作:

# 查看 etcd 
kubectl get pods -n kube-system | grep etcd

# 登录集群的任意一个 ETCD Pod(通常位于其他控制平面节点)
kubectl exec -it etcd-master001 sh -n kube-system

# Pod 中设置登录 ETCD 的命令(临时设置别名,退出后失效)
export ETCDCTL_API=3
alias etcdctl='etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key'

# 查看集群节点列表
etcdctl member list

# 示例:
669bc6472fb13679, started, master1, https://192.168.1.19:2380, https://192.168.1.19:2379, false
959c93e3261aadcb, started, master2, https://192.168.1.20:2380, https://192.168.1.20:2379, false
ca5f1f6f780545ba, started, master3, https://192.168.1.23:2380, https://192.168.1.23:2379, false

# 删除master3节点
etcdctl member remove ca5f1f6f780545ba

🥹 如果没有在 etcd 中移除删除节点,可能会造成下面的问题:

  • 集群不一致:etcd 集群将继续尝试与已经不存在的成员通信,可能导致性能下降。在做出决策时,etcd 仍会考虑这个不再活跃的成员,可能影响到达成共识的速度。
  • 潜在的稳定性问题:如果不移除inactive成员,etcd集群可能无法正确管理其成员关系,导致稳定性问题。
  • 扩展性受限:etcd 集群有成员数量限制。保留不活跃的成员会占用这个限额,影响未来添加新成员的能力。
  • 错误日志和告警:系统可能会持续生成关于无法连接到已移除节点的错误日志和告警。
  • 恢复和灾难恢复复杂化:在需要恢复 etcd 集群时,存在的无效成员可能会使过程变得更加复杂。
  • 性能影响:etcd 可能会持续尝试与不存在的成员通信,浪费资源并可能影响整体性能。

【注】虽然短期内不移除 etcd 成员可能不会导致立即的故障,但长期来看,它可能会影响集群的健康、性能和可管理性。

2.4 从集群中删除控制平面节点

在其他控制平面节点中操作。

# 从集群中删除该 node 节点
kubectl delete node master3

2.5 重置移除的控制平面节点

在被移除的控制平面节点中操作。

# 重置该节点,
kubeadm reset

执行过程与移除工作节点一样,详细说明参考 1.4 重置该工作节点

3. 注意事项

  • 确保高可用性:移除主节点之前,确保集群有足够的高可用性,至少有一个以上的备用主节点;如果是移除工作节点,确保应用支持高可用,防止出现业务中断。
  • 检查配置文件:根据安装方式(如 kubeadm、kops、kubespray 等),可能需要额外检查和更新配置文件,以保证节点的移除工作。
  • 清理节点:在实际从物理或虚拟机中移除节点之前,清理节点上的Kubernetes配置和数据;如果服务器有快照的话,可以还原快照。
  • 保持敬畏之心:如果是线上环境,还是要有一个敬畏之心,保障业务系统的可用性。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注