一、项目背景
1.1 项目痛点
在目前小程序为主的大背景下,有客户大部分业务在腾讯云,使用的大部分为容器服务,在大规模的使用容器下,需要对容器内业务的日志采集及分析,在腾讯云对应容器服务的日志提供了两种消费方式:Kafka、日志服务CLS。
但是对应业务线众多,在腾讯云容器服务只能指定十条日志收集规则,完全满足不了大规模日志收集场景,客户已经指定分业务两种消费方式均使用了起来,Kafka&日志服务,但是在Ckafka查看日志发现最高每分钟20W条消息,尽管已经最大程度的提升了消费端的能力(消费端使用Logstash,然后重新将数据导入ELK集群中使用),但是在每分钟20w条的大数据下,查看CKafka内部有大量未消费条目存在,长此以往,CKafka性能及存量均无法满足,且和腾讯咨询发现目前该地域Ckafka已经售完,需要一周时间来底层扩容。
- 客户痛点如下图:(来自同事的ppt)
1.2 名称解释:
- 容器服务:腾讯云容器服务(Tencent Kubernetes Engine,TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务。腾讯云容器服务完全兼容原生 kubernetes API ,扩展了腾讯云的 CBS、CLB 等 kubernetes 插件,为容器化的应用提供高效部署、资源调度、服务发现和动态伸缩等一系列完整功能,解决用户开发、测试及运维过程的环境一致性问题,提高了大规模容器集群管理的便捷性,帮助用户降低成本,提高效率。容器服务提供免费使用,涉及的其他云产品另外单独计费。详细可参考:腾讯云容器服务
- 对象存储:对象存储服务(Cloud Object Storage,COS)是面向企业和个人开发者提供的高可用,高稳定,强安全的云端存储服务。您可以将任意数量和形式的非结构化数据放入 COS,并在其中实现数据的管理和处理。COS 支持标准的 Restful API 接口,您可以快速上手使用,按实际使用量计费,无最低使用限制。详细可参考:腾讯云对象存储
- 日志服务:日志服务(Cloud Log Service)提供一站式的日志数据解决方案。您无需关注扩缩容等资源问题,五分钟快速便捷接入,即可享受从日志采集、日志存储到日志内容搜索、统计分析等全方位稳定可靠的日志服务。帮助您轻松解决业务问题定位,指标监控、安全审计等日志问题。大大降低日志运维门槛。详细可参考腾讯云日志服务
- 消息队列CKafka:CKafka(Cloud Kafka)是一个分布式的、高吞吐量、高可扩展性的消息系统,100% 兼容开源 Kafka API(0.9版本)。 Ckafka 基于发布/订阅模式,通过消息解耦,使生产者和消费者异步交互,无需彼此等待。 Ckafka 具有数据压缩、同时支持离线和实时数据处理等优点,适用于日志压缩收集、监控数据聚合等场景。腾讯云消息队列CKafka
二、问题分析
针对大量日志在Ckafka未消费,且腾讯无法开出Ckafka的背景下,先为客户提出三种解决方案:
- 容器日志源选择指定容器,针对项目选择指定服务下的容器。然后消费端选择到ckafka下不同的topic,这样来分摊kafka压力。(一个规则只能指定一个topic,容器太多,10条规则无法满足)
- 增加ckafka的消费能力(例如多增加几个logstash),kafka只是消息队列,消息得不到消费kafka就压力大。(根据和客户商讨,目前logstash的consumer_threads已经设置为topic的最大分区数,如果要增加logstash的实例,那么需要增加topic的partitions数,也无法满足)
- 将容器日志消费端选择为cls的topic,然后在cls里将日志投递存放到cos,后面再从cos里取出来进行消费。(待确认,如果可以将数据通过cls存放到cos,后期在利用logstash来进行消费,那就可以解决此问题)
三、问题解决
3.1 容器服务配置
先进行简单容器服务创建测试应用
- 测试的容器测试服务集群
- 新建服务
选择namespace,及服务所在的地域
进行部署设置,可以选择公共容器,也可现在自定义容器,配置容器网络及逻辑卷等信息,最后配置端口映射。 - 创建好后就可以通过公网负载均衡进行容器访问
- 新建日志收集规则
- 指定消费端
3.2 日志服务投递配置
- 创建日志集管理
- 创建日志投递规则,将cls的内容投递到cos内
在日志投递中,可以开启高级过滤功能,利用此功能可以将不同日志投递到不同bucket,或同一个bucket的不同目录下,来进行日志区分,以便后期消费。
例如日志格式:
__CONTENT__: {"docker":{"container_id":"894905ad526dd90f548bf35ece4b81f4d68359722d7ec719f3b81628da32fe20"},"kubernetes":{"container_name":"nginx","host":"172.16.9.11","labels":{"pod-template-hash":"1074266372","qcloud-app":"nginx"},"log":"default_nginx","master_url":"https://192.168.255.1:443","namespace_name":"default","pod_id":"5d4ae59f-9f6c-11e8-89c8-5254000e53ff","pod_name":"nginx-54c86bb7c6-wvm6z"},"log":"192.168.1.1 - - [25/Aug/2018:13:17:14 +0000] \"GET / HTTP/1.1\" 200 612 \"-\" \"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.89 Safari/537.36\" \"-\"\n","stream":"stdout","time":"2018-08-25T13:17:14.310411833Z"}
根据container_name来进行正则日志过滤:.*\"container_name\":\"([^\"]+)\".*
注意:这里根据腾讯云官网给的仅有的一个实例进行测试无法通过,经过多次测试均为已经投递但是数据没有从cls到cos内部,经过后面自己测试结果如下:
- key必须制定为索引
__CONTENT__
- 正则表达式:可以根据具体的容器分类来做,这里建议使用container_name便于区分
- value为日志经过正则匹配到的内容,和value的相同及命中此条日志,从而将此条日志进行按照规则投递到cos内。
- 查看COS内的日志投递信息
3.3 消费终端CVM配置
- 安装COSFS工具
详细操作方法可参考:COSFS操作
sudo yum install automake gcc-c++ git libcurl-devel libxml2-devel fuse-devel make openssl-devel
git clone https://github.com/tencentyun/cosfs /usr/cosfs
cd /usr/cosfs
./autogen.sh
./configure
make
sudo make install
写入配置文件:
echo <bucketname>:<SecretId>:<SecretKey> > /etc/passwd-cosfs
chmod 640 /etc/passwd-cosfs
- 挂载日常存储的COS
cosfs your-bucketname your-mount-point -ourl=cos-domain-name -odbglevel=info
your-bucketname 需要替换为用户真实的信息;
your-mount-point 替换为本地需要挂载的目录(如 /mnt);
cos-domain-name 为存储桶对应的访问域名,形式为 http://cos.<Region>.myqcloud.com (适用于XML API),其中 为地域简称,如: ap-guangzhou 、 eu-frankfurt 等.
查看文件
- 安装ELK
ELK安装可参考
ELK自动安装脚本
Centos7_ELK5.4.1配置部署
在这里使用logstash的input-file插件,将path制定到本地挂载的cos上
input {
file {
path => "/cosdata/access-log2018/08/*"
}
}
output {
elasticsearch {
hosts => "127.0.0.1:9200"
}
stdout { codec => rubydebug }
}
3.4 进行简单消费测试
- 查看ES中日志数据
通过访问es的9200端口可以 - 利用Kibana查看日志
四、反思总结
- 我这在客户大量的数据下,腾讯的文档写的真的不是很全,在cls日志投递功能的高级过滤段,文档完全没介绍其中的正则改怎么写,自己尝试发现不行后,工单及VIP客户支持,大概两天才内部测试完成后给出了模板,希望后续可以完善一些产品的细节文档,文档完善才能使用户更好的使用产品。其次希望腾讯能对每个地域的线下IDC机房的资源进行更改的前期规划和后期扩容管理,以免像类似这种,需要等待一周时间才能某地域的某种云产品,这对于互联网公司的方案及业务有很大的影响。
- 通过此次方式,是使用cos将数据持久化存储来减轻CKafka的压力,分业务适合用对日志数据不是非常及时的后期分析及处理消费场景。
原文地址:http://blog.51cto.com/kaliarch/2164385