You need to enable JavaScript to run this app.
导航
机器组心跳问题排查(容器)
最近更新时间:2024.11.22 11:13:38首次发布时间:2023.03.10 17:41:34

通过 LogCollector 采集容器文本日志或标准输出时,如果机器组中的 LogCollector 心跳状态异常,会造成日志采集失败等问题。LogCollector 心跳异常时,您可以参考本文档逐步排查问题、恢复 LogCollector 心跳状态。

背景信息

LogCollector 是日志服务自研的日志采集客户端,用于快速上报容器日志数据。在容器上安装 LogCollector 之后,LogCollector 会定时向服务端发送心跳包。如果在日志服务控制台的机器组配置页面中显示 LogCollector 无心跳,说明客户端和服务端连接失败。

问题现象

在日志服务控制台的机器组详情页面,如果心跳状态信息区域中,某些 IP 地址对应的状态栏显示异常,表示此容器 LogLollector 心跳状态异常,容器上的 LogCollector 客户端与服务端连接失败。
在心跳异常的状态下,容器上的 LogCollector 客户端无法将采集到的日志数据正常上报至服务端,导致日志无法正常采集到日志主题中,控制台上也无法实时查询并检索到新的日志数据。
Image

注意事项

LogCollector 会读取所在 Pod 第一块网卡的 IP 地址,并将其作为 Pod 的 IP 地址通过心跳上报至机器组。
当 Daemonset 滚动升级或重启时,现存的 Pod 将被删除,现存的 LogCollector 将停止运行,导致这些现存 Pod 的 IP 地址对应的状态栏显示异常。因为 Daemonset 滚动升级或重启之后,新的 Pod 将被创建,新的 LogCollector 将开始运行,这些新 Pod 的 IP 地址将通过心跳上报至机器组。
如果希望清理旧 Pod 的 IP 地址,可以在机器组详情页中单击清理异常机器

排查方案

本文档以在 Kubernetes 集群中使用 Daemonset 方式安装 LogCollector 为例进行说明。

1 检查 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

回显信息说明:

  • 如果回显信息中 NAME 字段没有名为 “log-collector-xxxxx” 的 Pod,表示该 Kubernetes 集群尚未安装 LogCollector,请参考没有状态信息进行处理。
  • 如果回显信息中 STATUS 字段中存在 Running 以外的值,表示当前容器已经安装 LogCollector,但是该 Pod 上的 LogCollector 运行状态异常。请参考容器 LogCollector 运行状态问题排查进行处理。
  • 如果回显信息显示 STATUS 字段值全部为 Running,表示当前 Kubernetes 集群已经成功安装 LogCollector,且运行状态正常。
    此时若控制台上 LogLollector 心跳状态仍然显示异常,请执行以下步骤继续排查。
    Image

2 检查鉴权参数配置

以 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 参数,否则也会造成心跳失败。

配置文件示例如下。
Image
如果鉴权参数配置错误,请修改后重启 Daemonset,稍后查看机器组状态。若控制台上 LogCollector 心跳状态仍然显示异常,请执行以下步骤继续排查。

3 检查 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

回显信息示例如下。
Image
升级 LogCollector 的版本后,若控制台上 LogCollector 心跳状态仍然显示异常,请执行以下步骤继续排查。

4 检查机器标识配置

说明

  • 机器标识地址类型的机器组,请参考此步骤进行排查。
  • 通过 LogCollector 采集容器文本日志或标准输出日志时,建议创建机器标识类型的机器组。

在机器标识地址类型的机器组中,已配置的机器标识必须和 LogCollector 配置文件中配置的机器 Label 一致,否则机器组中没有 LogCollector 的心跳状态。
执行以下命令,查看 LogCollector 的配置文件。

kubectl -n tls-log describe configmaps log-collector-config

系统回显信息如下,其中 label 的值即为 LogCollector 中配置的机器 Label。如果此值与机器组中配置的机器标识不一致,请修改机器组配置,并稍后再次检查机器状态。
Image

5 检查机器组 IP 地址配置

说明

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 地址是否一致。

  1. 查看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 
    }
    
  2. 查看控制台配置的 IP 地址。
    在机器组的详情页面可以查看机器组内所有 Pod 的 IP 地址。如果此处配置的 IP 地址与 agent_info.json 中显示的 IP 地址不一致,请修改机器组配置,并稍后再次检查机器状态。
    Image