• K8S 收集微服务日志


    背景

    背景:服务上K8S集群后,使用rancher等工具可以查看实时日志,但不便于查看过去的日志。尤其是服务升版后,因为容器是重新启动的,过去的日志就查看不了了。如果想要查询历史日志,可以选用传统的elk,或者使用skywalking skywalking 接入 springboot 。然而elk需要日志过滤才能友好显示,kibana的查询也略显复杂,对普通开发者来说学习成本并不小。

    需求:其实查看历史日志的情况不多,出问题的时候,有日志文件即可

    目标:每天备份一波日志,并保存

    场景:由 node1、node2、node3 三台服务器组成的K8S集群,集群里运行着数10个springboot微服务

     

    方案

    方案

    1. node1 编写脚本,输出本机微服务日志
    2. node2 和 node3 复制 node1 脚本到本地,并执行
    3. node2 和 node3 拷贝生成好的日志到 node1
    4. node1 把日志按日期统一存放
    5. 三个节点均设置定时任务

    实现

    node1 脚本 record.sh

    存放于 /root/record,举例 微服务 permission 、 auth 、 user

    • 获取日期参数$d
    • 新建文件夹,用于保存微服务 docker 容器的 id
    • 模糊查询获取微服务 docker 容器的 id
    • if 判断,如果 id 为空,则不输出 log 文件
    #!/bin/bash
    date +%Y-%m-%d  > ./date.log;
    d=$(cat ./date.log);
    
    logvar="/root/record/id_log";
    mkdir -p $logvar
    
    docker ps | grep 'dev-permission' | awk '{printf $1}'  > $logvar/dev-permission-id.log; 
    id=$(cat $logvar/dev-permission-id.log);
    if [ -n "$id" ];then
    docker logs $id > /home/record/dev-permission-$d.log;
    fi
    
    docker ps | grep 'dev-auth' | awk '{printf $1}'  > $logvar/dev-auth-id.log; 
    id=$(cat $logvar/dev-auth-id.log);
    if [ -n "$id" ];then
    docker logs $id > /home/record/dev-auth-$d.log;
    fi
    
    docker ps | grep 'dev-user' | awk '{printf $1}'  > $logvar/dev-user-id.log; 
    id=$(cat $logvar/dev-user-id.log);
    if [ -n "$id" ];then
    docker logs $id > /home/record/dev-user-$d.log;
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    备注:获取 docker 的 id 后,需要先输出到文件,再从文件拿出来,docker log 的时候才能识别变量id

     

    node2、node3 脚本 scp.sh

    先安装 sshpass

    yum install sshpass -y
    
    • 1

    sshpass 执行如下报错,因为初次执行需要先手敲 scp 登录

    Host key verification failed

    在这里插入图片描述

    脚本步骤

    • 删除旧的 log 文件
    • 从 node1 复制执行文件 record.sh 到本地
    • 执行 record.sh
    • 复制生成的 log 到 node1
    #!/bin/bash
    rm -f /home/record/*;
    sshpass -p "rootpassword" scp -r root@[node1_ip]:/root/record/record.sh /root/record > record.sh;
    sh /root/record/record.sh;
    sshpass -p "rootpassword" scp -r /home/record/* root@[node1_ip]:/home/record/;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    复制时加 * ,可以只复制文件里面的内容,否则会连带文件夹一起复制过去

     

    node1 脚本 cp.sh

    文件统一保存在 /home/servicelog 下,用时间做文件夹名分类

    • 创建日期文件夹
    • 复制 /home/record/* 的日志
    • 删除旧日志
    #!/bin/bash
    date +%Y-%m-%d  > ./date.log;
    d=$(cat ./date.log);
    mkdir -p /home/servicelog/$d;
    cp -rf /home/record/* /home/servicelog/$d/;
    rm -f /home/record/*;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

     

    定时任务

    编辑定时任务

    vim /etc/crontab
    
    • 1

    node1

    0 5 * * * root sh /root/record/record.sh
    10 5 * * * root sh /root/record/cp.sh
    
    • 1
    • 2

    node2 和 node3

     5 * * * root sh /root/record/scp.sh
    
    • 1

    重启定时任务

    systemctl restart crond
    
    • 1

     

    成果展示图

    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    FPGA工程师职业发展道路
    【Token】JWT使用Token进行登录
    redis源码分析(谁说C语言就不能分析了?)
    我辞掉程序员的工作,体验了半年的自驾游生活
    Vue:(四)数据代理
    ansible Lineinfile模块
    前端面试宝典React篇13 如何分析和调优性能瓶颈?
    最长公共子序列(LCS)与最长上升子序列(LIS)问题的相互转换
    【原创】C++中vector与remove()函数
    【JavaSE】Map接口--深入源码解读HashMap与HashTable
  • 原文地址:https://blog.csdn.net/weixin_42555971/article/details/126768552