tke集群容器的业务日志采集通常都是用日志采集组件采集日志,但是有一个问题就是,日志采集无法扩地域投递到cls,也就是说集群的日志只能投递到同地域的cls中,但是有些地域是没有cls服务的,那么就无法使用日志采集服务采集tke集群容器日志到cls了。这里有另外一个方法就是在容器里面部署LogListener,走公网的方式将容器日志投递到cls中。今天我们来说说这种日志采集方式的具体实现。
我们在本地docker构建镜像,将LogListener安装到我们的镜像即可,我们的镜像构建目录如下
代码语言:javascript复制注意:我这边示例的应用程序是demo,大家根据实际替换成自己的业务程序,对应的dockerfile也需要修改
[root@VM-0-13-centos log-collect]# ll
total 11824
-rwxrwxrwx 1 root root 12098786 Jul 3 18:09 demo
-rw-r--r-- 1 root root 566 Jul 3 18:19 Dockerfile
-rwxr-xr-x 1 root root 56 Jul 3 18:19 start.sh
- demo:一个go程序demo的可执行文件,监听端口是3000,日志放在/data目录下
- Dockerfile:用于镜像构建
- start.sh:镜像的启动脚本
下面我们来具体看看对应的文件内容
demo文件可以直接从连接获取https://github.com/nieweixing/go-test/blob/main/main/demo
Dockerfile的内容如下,secretid和secretkey替换成自己的,如果是公网需要加参数-network internet
代码语言:javascript复制FROM centos:7
RUN yum install wget -y && mkdir -p /data
RUN wget https://mirrors.tencent.com/install/cls/loglistener-linux-x64-2.6.1.tar.gz && tar -zxvf loglistener-linux-x64-2.6.1.tar.gz -C /usr/local && cd /usr/local/loglistener-2.6.1/tools && ./loglistener.sh install
RUN /usr/local/loglistener-2.6.1/tools/loglistener.sh init -secretid AKIDJNM71vniy85mCNxxxxxx -secretkey 608zbx5wmY4YyF9uRitsxxxxx -region ap-guangzhou -network internet
COPY demo /root
COPY start.sh /root/start.sh
CMD ["/root/start.sh"]
LogListener的安装参考文档https://cloud.tencent.com/document/product/614/17414
start.sh的内容如下
代码语言:javascript复制#!/bin/bash
/etc/init.d/loglistenerd start
./root/demo
创建一个目录,然后将文件访问到目录下,执行镜像构建命令构建镜像
代码语言:javascript复制docker build -t xxxx .
大家也可以用我构建的好的镜像进行测试ccr.ccs.tencentyun.com/nwx_registry/log-to-cls:latest
镜像构建好之后,这里我们cls是在广州地域,我们部署镜像到北京的tke集群,看下能否跨地域公网投递到cls
我们暴露一个公网clb类型的service来提供访问
接下来我们在cls里面配置下机器组和主题用来保存日志,配置机器组需要到容器里面获取下group ip,在cls配置机器组ip就是填写group ip,并不是容器ip。
代码语言:javascript复制[root@log-5bfddddfc-9xn84 /]# /etc/init.d/loglistenerd check | grep "group ip"
group ip:172.18.0.15
我们到cls控制台创建机器组
然后创建日志主题关联下上一步创建好的机器组
这里配置的采集路径就是/data/下的所有log结尾的日志文件
cls主题配置好之后,我们来访问下对应的service,然后程序打印一些日志,然后到cls进行检索
代码语言:javascript复制for i in {1..100}; do curl 49.xx.xx.xx:3000/health_check; done
首先我们到容器内看下日志是否生成
代码语言:javascript复制[root@log-5bfddddfc-9xn84 data]# tail /data/go.log
2021/07/03 11:02:33 我访问了Health check这个路径
2021/07/03 11:02:33 我访问了Health check这个路径
2021/07/03 11:02:33 我访问了Health check这个路径
2021/07/03 11:02:34 我访问了Health check这个路径
2021/07/03 11:02:34 我访问了Health check这个路径
2021/07/03 11:02:34 我访问了Health check这个路径
2021/07/03 11:02:34 我访问了Health check这个路径
2021/07/03 11:02:34 我访问了Health check这个路径
2021/07/03 11:02:34 我访问了Health check这个路径
2021/07/03 11:02:34 我访问了Health check这个路径
进入到容器查看日志文件是有访问日志生成的,然后我们到cls检索下
cls只也可以检索到日志,这里说明我们用LogListener采集容器日志公网投递到cls是成功的