背景
本文介绍利用在腾讯云TKE应用市场中的三款软件 fluentbit,elasticsearch和kibana搭建一套适用于kubernetes环境的云原生一站式日志解决方案。
安装elasticsearch
如果用户已有elasticsearch集群,并且elasticsearch的网路与kubernetes集群网路互通,此步骤可略过。
- 单击左侧导航栏中的应用 > 应用市场,进入应用市场页面,点击“elasticsearch”。
- 点击“创建应用”,输入名称并选择地域、集群、namespace,点击“创建”。
- 在应用列表页面,点击上一步创建好的应用名,进入应用详情页面。
在上面的例子中,elasticsearch应用在kubernetes集群中的服务名称为“elasticsearch-master”
安装kibana
- 单击左侧导航栏中的应用 > 应用市场,进入应用市场页面,点击“kibana”。
- 点击“创建应用”,输入名称并选择地域、集群、namespace,点击“创建”。
- 在应用列表页面,点击上一步创建好的应用名,进入应用详情页面。
- 根据上一步安装的elasticsearch应用的服务名和端口,修改上图中的ConfigMap。
- 销毁重建kibana的Pod,使新配置生效。
- 修改kibana service的类型类型为“LoadBalancer”,等待绑定负载均衡器,并生成公网IP。
安装fluentbit
- 单击左侧导航栏中的应用 > 应用市场,进入应用市场页面,点击“fluentbit”。
- 点击“创建应用”,输入名称并选择地域、集群、namespace,点击“创建”。
- 在应用列表页面,点击上一步创建好的应用名,进入应用详情页面。
可以看到fluentbit是以DaemonSet的方式部署到集群的每个节点(Node)上;并且它的配置信息存储在一个ComfigMap中。
- 修改ConfigMap
代码语言:txt
复制
data:
fluent-bit.conf: |
[SERVICE]
Flush 1
Log_Level info
Daemon off
Parsers_File parsers.conf
HTTP_Server On
HTTP_Listen 0.0.0.0
HTTP_Port 2020
[INPUT]
Name tail
Tag kube.*
Path /var/log/containers/*.log # 采集所有的容器日志
Parser docker
DB /var/log/flb_kube.db
Mem_Buf_Limit 5MB
Skip_Long_Lines On
Refresh_Interval 10
[FILTER]
Name kubernetes
Match kube.*
Kube_URL https://kubernetes.default.svc:443
Kube_CA_File /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
Kube_Token_File /var/run/secrets/kubernetes.io/serviceaccount/token
Kube_Tag_Prefix kube.var.log.containers.
Merge_Log On
Merge_Log_Key log_processed
K8S-Logging.Parser On
K8S-Logging.Exclude Off
[OUTPUT]
Name es
Match *
Host elasticsearch-master
Port 9200
Logstash_Format On
Replace_Dots On
Retry_Limit False</code></pre></div></div><p>在上面的配置中:</p><p>INPUT部分表示采集所有Pod的日志。</p><p>如果想要采集指定Pod的日志,可以根据pod的日志文件名的格式(<pod<em style="font-style:italic">name></em><pod<em style="font-style:italic">namespace></em><container_name>-<container_id>.log),通过设置文件通配符的方式实现,例如:</p><p><code>Path /var/log/containers/*_default_*-*.log # 采集default命名空间下的pod日志</code></p><p><code>Path /var/log/containers/nginx*_prod_*-*.log # 采集prod命名空间下的nginx日志</code></p><p>FILTER部分会在日志上添加容器相关的元信息,包括:</p><ul class="ul-level-0"><li>Pod Name</li><li>Pod ID</li><li>Container Name</li><li>Container ID</li><li>Labels</li><li>Annotations</li></ul><p>OUTPUT部分指定了Elasticsearch的地址,其中Host和Port分别为之前配置的elasticsearch的服务名和端。</p><blockquote><p>关于fluentbit的详细配置,请参考官方文档 。</p></blockquote><ol class="ol-level-0"><li>销毁重建所有fluentbit的Pod,使新配置生效。</li></ol><figure class=""><div class="rno-markdown-img-url" style="text-align:center"><div class="rno-markdown-img-url-inner" style="width:100%"><div style="width:100%"><img src="https://cdn.static.attains.cn/app/developer-bbs/upload/1723350314660991591.png" /></div><div class="figure-desc">image.png</div></div></div></figure><ol class="ol-level-0"><li>在浏览器中,访问“http://<kibana lb的公网IP>:443/status”,点击左侧导航栏“Discover”,可以看到容器的日志已经被采集到elasticsearch中。</li></ol><figure class=""><div class="rno-markdown-img-url" style="text-align:center"><div class="rno-markdown-img-url-inner" style="width:100%"><div style="width:100%"><img src="https://cdn.static.attains.cn/app/developer-bbs/upload/1723350314850846634.png" /></div><div class="figure-desc">image.png</div></div></div></figure><h2 id="e3akk" name="%E6%80%BB%E7%BB%93">总结</h2><p>我们看到,通过腾讯云应用市场,只需要少量的操作和配置,就可以快速的搭建出一套纯云原生的kubernetes日志解决方案。这个方案足以应对一般的开发测试集群,以及小规模的生成集群对于日志能力的需求。</p><p>但这个方案存也在一些缺陷:</p><ul class="ul-level-0"><li>后期运维成本较高——比如:需要手动管理fluentbit配置,需要时刻关注ES底层CBS的存储空间......</li><li>某些功能缺失——比如:无法采集容器内的文件,无法处理containerd容器......</li><li>没法应对大日志量或大规模集群——fluentbit采集以及ES接收日志的能力有限。</li></ul><blockquote><p>因而对于一定规模的生产环境,我们推荐您使用TKE基于CLS(腾讯云日志服务)的日志采集组件(https://cloud.tencent.com/document/product/614/17415 ) ,可以帮助您以极低的运维成本,应对超大规模、海量日志处理的需求;并且可以方便地集成到基于kubernetes的CICD流水线中,提升开发交付效率,保证业务持续高效运行。</p></blockquote>