kubernetes - 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.default
whatever):
- 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 论坛上交叉发布(并且几天没有回复)相同的内容
解决方案
valueFrom
通过列表中的提供者注入 Pod 的节点 IP env:
:
env:
- name: HOST_IP
valueFrom:
fieldRef: status.hostIP
然后更新 metricbeat 配置文件以使用主机的 IP:
hosts: ["${HOST_IP}:10255"]
哪个 metricbeat 将通过其环境变量配置注入来解决
推荐阅读
- java - 如何正确过滤 Spring REST 数据
- c++ - 使用 enable_if 来阻止声明?
- c++ - 基类抛出异常。如何传播?
- python - 如何使用 sklearn 管道缩放 Keras 自动编码器模型的目标值?
- c# - 如何在我的 c# 应用程序中专门使用设备?
- mongodb - 在 MongoDB 中按名称搜索最近的区域
- java - 执行 selenium 独立 jar 的问题
- javascript - 反应“不能破坏财产”
- c++ - 当输入是整数变量中的字符串时,为什么输出 4196208?
- c# - Task.Run() 未按预期工作-“无法将类型 void 隐式转换为对象”