【问题标题】:Metricbeat kubernetes module can’t connect to kubeletMetricbeat kubernetes 模块无法连接到 kubelet
【发布时间】:2018-12-24 06:40:43
【问题描述】:

我们有一个设置,其中 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.default/whatever):

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

注意:使用集群 IP 而不是 localhost(这样它就可以访问 控制平面)也可以工作(虽然不检索所需的 当然是信息)。

上面的配置直接取自 Metricbeat 文档并立即让我感到奇怪-本地主机如何 翻译(从 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 Forums 上交叉发布了相同的内容(几天没有得到回复)

【问题讨论】:

  • 请注意,除非您的 DaemonSet 是 hostNetwork: true,否则“localhost”表示 Pod 的本地主机,而不是节点的本地主机。您可能更乐意将 Pod 的 status.hostIP 注入 metricbeat 并让它通过 IP 而不是“localhost”联系节点。你的 DS hostNetwork: true 吗?
  • @MatthewLDaniel 曾经在某个时候。问题是,它会影响所有 DNS 解析。因此,如果,例如,在 metricbeat 设置中,通过 logstash.system 的 DNS 名称(你知道,DNS 名称 ..cluster.local.svc)引用了 logstash...这会被破坏.这当然意味着localhost 不能同时与logstash.namespace 一起使用。
  • 有道理;所以我猜两件事:尝试通过{"env":[{"name": "POD_IP", "valueFrom": {"fieldRef": "status.hostIP"}}]} 注入 Pod 的节点 IP,或者您也可以尝试将容器的 DNS 指向集群的 DNS,即使在 hostNetworking: true 模式下也是如此
  • 这就是你所做的......并且它成功了,或者这就是你已经尝试过但没有成功?另外,您尝试了哪些,因为我的建议中有一个“或”
  • @MatthewLDaniel 抱歉,我没有意识到这会模棱两可。我通过向下 API 注入了hostIP,并默认保留了hostNetworking,即false。愿意将其作为答案,以便我接受吗?

标签: kubernetes elastic-stack metricbeat


【解决方案1】:

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

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

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

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

哪个 metricbeat 将通过其environment variable config injection 解析

【讨论】:

  • 我还需要一个嵌套的 fieldPath,即(在 JSON 中){"name": "HOST_IP", "valueFrom": {"fieldRef": {"fieldPath": "status.hostIP"}}}
猜你喜欢
  • 2020-12-13
  • 2017-06-16
  • 1970-01-01
  • 2019-04-30
  • 2022-08-19
  • 2019-09-12
  • 2020-10-14
  • 2019-04-16
  • 1970-01-01
相关资源
最近更新 更多