
做过扩容的运维应该都知道,K8S集群节点管理说难不难,说简单也不简单。最烦的就是临时要加机器、又临时要下机器——流程搞错的话,Pod 漂移出去服务就炸了。
如:业务促销现有的两个 worker 节点资源快见底了,监控报警响个不停。临时申请了一台服务器(k8s-node3,IP 10.0.0.105)要加进集群当工作节点。结束后流量回落,这台临时机器又得下线。整个流程跑了一遍,记录下来给需要的人参考。
新增节点
第一步永远是环境对齐。新机器到手先检查系统版本、容器运行时(我们用的是 containerd)、还有主机名解析是否配置好。这几项不对的话,后面 join 大概率会报错。
所有节点(包括 master)的 /etc/hosts 要保持一致:
cat <<EOF >> /etc/hosts
10.0.0.100 k8s-master
10.0.0.101 k8s-node1
10.0.0.102 k8s-node2
10.0.0.105 k8s-node3
EOF如果习惯用 SSH 批量管理节点,从 master 把公钥拷过去会方便很多:
ssh-copy-id root@10.0.0.105第二步在 master 上生成 join 命令,注意这个 token 有时效性,默认 24 小时过期:
kubeadm token create --print-join-command会输出类似这样的命令:
kubeadm join 10.0.0.100:6443 --token xxxxxx.yyyyy --discovery-token-ca-cert-hash sha256:zzzz登录到 k8s-node3,直接粘贴执行就行。执行完回 master 上验证:
kubectl get nodes能看到 k8s-node3 状态是 Ready 就稳了:
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane 45d v1.28.2
k8s-node1 Ready worker 45d v1.28.2
k8s-node2 Ready worker 45d v1.28.2
k8s-node3 Ready <none> 3m v1.28.2删除节点
下机器比加机器更得小心,Pod 迁移没做好服务就断了。
先在 master 上把节点标记为不可调度,防止新 Pod 再调度过来:
kubectl cordon k8s-node3然后 drain,这个命令会把节点上的 Pod 赶走。我们加了 --ignore-daemonsets 是为了忽略 kube-proxy 这类 DaemonSet Pod,它们不会受 drain 影响:
kubectl drain k8s-node3 --ignore-daemonsets--delete-emptydir-data这里要特别注意:--delete-emptydir-data 会删掉节点上 emptyDir 卷的数据。如果有些 Pod 用的是 emptyDir 存储(虽然不推荐),最好提前确认数据是否可以丢失,不然 drain 的时候会报错停住。
Pod 都漂移走后,就可以把节点从集群里删了:
kubectl delete node k8s-node3再查一下 kubectl get nodes,k8s-node3 应该就不见了。
最后在被删的节点上做清理,不然下次想重用来 init 会各种报错:
systemctl stop kubelet
kubeadm reset -f
rm-rf /etc/cni/net.d /var/lib/kubelet /var/lib/etcd /etc/kubernetes清理完后这台机器就干净了,想当新机器用也行,想关机也行。
踩过的坑提醒一下:生产环境操作节点最好避开业务高峰期,另外 drain 之前最好确认下目标节点资源够不够承接漂移过来的 Pod,不然 Pod 会卡在 Pending 状态。
如果你觉得这篇文章有用,欢迎点赞、转发、收藏、留言、推荐❤!
本文分享自 Nicholas与Pypi 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!