Pod 无法访问 kubelet 端点

Posted

技术标签:

【中文标题】Pod 无法访问 kubelet 端点【英文标题】:Pod can't access kubelet endpoints 【发布时间】:2021-06-16 10:25:20 【问题描述】:

当我的 pod 尝试查询任何 kubelet 端点(任何端口)时,它们会立即获得 connection refused

我的目标是让 prometheus 从 cadvisor 获取这些指标,我正在尝试创建一个 ServiceMonitor 来抓取 cadvisor 指标(有关 pod 级别资源使用情况的信息)。

从集群上的任何 pod 尝试 wget 会导致以下结果:

$ wget 10.116.0.10:4194
Connecting to 10.116.0.10:4194 (10.116.0.10:4194)
wget: can't connect to remote host (10.116.0.10): Connection refused

我在 DigitalOcean 托管的 Kubernetes 上运行

编辑:上述情况发生在任何端口,而不仅仅是 4194

服务监控:

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: kubelet
  labels:
    app: prometheus
spec:
  jobLabel: k8s-app
  endpoints:
  - port: cadvisor
    interval: 15s
    honorLabels: true
    tlsConfig:
      insecureSkipVerify: true
  selector:
    matchLabels:
      k8s-app: kubelet
      app.kubernetes.io/managed-by: prometheus-operator
      app.kubernetes.io/name: kubelet
  namespaceSelector:
    matchNames:
    - kube-system

【问题讨论】:

在 Kubernetes 上,cAdvisor 位于 kubelet 二进制文件中,您应该知道。因此,您可以安装 metrics-server 并直接从 kubernetes API 中删除数据,就像 Prometheus 打算做的那样。 @HectorVido 我很想抓取 metrics-server,但它不是 Prometheus 格式,也没有列出单个端点上的所有指标。 使用kube-prometheus-stack时,抓取kubelet cadvisor指标应为enabled by default。如果您没有使用 promethus 堆栈,您仍然可以使用 kubelet/servicemonitor.yaml 并查看它是如何完成的。有什么有用的信息吗? @Matt 我一直在尝试破译 helm 文件。我没有在安装中使用 helm,所以我需要将其转换为普通的 ServiceMonitor,但我会尝试! @Matt 我在之后所做的事情一定是它,可能是不同的端口或使用正确的 TLS 配置或两者兼而有之,但它现在可以工作了! 【参考方案1】:

错误“连接被拒绝”表示防火墙可能会阻止该端口或没有服务正在侦听该端口。您确定使用正确的端口吗?

4194端口是cAdvisor使用的端口,为什么要使用IP(10.116.0.10)访问它?它与 Kubelet 没有任何关系。

【讨论】:

我在上面添加了我的 ServiceMonitor。似乎这就是它决定使用该 IP 的原因,而该 IP 恰好是该节点的私有 IP。在Targets 选项卡中,所有内容都在访问某个 IP。我确定它是正确的端口,我可以在笔记本电脑上从kubectl 访问端点。 不是节点的私有IP,而是kubectl get endpoints中列出的端点的私有IP

以上是关于Pod 无法访问 kubelet 端点的主要内容,如果未能解决你的问题,请参考以下文章

K8S POD无法访问外网域名

通过vagrant+virtualbox安装k8s找不到pod问题

pod 无法访问本地机器 Kubernetes 服务

无法从 pod 库访问捆绑包

引导 2.6 升级后无法访问端点

无法访问 Spring Boot Actuator“/actuator”端点