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
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐