通过 LogCollector 采集容器文本日志或标准输出时,如果机器组中的 LogCollector 心跳状态异常,会造成日志采集失败等问题。LogCollector 心跳异常时,您可以参考本文档逐步排查问题、恢复 LogCollector 心跳状态。
LogCollector 是日志服务自研的日志采集客户端,用于快速上报容器日志数据。在容器上安装 LogCollector 之后,LogCollector 会定时向服务端发送心跳包。如果在日志服务控制台的机器组配置页面中显示 LogCollector 无心跳,说明客户端和服务端连接失败。
在日志服务控制台的机器组详情页面,如果心跳状态信息区域中,某些 IP 地址对应的状态栏显示异常,表示此容器 LogLollector 心跳状态异常,容器上的 LogCollector 客户端与服务端连接失败。
在心跳异常的状态下,容器上的 LogCollector 客户端无法将采集到的日志数据正常上报至服务端,导致日志无法正常采集到日志主题中,控制台上也无法实时查询并检索到新的日志数据。
LogCollector 会读取所在 Pod 第一块网卡的 IP 地址,并将其作为 Pod 的 IP 地址通过心跳上报至机器组。
当 Daemonset 滚动升级或重启时,现存的 Pod 将被删除,现存的 LogCollector 将停止运行,导致这些现存 Pod 的 IP 地址对应的状态栏显示异常。因为 Daemonset 滚动升级或重启之后,新的 Pod 将被创建,新的 LogCollector 将开始运行,这些新 Pod 的 IP 地址将通过心跳上报至机器组。
如果希望清理旧 Pod 的 IP 地址,可以在机器组详情页中单击清理异常机器。
本文档以在 Kubernetes 集群中使用 Daemonset 方式安装 LogCollector 为例进行说明。
登录 Kubernetes 集群后,执行以下命令查看 LogCollector 的运行状态。
kubectl -n ${namespace} get pods | grep ${Daemonset}
在以下示例中,Daemonset 的名称是 log-collector,所属的 namespace 是 tls-log。
kubectl -n tls-log get pods | grep log-collector
回显信息说明:
STATUS
字段中存在 Running 以外的值,表示当前容器已经安装 LogCollector,但是该 Pod 上的 LogCollector 运行状态异常。请参考容器 LogCollector 运行状态问题排查进行处理。STATUS
字段值全部为 Running,表示当前 Kubernetes 集群已经成功安装 LogCollector,且运行状态正常。以 Daemonset 方式安装 LogCollector 时,需要首先创建 ConfigMap,并在 logcollector_config.yaml
文件的 output.tls
字段中添加日志服务的配置信息,用于鉴权和连接日志服务。如果参数配置错误,可能会造成 LogLollector 心跳异常。
执行以下命令打开 filebeat.yml
文件,检查创建 ConfigMap 时配置的鉴权参数。在以下示例中,Daemonset 的名称是 log-collector,所属的 namespace 是 tls-log。
kubectl -n tls-log describe configmaps log-collector-config
鉴权参数相关说明如下。
参数 | 示例 | 说明 | 获取方式 |
---|---|---|---|
endpoint | https://tls-cn-beijing.ivolces.com | 日志服务连接域名,即服务地址。 | 登录火山引擎控制台后,在日志项目的详情页中查看连接域名。 |
secret_id | AKLY********* | 火山引擎主账号的 Access Key ID。 | 以主账号登录火山引擎控制台后,在页面右上角下拉列表中单击密钥管理,根据页面提示查看并复制 Access Key ID。 |
secret_key | TUdZ******** | 火山引擎主账号的 Secret Access Key。 | 以主账号登录火山引擎控制台后,在页面右上角下拉列表中单击密钥管理,根据页面提示查看并复制 Secret Access Key。 |
region | cn-beijing | 日志项目所在的地域(Region)。 | 在日志服务控制台顶部导航栏中可以查看当前日志项目所在地域。 |
说明
在 output.tls
中,不能同时配置 ip 和 label 参数,否则也会造成心跳失败。
配置文件示例如下。
如果鉴权参数配置错误,请修改后重启 Daemonset,稍后查看机器组状态。若控制台上 LogCollector 心跳状态仍然显示异常,请执行以下步骤继续排查。
LogCollector 1.0.1 版本开始支持机器组,如果容器中安装的 LogCollector 版本号不是 1.0.1 或后续版本,可能会出现 LogCollector 心跳异常的现象,服务端无法识别该 LogCollector。所以 LogCollector 心跳异常时需检查 LogCollector 的版本是否符合要求。
执行以下命令,查看 LogCollector 的版本。回显信息中 “Image” 会展示当前安装的 LogCollector 的镜像地址,如果不是 1.0.1 或以上版本,或者不是 latest,请参考升级 LogCollector将 LogCollector 升级至最新版本。
kubectl -n tls-log describe daemonsets.apps log-collector
回显信息示例如下。
升级 LogCollector 的版本后,若控制台上 LogCollector 心跳状态仍然显示异常,请执行以下步骤继续排查。
说明
在机器标识地址类型的机器组中,已配置的机器标识必须和 LogCollector 配置文件中配置的机器 Label 一致,否则机器组中没有 LogCollector 的心跳状态。
执行以下命令,查看 LogCollector 的配置文件。
kubectl -n tls-log describe configmaps log-collector-config
系统回显信息如下,其中 label
的值即为 LogCollector 中配置的机器 Label。如果此值与机器组中配置的机器标识不一致,请修改机器组配置,并稍后再次检查机器状态。
说明
IP 地址类型的机器组,请参考此步骤进行排查。
默认情况下,LogCollector 会读取所在 Pod 第一块网卡的 IP 地址,并将其作为 Pod 的 IP 地址记录在文件 agent_info.json
中。在控制台创建 IP 类型的机器组时,您需要将 agent_info.json
中记录的 IP 地址作为 Pod 的 IP 地址填写到机器组中,以此将指定 Pod 的 LogCollector 加入到机器组。
如果机器组中配置的 IP 地址和 agent_info.json
中的 IP 地址不一致,控制台会显示此容器 LogCollector 心跳状态异常、无法采集日志。
您可以通过以下命令查看 agent_info.json
,检查 ip
字段中填写的 IP 地址与控制台显示的 IP 地址是否一致。
查看agent_info.json
。
kubectl -n tls-log exec -it log-collector-9ph8j -- bash cat agent_info.json
回显信息中,ip
字段表示 LogCollector 获取的当前 Pod IP 地址。
{ hostname : C02G64T1MD6R , ip : 10.*.*.* , logcollect_version : 1.0.2 , update_time : 2022.01.07 18:38:12 }
查看控制台配置的 IP 地址。
在机器组的详情页面可以查看机器组内所有 Pod 的 IP 地址。如果此处配置的 IP 地址与 agent_info.json
中显示的 IP 地址不一致,请修改机器组配置,并稍后再次检查机器状态。