You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kubernetes中Logstash采集Loki日志时Namespace、Pod、Container信息缺失

问题原因

你当前的Logstash配置里,filter阶段的if [kubernetes]分支永远不会执行——默认file输入插件仅读取日志文件内容,不会自动解析Kubernetes元数据(Pod、Namespace、容器名等),因此[kubernetes]字段不存在,无法添加对应标签到Loki中。

解决方案

以下两种方式任选其一即可:

方式1:用Grok解析日志文件名提取元数据

/var/log/containers/目录下的日志文件名格式固定为:<pod名称>_<命名空间>_<容器名称>-<容器ID>.log,可通过Grok插件解析path字段提取这些元数据:

修改后的完整配置:

input {
  file {
    id => "varlog"
    path => "/var/log/containers/*.log"  # 添加通配符匹配所有日志文件
    type => "var log"
    start_position => "beginning"
  }
}

filter {
  # 解析文件名提取K8s元数据
  grok {
    match => { "path" => "/var/log/containers/%{DATA:pod}_%{DATA:namespace}_%{DATA:container_name}-%{DATA:container_id}\.log" }
    remove_field => ["container_id"]  # 无需容器ID可删除该字段
  }

  # 替换host为节点主机名(按需保留)
  mutate {
    replace => { "host" => "%{HOSTNAME}" }
    remove_field => ["tags"]
  }
}

output {
  stdout { codec => rubydebug}
  loki {
    url => "http://loki-loki-distributed-distributor.loki-benchmark.svc.cluster.local:3100/loki/api/v1/push"
    # 显式配置Loki标签,让Grafana识别这些维度
    labels => {
      "namespace" => "%{namespace}"
      "pod" => "%{pod}"
      "container_name" => "%{container_name}"
      "host" => "%{host}"
      "type" => "%{type}"
    }
  }
}

方式2:使用Logstash Kubernetes输入插件

若Logstash Pod拥有访问K8s API的权限,可直接用kubernetes输入插件替代file插件,它会自动收集Pod日志并附带完整K8s元数据:

input {
  kubernetes {
    host => "${NODE_NAME}"
    path => "/var/log/pods/"
    type => "var log"
    start_position => "beginning"
  }
}

filter {
  mutate {
    add_field => {
      "container_name" => "%{[kubernetes][container][name]}"
      "namespace" => "%{[kubernetes][namespace]}"
      "pod" => "%{[kubernetes][pod][name]}"
    }
    replace => { "host" => "%{[kubernetes][node][name]}" }
    remove_field => ["tags"]
  }
}

output {
  stdout { codec => rubydebug}
  loki {
    url => "http://loki-loki-distributed-distributor.loki-benchmark.svc.cluster.local:3100/loki/api/v1/push"
    labels => {
      "namespace" => "%{namespace}"
      "pod" => "%{pod}"
      "container_name" => "%{container_name}"
      "host" => "%{host}"
      "type" => "%{type}"
    }
  }
}

注意:使用该插件时,需给Logstash的ServiceAccount绑定读取Pod、节点的权限,并在Pod环境变量中注入NODE_NAME。

关键注意点

无论采用哪种方式,必须在Loki输出配置中显式声明labels参数,将需要的字段映射为Loki标签,这样Grafana才能在界面上展示这些维度字段。

内容的提问来源于stack exchange,提问作者boycod3

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 17:01:10