1.背景
场景:1
测试环境k8s 集群中例如业务启动的pod 长时间没有进行维护导致僵死
场景:2
pod 输出的日志文件太多量太大导致日志收集容器出现收集不到或者日志内容延迟的相关问题.
场景:3
应用多容器采用pod代理管控流量方式代码层面导致容器连接长时间失败.
故
1.降低人工操作成本.需要编写一个脚本按照命名空间的维度进行清理指定日期的运行pod .
2.操作shell脚本
#!/bin/bash
set -e
namespace=$1
run_day=$2
# 过滤不需要处理的pod和pod异常状态
exclude="NAME|Terminating|Evicted|CrashLoopBackOff|ImagePullBackOff|zookeeper|kafka|etcd|nginx-ingress-controller|multienv-dns|es-cluster|elasticsearch"
# 获取当前时间做为删除时间记录日志
current_time=$(date +%Y%m%d_%H_%M_%S)
log_path="/data/log/ops/pod_delete.log"
# 脚本参数控制 必须输出位置参数
if [ $# -ne 2 ]; then
echo "错误:请提供2个位置参数"
exit 1
fi
# 使用正则表达式来检查输入是否为整数 非int脚本终止运行
if [[ $run_day =~ ^[0-9]+$ ]]; then
echo "Input run_day 天数ok"
else
echo "Input run_day 类型错误必须是数字: $run_day"
exit 1
fi
# 检查kubectl命令是否可用
echo "start time $current_time" >> $log_path
if ! which kubectl > /dev/null 2>&1; then
printf "${RED}kubectl命令不存在,请确认是否已经正确安装${NC}\n"
exit 1
fi
# 关键参数控制 必须输出集群存在的ns
nsList=$(kubectl get ns |grep -E "test-01|test-03|test-09|test-10|test-13")
if [[ $nsList == *"$namespace"* ]]; then
echo "命名空间已存在集群中"
else
echo "输出的命名空间不存在集群中."
exit 1
fi
# 定义颜色变量
RED='\033[0;31m'
NC='\033[0m'
# 检查日志文件是否存在
if [ ! -f $log_path ]
then
printf "${RED}日志文件不存在,请确认是否已经正确创建$log_path ${NC}\n"
exit 1
fi
# 统计输出ns空间下运行pod 大于run_day天进行删除;
podList=$(kubectl get pod -n $namespace |grep -v -E "$exclude" |awk -v run_day="$run_day" '($5 ~ /d/ && int($5) > run_day) {print $1}')
for pod_name in $podList
do
if test -z "$pod_name"
then
continue
else
echo "重启时间: $current_time 命名空间: $namespace 重启Pod名称: $pod_name" >> $log_path
kubectl delete pod -n $namespace $pod_name
fi
done
3.使用方式
#日志文件
mkdir /data/log/ops/ -p
touch /data/log/ops/pod_delete.log
#脚本执行
bash pods_restart.sh test 7
Input run_day 天数ok
命名空间已存在集群中
#删除pod日志查看
tail -10 /data/log/ops/pod_delete.log