【发布时间】: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”联系节点。你的 DShostNetwork: 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