k8s集群删除/添加worker节点

🔧 删除旧的 Worker 节点

安全地移除一个 Worker 节点可以确保你的服务平稳迁移,避免中断。

步骤

关键命令/操作

说明

1. 排空 (Drain) 节点

kubectl drain <旧节点名称> --ignore-daemonsets --delete-emptydir-data --force

将节点置为不可调度,并将其上的 Pod 安全驱逐到其他节点。--ignore-daemonsets参数很重要,因为 DaemonSet 管理的 Pod 通常每个节点都需要一个副本,需要忽略它们才能成功排空

2. 确认节点已清空

`kubectl get pods --all-namespaces -o wide

grep <旧节点名称>`

3. 从集群中删除节点

kubectl delete node <旧节点名称>

从 Kubernetes API 中移除该节点

4. 在旧节点上清理

sudo systemctl stop kubelet docker
sudo rm -rf /etc/kubernetes/ /var/lib/kubelet/ /var/lib/etcd/ /var/lib/cni/
sudo iptables -F && sudo iptables -t nat -F

停止服务并清理配置、数据文件和网络规则,为可能的重用做准备

 

1. 执行kubectl drain后,节点状态有变化

 

image

2. node2删除后,为何还能看到之前node2上的pod?

🎯 根本原因

这是因为 Kubernetes 的 Pod 删除是异步进行的:

  1. 节点删除是立即的:kubectl delete node命令会立即从 API Server 中移除节点对象

  2. Pod 清理是滞后的:节点上的 Pod 不会立即被删除,需要等待垃圾收集器处理

🛠️ 解决方案

方案1:手动删除残留的 Pod(推荐)

# 删除 node2 上残留的 Flannel Pod
kubectl delete pod kube-flannel-ds-xckvk -n kube-flannel

# 删除 node2 上残留的 kube-proxy Pod  
kubectl delete pod kube-proxy-mjjkg -n kube-system

# 验证所有 Pod 状态
kubectl get pods -A -o wide

方案2:等待自动垃圾回收

Kubernetes 垃圾收集器通常会在几分钟内自动清理这些"孤儿Pod",等待2-5分钟后再查看

image

方案3:强制立即清理

如果需要立即清理,可以重启相关控制器:

# 重启 kube-controller-manager(会触发更快的垃圾回收)
kubectl delete pod -n kube-system -l component=kube-controller-manager

💡 深入理解 Pod 生命周期

为什么会出现这种情况?

  1. DaemonSet 的特殊性:

    • Flannel 和 kube-proxy 都是 DaemonSet

    • DaemonSet 确保每个节点上运行一个 Pod 实例

    • 当节点被删除时,对应的 DaemonSet Pod 会变成"孤儿"

  2. Kubernetes 的最终一致性:

    • 节点删除是声明式操作

    • Pod 清理是后台异步过程

    • 这体现了 Kubernetes 的"最终一致性"设计理念

验证节点真正状态

# 检查节点详细状态(确认是否真的已删除)
kubectl get node -o yaml | grep -A 5 -B 5 "name:"

# 检查 DaemonSet 状态
kubectl get daemonsets --all-namespaces

 

🎯 添加新的 Worker 节点

成功移除旧节点后,接下来是将新节点加入集群。

步骤

关键命令/操作

说明

1. 新节点基础准备

安装 docker/containerd, kubeadm, kubelet, kubectl

确保容器运行时和 Kubernetes 组件版本与集群现有版本一致

 
关闭 swap,配置防火墙规则,确保与 Master 节点的网络连通

2. 获取加入命令

在 Master 节点执行:
kubeadm token create --print-join-command

此命令会输出一个包含令牌和哈希值的完整 kubeadm join命令

3. 新节点加入集群

在新节点上执行上一步获取的 kubeadm join命令

命令格式类似:
kubeadm join <控制平面节点IP:端口> --token <令牌> --discovery-token-ca-cert-hash sha256:<哈希值>

4. 验证新节点

kubectl get nodes

新节点应出现在列表中,状态为 Ready

 

posted on 2025-11-25 15:26  Karlkiller  阅读(0)  评论(0)    收藏  举报

导航