【问题标题】:Kubernetes: connection refused on the endpoint of a working podKubernetes:在工作 pod 的端点上拒绝连接
【发布时间】:2022-03-04 16:24:19
【问题描述】:

我正在尝试调试为什么一个完美运行的部署的服务没有响应(连接被拒绝)。

我检查了 porttargetPort 是否匹配(4180 用于容器,80 用于服务)

当我列出我的端点时,我得到以下信息:

$ kubectl get endpoints
NAME           ENDPOINTS           AGE
kubernetes     10.40.63.79:443     82d
oauth2-proxy   10.40.34.212:4180   33s // <--this one

并且来自在同一命名空间中运行的 pod:

# curl 10.40.34.212:4180
curl: (7) Failed to connect to 10.40.34.212 port 4180: Connection refused

(顺便说一句,如果我尝试 curl 服务也会发生同样的情况)

然而,如果我直接转发到 pod,我会得到响应:

$ kubectl port-forward oauth2-proxy-559dd9ddf4-8z72c 4180:4180 &
$ curl -v localhost:4180
* Rebuilt URL to: localhost:4180/
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 4180 (#0)
> GET / HTTP/1.1
> Host: localhost:4180
> User-Agent: curl/7.58.0
> Accept: */*
> 
Handling connection for 4180
< HTTP/1.1 403 Forbidden
< Date: Tue, 25 Jun 2019 07:53:19 GMT
< Content-Type: text/html; charset=utf-8
< Transfer-Encoding: chunked
< 

<!DOCTYPE html>
// more of the expected response
* Connection #0 to host localhost left intact

我还检查了我在使用服务中的选择器时是否获得了 pod(我从kubectl describe svc oauth2-proxy 中看到的内容复制粘贴了它):

$ kubectl describe svc oauth2-proxy | grep Selector
Selector:          app.kubernetes.io/name=oauth2-proxy,app.kubernetes.io/part-of=oauth2-proxy

$ kubectl get pods --selector=app.kubernetes.io/name=oauth2-proxy,app.kubernetes.io/part-of=oauth2-proxy
NAME                            READY   STATUS    RESTARTS   AGE
oauth2-proxy-559dd9ddf4-8z72c   1/1     Running   0          74m

我不明白为什么端点拒绝连接,而使用端口转发得到有效响应。还有什么我应该检查的吗?

【问题讨论】:

  • 可以分享一下部署和服务yaml吗?
  • 感谢回复,终于找到问题所在了,我不知道为什么开发者默认选择只在localhost上监听,但至少他们在容器中有netstat来解决这个问题:- )

标签: kubernetes


【解决方案1】:

好吧,事实证明这个特定的服务默认只在本地主机上监听:

$ netstat -tunap | grep LISTEN
tcp        0      0 127.0.0.1:4180          0.0.0.0:*               LISTEN      1/oauth2_proxy

我必须添加一个参数 (-http-address=0.0.0.0:4180) 来告诉它在 0.0.0.0 上监听

【讨论】:

  • 我知道在 SO 上感谢某人的评论是违反规则的,但是.... Thaaaaaaaannnnnkksss。我快疯了。
  • 感谢您提出这个非常有用的问题和答案!在找到这篇文章之前,我在一个类似的问题上花费了大量时间。
  • 一样!我没有意识到在套接字中指定“127.0.0.1”的 IP 地址意味着它只会接受来自本地主机的连接。 (我认为这只是表明套接字源是一个东西,即服务器,从 localhost 运行)
【解决方案2】:

我面临与 OP 相同的行为,但原因不同。由于这篇文章是我在 Google 上的第一次点击,我希望我的额外回答能对其他人有所帮助。

我的问题是由 kubeProxy 配置错误引起的。我为 kubeadm 提供了一个配置文件,其中包含 KubeProxyConfiguration 的部分:

---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
nodePortAddresses: [10.0.0.0/24]
---

由于我的以太网适配器的 IP 发生了变化,配置为 nodePortAddress 的网络不再匹配以太网适配器的 IP 地址。我的 CNI 实现 (Cilium) 愉快地创建了一个新的虚拟 NIC,它具有合适的 IP 以适应此配置,因此问题被混淆了。由于 nodePort 未绑定到正确的 NIC,因此除非引入手动端口转发,否则不会将流量路由到 pod。

【讨论】:

    猜你喜欢
    • 2016-02-02
    • 1970-01-01
    • 2020-12-11
    • 2020-09-11
    • 2021-04-18
    • 1970-01-01
    • 2019-12-22
    • 2019-06-23
    • 1970-01-01
    相关资源
    最近更新 更多