k8s node节点平滑缩容
k8s集群平滑缩容node节点
·
k8s node节点平滑缩容
1.为什么不能直接kubectl delete node xxx
首先假设节点上如果跑了比较多的pod,以及如果万一包含了多个pod副本,其余pod能否承受得住业务请求等等情况
2.为什么不能用官方提供的驱逐pod命令
不确定驱逐策略是否满足当前生产环境的需求,如果资源不能平均分配,最后占用资源比较大的最后调度,node节点资源不足,pod无法调度pod状态为pending。
3.缩容考虑的因素
1)缩容的node节点无核心业务
2)缩容的node节点非nfs等重要节点
3)缩容后其他pod会被调用到其他节点,其他节点能否承载保证pod稳定运行
4)缩容的node节点上的pod有无类似nodeselector亲和性的配置
K8s node节点缩容
1)前置检查
检查当前Node节点上,业务Pod占用量最小的几个节点,作为缩容优先选择节点。
kubectl get po --no-headers -o wide |awk '{print $7}'|sort -rn |uniq -c |sort
根据查询的节点,检查对应节点上跑的业务pod
# 以节点172.16.x.x为例
kubectl get po -o wide -A |grep 172.16.x.x
# 确认该节点上没有跑特殊业务Pod
检查待缩容节点,不是NFS服务端,Nfs节点不能做缩容迁移。
暂无具体方法能够判断是nfs节点,如果集群为单nfs节点,直接通过pv就可以判断nfs所在节点。
检查待迁移的业务Pod所需资源大小
kubectl describe po pod-name |grep Requests -A 2
检查当前节点资源情况,判断能否保证pod迁移及正常运行
for n in `kubectl get nodes | grep -v NAME |grep -v master|grep -v SchedulingDisabled| awk '{print $1}'`; do echo $n && kubectl describe node $n | grep 'Allocated' -A7 |grep -E 'cpu|memory';done
2)驱逐容器
以下操作在Matser1 上进行
优雅的结束缩容 node 上的所有 pod 并同时标记节点为不可调度
kubectl cordon 172.16.x.x
kubectl get nodes|grep 172.16.x.x
# 手动迁移 pod,将资源要求较高的Pod先迁移
kubectl get po -o wide |grep 172.16.x.x
kubectl delete po xxxx
# 检查Pod迁移pod是否正常
kubectl get po -o wide |grep 172.16.x.x
kubectl get po |grep -v Running
# 清理 系统Pod
kubectl drain 172.16.x.x --ignore-daemonsets --delete-local-data --force
#确定节点无运行的pod
kubectl get po -o wide |grep 172.16.x.x
3)停止kubelet,kube-proxy相关服务
systemctl stop kubelet && systemctl stop kube-proxy
systemctl disable kubelet && systemctl disable kube-proxy
#检查是否已经关闭
systemctl status kube-proxy
systemctl status kubelet
4)master删除对应node节点
kubectl delete nodes xxxx
4)清除相关资源(可以不执行)
vim clean.sh
#该脚本可根据实际环境进行更换目录
#!/bin/bash
systemctl stop kubelet 2>/dev/null
docker stop $(docker ps -aq) 2>/dev/null
docker rm -f $(docker ps -aq) 2>/dev/null
systemctl stop docker 2>/dev/null
ip link del cni0 2>/etc/null
for port in 80 2379 6443 8086 {10249..10259} ; do
fuser -k -9 ${port}/tcp
done
mount | grep "/var/lib/kubelet/pods" > old_pods_mounts.log
cat old_pods_mounts.log | while read line
do
point=`echo ${line} | awk '{print $3}'`
echo "umount ${point}"
umount ${point}
done
rm -rfv /etc/kubernetes
rm -rfv /etc/docker
rm -fv /root/.kube/config
rm -rfv /var/lib/kubelet
rm -rfv /var/lib/cni
rm -rfv /etc/cni
rm -rfv /var/lib/etcd
rm -rfv /var/lib/postgresql /etc/core/token /var/lib/redis /storage /chart_storage
rm -rfv /var/lib/docker
rm -rfv /data/tke/docker
rm -rfv /data/tke-registry/storage
rm -rfv /data/var/lib/etcd
rm -rfv /data1/var/lib/etcd
rm -rfv /etc/sysconfig/docker
iptables -F
iptables -F -t nat
iptables -F -t mangle
systemctl start docker 2>/dev/null
sed -i '/192.168.192.10/d' /etc/resolv.conf
执行脚本
bash clean.sh
更多推荐
已为社区贡献4条内容
所有评论(0)