首页 > 解决方案 > Metricbeat kubernetes 模块无法连接到 kubelet

问题描述

我们有一个设置,其中 Metricbeat 作为 DaemonSet 部署在 Kubernetes 集群(特别是 AWS EKS)上。

一切似乎都正常运行,但kubelet连接。

为了澄清,以下模块:

- module: kubernetes
  enabled: true
  metricsets:
    - state_pod
  period: 10s
  hosts: ["kube-state-metrics.system:8080"]

工作正常(事件流入logstash/elastic)。

但是,此模块配置不适用于主机值的任何变体(localhost// kubernetes.defaultwhatever):

- module: kubernetes
  period: 10s
  metricsets:
    - pod
  hosts: ["localhost:10255"]
  enabled: true
  add_metadata: true
  in_cluster: true

注意:使用集群 IP 而不是 localhost(以便它进入控制平面)也可以工作(当然,虽然不会检索所需的信息)。

上面的配置直接取自 Metricbeat 文档,让我感到很奇怪—— localhost 是如何(从 Metricbeat docker 中)转换为相应的 kubelet 的?

正如人们所预料的那样,鉴于上述情况,该错误是:

error making http request: Get http://localhost:10255/stats/summary: 
dial tcp [::1]:10255: connect: cannot assign requested address

这表明某种连接问题。

但是,当 SSH-ing 到任何部署 Metricbeat 的节点时,会http://localhost:10255/stats/summary提供正确的输出:

{
  "node": {
   "nodeName": "...",
   "systemContainers": [
    {
     "name": "pods",
     "startTime": "2018-12-06T11:22:07Z",
     "cpu": {
      "time": "2018-12-23T06:54:06Z",
      ...
     },
     "memory": {
      "time": "2018-12-23T06:54:06Z",
      "availableBytes": 17882275840,
      ....

我一定遗漏了一些非常明显的东西。任何建议都可以。

注意:我在Elasticsearch 论坛上交叉发布(并且几天没有回复)相同的内容

标签: kuberneteselastic-stackmetricbeat

解决方案


valueFrom通过列表中的提供者注入 Pod 的节点 IP env:

env:
- name: HOST_IP
  valueFrom:
    fieldRef: status.hostIP

然后更新 metricbeat 配置文件以使用主机的 IP:

hosts: ["${HOST_IP}:10255"]

哪个 metricbeat 将通过其环境变量配置注入来解决


推荐阅读