日志服务采集Kubernetes时心跳基本排查
本文主要针对k8s向日志服务上传日志时,机器组心跳FAIL、或者没有出现IP的问题进行排查。
前言
按照日志服务的文档安装logtail组件之后默认是会自动创建Project、机器组的。不过有时需求是集群日志写入到多个Project,或者自动生成的Project名称不符合本身业务的要求。这时就需要用户重新创建Project、机器组并且要与k8s容器进行关联。
原理介绍
logtail与日志服务关联的原因是,logtail每隔一分钟向日志服务发送一次心跳请求,请求中包含了机器标识信息、以及用户的uid等信息。机器标识用于跟用户创建的机器组进行关联,用户没有创建标识时默认使用logtail获取到的IP;用户的uid则决定logtail有权限写入哪些Project(所以自建机器以及跨账号采集用户需要单独配置uid)。
logtail采集组件能够与Project关联的原因是机器组进行统一的管理。机器组与logtail绑定的方式有两种,即创建机器组的方式,IP方式、自定义标识方式。
logtail在安装时候是需要指定region的,心跳请求也只会发送到该region,所以安装的logtail与采集数据的Project region必须保持一致。
心跳排查
获取logtail信息
使用以下命令获取 logtail 容器id
docker ps | grep logtail
然后获取logtail容器的详细信息
docker inspect id
主要获取返回信息中的config.Env下内容,字段详情参考下表:
Key | 描述 | 示例 |
---|---|---|
ALIYUN_LOGTAIL_USER_DEFINED_ID | 机器组标识 | k8s-group-c8ba441d5f |
ALIYUN_LOGTAIL_USER_ID | 用户uid | 104944648 |
ALICLOUD_LOG_ENDPOINT | logtail使用的endpoint,可以看出安装region、是否为内网 | cn-beijing-intranet.log.aliyuncs.com |
ALIYUN_LOGTAIL_CONFIG | 使用的ilogtail_config.json文件路径 | /etc/ilogtail/conf/cn-beijing/ilogtail_config.json |
ALICLOUD_LOG_DEFAULT_MACHINE_GROUP | 默认机器组名称 | k8s-group-c8ba441d5f |
ALICLOUD_LOG_DEFAULT_PROJECT | 默认Project名称 | k8s-log-c8ba441d5f |
信息对比
- 检查logtail容器与使用的endpoint网络是否能够连通;使用下面第一行命令进入logtail容器之后,curl 上面信息中的 ALICLOUD_LOG_ENDPOINT,如果有如下报错返回就表示网络可以连通。
docker exec -it logtail容器id bash
curl cn-beijing-intranet.log.aliyuncs.com
{"Error":{"Code":"OLSInvalidMethod","Message":"The script name is invalid : /","RequestId":"5FD72CFEDFAEEE680F96353D"}}
- 对比Project与logtail安装的region是否一样,登录日志服务页面,可以看到Project对应的region与上面获取到的ALICLOUD_LOG_ENDPOINT进行对比,查看是否一样。例: cn-beijing与华北2(北京)就是没问题的。
- 检查logtail是否有权限写入Project;参考文档获取当前登录账号的uid,然后与环境变量中ALIYUN_LOGTAIL_USER_ID进行对照,目前logtail容器环境变量中只能设置一个uid,不能同时向多个账号发送数据。
- 检查机器组标识与ALICLOUD_LOG_DEFAULT_MACHINE_GROUP对应的值是否一致,容器采集建议使用自定义标识方式。目前logtail容器环境变量中只能设置一个标识。
如果上面4项排查结束之后还是无法解决,有可能是因为logtail组件刚刚安装心跳请求还未到达服务端,可以等几分钟之后再看下。如果一个小时左右仍然没有心跳就需要向日志服务提交工单排查了。