目录
ansible 清理k8s集群的node节点日志
自己产品线所使用的k8s集群的node节点经常磁盘告警,因此写了个简单脚本清理各个节点上的日志
我在k8s集群部署了rocketmq,且没指定节点,所以会经常漂移,导致各个节点有mq日志,以及docker自身的日志
获取对应节点信息脚本
我这里用kubectl通过标签筛选出属于我们产品线的node节点Ip,并加入到ansible管理
用到的脚本如下:
cat check8snode.sh
#!/bin/bash
#根据标签获取node节点Ip并排除master节点写入nodelist文件
GETNODEIP() {
rancher kubectl get nodes -o wide --show-labels | grep -E "productLine=ecs2|productLine=hotfix|productLine=ecs-micro-first" | awk '{print $6}' | grep -vE "48.85|INTERNAL-IP" | tee nodelist
}
#读取nodelist文件并把节点信息同步到ansible配置中,然后删除nodelist文件
UPDATEANSIBLE() {
echo "[k8son]" > /etc/ansible/hosts
for i in `cat nodelist`;do echo $i >> /etc/ansible/hosts;done
rm -rf nodelist
}
GETNODEIP
UPDATEANSIBLE
加入自动计划任务
crontab -e
#每天凌晨7点检查一次k8s的节点并同步更新到ansible配置
30 7 * * * /opt/helloWorld/check8snode.sh
删除各个节点的日志脚本
因为机器不是同一个人提供的,所以docker日志路径有所不同
cat clear_docker_log.sh
#!/bin/bash
set -e
set -x
#for循环嵌套清理rocketmq日志
CLEARMQLOG() {
for path in {"/data/docker/overlay2/","/var/lib/docker/overlay2/"};
do
logs=$(find ${path} -name rocketmq_client.log.* || echo "nopath")
for log in $logs
do
echo "clean logs : $log"
cat /dev/null > $log
done
done
}
#for循环嵌套containers日志
CLEARCONTAINERLOG() {
for path in {"/data/docker/containers/","/var/lib/docker/containers/"};
do
logs=$(find ${path} -name *-json.log || echo "nopath")
for log in $logs
do
echo "clean logs : $log"
cat /dev/null > $log
done
done
}
CLEARMQLOG
CLEARCONTAINERLOG
#清理后重启docker,防止程序占用磁盘空间不释放
systemctl restart docker
ansible分发clear_docker_log.sh并做成计划任务
//探测上面k8s节点是否可以通信
ansible k8son -m ping
//拷贝ansible当前的清理日志脚本/opt/helloWorld/clear_docker_log.sh 到每个k8s节点的/opt下并授权755
ansible k8son -m copy -a "src=/opt/helloWorld/clear_docker_log.sh dest=/opt/clear_docker_log.sh backup=yes mode=755 owner=root"
//给每个k8s节点添加定时任务
//job:定义是操作的行为
//weekday:每周
//day:天
//minute:分钟
//hour:小时
//month:月份
ansible k8son -m cron -a 'minute=35 hour=6 job="/opt/clear_docker_log.sh" name="CLEAR DOCKER LOGS EVERYDAY"'
//如果想注释自动计划任务
ansible k8son -m cron -a 'job="/opt/clear_docker_log.sh" name="CLEAR DOCKER LOGS EVERYDAY" disabled=True'
//如果想再打开计划任务
ansible k8son -m cron -a 'job="/opt/clear_docker_log.sh" name="CLEAR DOCKER LOGS EVERYDAY" disabled=false'
怎么样?这样管理起来就方便多了对不
基于这几个命令我们也可以把他门加入自动计划任务
//因为懒得再加定时任务和脚本,我们重新编辑上面check8snode.sh脚本
cat check8snode.sh
#!/bin/bash
#根据标签获取node节点Ip并排除master节点写入nodelist文件
GETNODEIP() {
rancher kubectl get nodes -o wide --show-labels | grep -E "productLine=ecs2|productLine=hotfix|productLine=ecs-micro-first" | awk '{print $6}' | grep -vE "48.85|INTERNAL-IP" | tee nodelist
}
#读取nodelist文件并把节点信息同步到ansible配置中,然后删除nodelist文件
UPDATEANSIBLE() {
echo "[k8son]" > /etc/ansible/hosts
for i in `cat nodelist`;do echo $i >> /etc/ansible/hosts;done
rm -rf nodelist
}
COPYFILETONODE() {
ansible k8son -m copy -a "src=/opt/helloWorld/clear_docker_log.sh dest=/opt/clear_docker_log.sh backup=yes mode=755 owner=root"
ansible k8son -m cron -a 'minute=35 hour=6 job="/opt/clear_docker_log.sh" name="CLEAR DOCKER LOGS EVERYDAY"'
}
GETNODEIP
UPDATEANSIBLE
COPYFILETONODE
这样即使新增节点,每天自动从k8s节点获取节点Ip,并把清理日志的脚本分发到各个节点并做成计划任务,不用担心新增节点而遗漏计划任务了
标签:node,log,sh,ansible,docker,k8s,节点,日志 From: https://www.cnblogs.com/liwenchao1995/p/16955973.html