Kubernetes
管理的一个重要方面是在必要时从集群中删除节点。无论是需要用新节点替换旧节点,还是节点变得无响应或出现故障,都必须遵循正确的过程以避免潜在的数据丢失或应用程序中断。
移除工作节点较为简单;工作节点(Worker Node
)又称为:子节点,从节点等。
获取所有节点的名称,并确认要移除的节点(Node)
kubectl get nodes
使用 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
。--force
:强制删除。可能导致数据丢失,请谨慎使用。排空(drain)过程:
Ready
,SchedulingDisabled
),防止新的 Pod 被调度到该节点。【注】如果是临时系统维护或者突然不想移除了
,可以使用下面的命令,恢复节点的调度能力:
kubectl uncordon <node-name>
⚠️ 可能出现的异常:
不受常见控制器管理的 Pod,无法自动删除
例如直接手动创建的 Pod,当清空的时候无法调度到其他节点。
error: cannot delete Pods not managed by ReplicationController, ReplicaSet, Job, DaemonSet or
StatefulSet (use --force to override): sre/multi-container
这个时候就需要进行手动进行删除,或者使用 --force
(不推荐)。
从集群中删除节点。
kubectl delete node <node-name>
在被移除的控制平面节点中操作。
# 重置该节点,
kubeadm reset
kubeadm reset
命令用于将节点恢复到安装 kubeadm 之前的状态。这个命令会清除所有与 Kubernetes 相关的配置和数据。
执行过程如下:
Kubernetes
相关的容器。/etc/kubernetes/
目录中的所有配置文件。/var/lib/kubelet
/ 目录中的内容。/var/lib/etcd
目录(如果存在)。Kubernetes
相关的系统服务配置(如 kubelet.service
)。常用参数:
--force,-f
: 即使出现错误也继续执行重置操作。一般来说使用
kubeadm reset
命令可以满足很多场景;但是如果使用了自定义的 CNI
、iptables 规则
以及IPVS 模式的 kube-proxy
,可能还需要手动清理这些配置。
移除控制平面节点(Control Plane Node
)比较复杂,毕竟相当于是大脑;控制平面节点又称为主节点,从节点等。
移除主节点涉及更新控制平面组件配置,步骤如下:
获取所有节点的名称,并确定要删除的控制平面节点名称。
kubectl get nodes
与工作节点类似,驱逐主节点上的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>
在其他任意一个控制平面节点中操作,如果是外置的则在相应的机器上操作。
【注】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 成员可能不会导致立即的故障,但长期来看,它可能会影响集群的健康、性能和可管理性。
在其他控制平面节点中操作。
# 从集群中删除该 node 节点
kubectl delete node master3
在被移除的控制平面节点中操作。
# 重置该节点,
kubeadm reset
执行过程与移除工作节点一样,详细说明参考 1.4 重置该工作节点
。