
在传统的使用虚拟机/云主机/物理机的时代,业务进程部署在固定的节点上,业务日志直接输出到宿主机上,运维只需要手动或者使用自动化工具把日志采集Agent部署在节点上,加一下Agent的配置,就可以开始采集日志了。而在Kubernetes环境中,情况就没这么简单了:
以上都是有别于传统日志采集配置方式的需求和痛点,究其原因,还是因为传统的方式脱离了Kubernetes,无法感知Kubernetes,无法和Kubernetes集成。
针对以上痛点,我们特对Kubernetes环境下的日志收集方式进行整理总结。
❝iLogtail 为可观测场景而生,拥有的轻量级、高性能、自动化配置等诸多生产级别特性,在阿里巴巴以及外部数万家阿里云客户内部广泛应用。你可以将它部署于物理机,虚拟机,Kubernetes等多种环境中来采集遥测数据,例如logs、traces和metrics。https://ilogtail.gitbook.io/ilogtail-docs/about/readme
❞
ilogtail的核心优势:
❝Loggie是一个基于Golang的轻量级、高性能、云原生日志采集Agent和中转处理Aggregator,支持多Pipeline和组件热插拔。https://loggie-io.github.io/docs/
❞
Loggie的优势与特性:
本次应用以iLogtail为主,以收集nginx和java日志为示例。
# 1.创建命名空间
wget https://raw.githubusercontent.com/alibaba/ilogtail/main/example_config/start_with_k8s/ilogtail-ns.yaml
kubectl apply -f ilogtail-ns.yaml
# 2.configmap 定义配置文件
wget https://raw.githubusercontent.com/alibaba/ilogtail/main/example_config/start_with_k8s/ilogtail-user-configmap.yaml
kubectl apply -f ilogtail-user-configmap.yaml
# 3.DaemonsSet 部署应用
wget https://raw.githubusercontent.com/alibaba/ilogtail/main/example_config/start_with_k8s/ilogtail-daemonset.yaml
kubectl apply -f ilogtail-daemonset.yaml
# 1.Deployment部署Nginx
wget https://raw.githubusercontent.com/alibaba/ilogtail/main/example_config/start_with_k8s/nginx-deployment.yaml
kubectl apply -f nginx-deployment.yaml
# 2.访问日志
kubectl exec nginx-<pod-id> -- curl localhost/hello/ilogtail
# 3.查看测试日志
# 注意:需要查看和nginx 在同一个node节点上的ilogtail-ds
kubectl logs ilogtail-ds-<pod-id> -n ilogtail
# json格式化后,日志查看
{
"_time_": "2022-07-15T00:36:48.489153485+08:00",
"_source_": "stdout",
"_image_name_": "docker.io/library/nginx:latest",
"_container_name_": "nginx",
"_pod_name_": "nginx-76d49876c7-r892w",
"_namespace_": "default",
"_pod_uid_": "07f75a79-da69-40ac-ae2b-77a632929cc6",
"_container_ip_": "10.223.0.154",
"remote_addr": "::1",
"remote_user": "-",
"time_local": "14/Jul/2022:16:36:48",
"method": "GET",
"url": "/hello/ilogtail",
"protocol": "HTTP/1.1",
"status": "404",
"body_bytes_sent": "153",
"http_referer": "-",
"http_user_agent": "curl/7.74.0",
"http_x_forwarded_for": "-",
"__time__": "1657816609"
}
从JSON日志中我们可以看出,除了Nginx日志常规的字段,ilogtail还增加了namespace、pod、container、node等各维度的容器信息。
「iLogtail 配置文件解析」
# ilogtail-user-configmap.yaml 配置文件
nginx_stdout.yaml: |
enable: true
inputs:
- Type: service_docker_stdout
Stderr: false
Stdout: true # only collect stdout
IncludeK8sLabel:
app: nginx # choose containers with this label
processors:
- Type: processor_regex # structure log
SourceKey: content
Regex: '([\d\.:]+) - (\S+) \[(\S+) \S+\] \"(\S+) (\S+) ([^\\"]+)\" (\d+) (\d+) \"([^\\"]*)\" \"([^\\"]*)\" \"([^\\"]*)\"'
Keys:
- remote_addr
- remote_user
- time_local
- method
- url
- protocol
- status
- body_bytes_sent
- http_referer
- http_user_agent
- http_x_forwarded_for
flushers:
- Type: flusher_stdout
OnlyStdout: true
ilogtail-user-configmap.yaml 配置文件中关于nginx日志收集配置,位于nginx_stdout.yaml处:
通过以上Nginx日志的收集,我们已经对ilogtail有了大致的了解,因此我们进一步探索Java日志的收集,先来分析下Java日志收集的需求:
以上都是在真正进行Java日志收集前需要了解的。下面我们再来确定下ilogtail 对Java多行日志文件的收集配置:
log_file.yaml: |
enable: true
inputs:
- Type: file_log
LogPath: /data/logs/
FilePattern: java.log
processors:
- Type: processor_split_log_regex
SplitRegex: \d+-\d+-\d+\s\d+:\d+:\d+\s\[.*
SplitKey: content
PreserveOthers: true
flushers:
- Type: flusher_stdout
OnlyStdout: true
通过实际运行,ilogtail对Java多行日志文件的收集并没有像期望的那样收集成功。经仔细阅读官方文档,并对配置文件进行了如下修改才成功收集,我们来具体分析下:
log_file.yaml: |
enable: true
inputs:
- Type: file_log
LogPath: /data/logs/
FilePattern: "*.log"
MaxDepth: 5
ContainerFile: true
ContainerInfo:
IncludeK8sLable:
log: java
processors:
- Type: processor_split_log_regex
SplitRegex: \d+-\d+-\d+\s\d+:\d+:\d+\s\[.*
SplitKey: content
PreserveOthers: true
flushers:
- Type: flusher_stdout
OnlyStdout: true
Java日志按规范要求:
最终的具体定义如下:
注意:正是由于ilogtail和采集的日志处于不同的命名空间和容器,导致日志收集不成功。
至此我们只是带大家对Kubernete容器环境下的日志收集进行了初步的介绍,但是在实际使用过程中,我们还需要多关注下以下几个方面:
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70024420/viewspace-2938838/ ,如需转载,请注明出处,否则将追究法律责任。