ansible 清理k8s集群的node节点日志

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,并把清理日志的脚本分发到各个节点并做成计划任务,不用担心新增节点而遗漏计划任务了

posted @   liwenchao1995  阅读(242)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
点击右上角即可分享
微信分享提示