1. 前言:
云上购买的 ECS 所支持的最大连接数,CPU 等资源有限,而 k8s 调度 pod 部署到 Node 按照资源水位等条件分配,部分高耗资源应用需要平均分布到不同的 Node 上,以防止同一个 Node 包含多个该应用 POD 导致网络链接数等资源消耗过大。
2. 实现思路:
- 将已经部署当前应用的Node 设置为不可调度;
- 获取部署当前应用且包含多个该应用 POD 的POD Name,删除该 POD, k8s 自动重新调度部署该 POD 到可调度的 Node 上;
- 如果还有未平均分布的 Node,多次循环执行以上操作;
- 将所有设置为不可调度的 Node 恢复为可以调度。
3. 实现脚本
#!/bin/bash
## 设置 已经包含应用的Node为不可调度
for i in $(kubectl get nodes|grep Ready|awk '{print $1}')
do
echo $i
check_results=$(kubectl describe node $i | grep {app_name} | awk "{print $2}"|wc -l)
if (( $check_results > 0 )); then
echo $check_results
kubectl cordon $i
fi
done
## 删除多个 POD 部署的
for i in $(kubectl get nodes|grep Ready|awk '{print $1}')
do
echo $i
check_results=$(kubectl describe node $i | grep {app_name} | awk "{print $2}"|wc -l)
if (( $check_results > 1 )); then
echo $check_results
check_results=$(kubectl describe node $i | grep {app_name} | awk '{print $2}'|head -1)
echo $check_results
kubectl delete pods $check_results --grace-period=0 --force -n {app_name}
fi
done
## 设置 恢复Node 为可调度
for i in $(kubectl get nodes|grep Ready|awk '{print $1}')
do
echo $i
kubectl uncordon $i
done