Kubernetes 端口转发 - 连接被拒绝

Posted

技术标签:

【中文标题】Kubernetes 端口转发 - 连接被拒绝【英文标题】:Kubernetes Port Forwarding - Connection refused 【发布时间】:2019-05-16 21:32:48 【问题描述】:

转发端口时出现以下错误。有人可以帮忙吗?

mjafary$ sudo kubectl port-forward sa-frontend 88:82

Forwarding from 127.0.0.1:88 -> 82
Forwarding from [::1]:88 -> 82

错误日志:

Handling connection for 88
Handling connection for 88
E1214 01:25:48.704335   51463 portforward.go:331] an error occurred forwarding 88 -> 82: error forwarding port 82 to pod a017a46573bbc065902b600f0767d3b366c5dcfe6782c3c31d2652b4c2b76941, uid : exit status 1: 2018/12/14 08:25:48 socat[19382] E connect(5, AF=2 127.0.0.1:82, 16): Connection refused

这里是对 pod 的描述。我的期望是,当我在浏览器中点击 localhost:88 时,请求应该转发到 jafary/sentiment-analysis-frontend 容器并且应该加载应用程序页面

mjafary$ kubectl describe pods sa-frontend

Name:         sa-frontend
Namespace:    default
Node:         minikube/192.168.64.2
Start Time:   Fri, 14 Dec 2018 00:51:28 -0700
Labels:       app=sa-frontend
Annotations:  <none>
Status:       Running
IP:           172.17.0.23
Containers:
  sa-frontend:
    Container ID: docker://a87e614545e617be104061e88493b337d71d07109b0244b2b40002b2f5230967
    Image:          jafary/sentiment-analysis-frontend
    Image ID:       docker-pullable://jafary/sentiment-analysis-frontend@sha256:5ac784b51eb5507e88d8e2c11e5e064060871464e2c6d467c5b61692577aeeb1
    Port:           82/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Fri, 14 Dec 2018 00:51:30 -0700
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
  /var/run/secrets/kubernetes.io/serviceaccount from default-token-mc5cn (ro)
Conditions:
  Type           Status
  Initialized    True 
  Ready          True 
  PodScheduled   True 
Volumes:
  default-token-mc5cn:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-mc5cn
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
             node.kubernetes.io/unreachable:NoExecute for 300s
Events:          <none>

【问题讨论】:

嗨,Jaf,欢迎来到 SO。您需要为您尝试连接的 Pod 发布 PodSpec,因为我们无法猜测它是否真的在端口 :82 上监听了某些东西。另外,您能否从集群内部(不使用端口转发)连接到该 Pod? 我已按要求将详细信息添加到说明中。我是 Kubernetes 新手,正在努力学习。您能否指导我如何在不使用端口转发的情况下从集群内连接到 Pod? 有两种方法,一种比另一种更有用:kubectl -n default exec -it sa-frontend curl -v localhost:82 然后来自另一个 Pod 的相同技巧,一种已经在运行,或者一种专门为调试目的而创建。我希望您也可以从 minikube 的 VM 中 curl:minikube ssh curl -v 172.17.0.23:82(我不使用 minikube,因此您可能必须将它们分成两个命令,ssh,然后 curl) 所以,仅根据您上面的输出,我看不到您将 nginx 配置为侦听:82 的位置,因为容器说它正在侦听:80docker run --rm -it --entrypoint=/bin/grep 'jafary/sentiment-analysis-frontend@sha256:5ac784b51eb5507e88d8e2c11e5e064060871464e2c6d467c5b61692577aeeb1' listen /etc/nginx/conf.d/default.conf @ 987654329@ 知道了。因此,当我创建一个新 pod 时,它将使用在容器的 Dockerfile 中配置的基本 nginx 映像的默认端口配置在其中创建一个容器。当我尝试使用从 88 到 80 的端口转发时,它开始工作了.. 【参考方案1】:

连接被拒绝的原因是没有进程监听端口 82。用于创建 nginx 映像的 dockerfile 暴露了端口 80,并且在您的 pod 规范中您还暴露了端口 82。但是,nginx 配置为监听 80 端口。

这意味着您的 pod 有两个已暴露的端口:80 和 82。但是,nginx 应用程序正在主动侦听端口 80,因此只有对端口 80 的请求才有效。

要使用端口 82 使您的设置工作,您需要更改 nginx 配置文件,以便它侦听端口 82 而不是 80。您可以通过创建自己的 docker 镜像来执行此操作,并将更改内置到您的镜像中,或者您可以使用 configMap 将默认配置文件替换为您想要的设置

【讨论】:

【参考方案2】:

正如@Patric W 所说,连接被拒绝,因为没有进程在侦听端口 82。该端口尚未暴露。

现在,要获取 pod 正在侦听的端口,您可以运行命令

NB:务必将中的任何值更改为实际值。

首先,获取指定命名空间kubectl get po -n &lt;namespace&gt;中的pod名称 现在检查您要转发的 pod 的暴露端口。
kubectl get pod <pod-name> -n <namespace>  --template='(index (index .spec.containers 0).ports 0).containerPort"\n"'

现在使用上面生成的暴露端口通过命令运行端口转发

kubectl port-forward pod/&lt;pod-name&gt; &lt;local-port&gt;:&lt;exposed-port&gt;

其中local-port 是从浏览器..localhost:&lt;local-port&gt; 访问容器的端口,而exposed-port 是容器侦听的端口。通常使用 Dockerfile 中的EXPOSE 命令定义

获取更多信息here

【讨论】:

【参考方案3】:

正如帕特里克正确指出的那样。我有同样的问题困扰了我 2 天。所以步骤是:

    确保您的 Dockerfile 使用您的首选端口 (EXPOSE 5000) 在您的 pod.yml 文件中确保 containerPort 为 5000(containerPort: 5000) 应用 kubectl 命令反映上述情况:

kubectl port-forward pod/my-name-of-pod 8080:5000

【讨论】:

以上是关于Kubernetes 端口转发 - 连接被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

使用 Cygwin ssh 进行 X11 转发得到端口 6000 连接被拒绝

SSH -L 连接成功,但 localhost 端口转发不起作用“通道 3:打开失败:连接失败:连接被拒绝”

错误:转发端口:错误升级连接:错误拨号后端:-Azure Kubernetes 服务

来自本地 kubernetes 集群的 Keycloak 端口转发

Kubernetes NAT 流服务器 - 连接被拒绝

Centos 7 Puppet Enterprise 安装 - 4433 端口上的连接被拒绝