双端口转发kubernetes + docker

Double port forwarding kubernetes + docker

总结:

我有一个 docker 容器,它是 运行ning kubectl port-forward,将 postgres 服务 运行ning 的端口 (5432) 作为 k8s 服务转发到本地端口 (2223)。 在 Docker 文件中,我公开了相关端口 2223。然后我通过发布上述端口 (-p 2223:2223)

运行 容器

现在,当我尝试通过 psql -h localhost -p 2223 访问 postgres 时,出现以下错误:

psql: server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.

但是,当我对上述容器执行 docker exec -ti 和 运行 上面的 psql 命令时,我能够连接到 postgres。

Docker文件命令:

EXPOSE 2223
CMD ["bash", "-c", "kubectl -n namespace_test port-forward service/postgres-11-2 2223:5432"]

Docker 运行 命令:

docker run -it --name=k8s-conn-12 -p 2223:2223 my_image_name:latest

docker运行 命令的输出:

Forwarding from 127.0.0.1:2223 -> 5432

所以端口转发成功,我可以从 docker 容器内连接到 postgres 实例。我无法做的是从容器外部连接到暴露和发布的端口

您的 $ kubectl port-forward ... 缺少以下参数:

  • --address 0.0.0.0

我已经重现了您尝试实现的设置,这就是无法连接的原因。我在下面包含了更多解释。


说明

  • $ kubectl port-forward --help

Listen on port 8888 on all addresses, forwarding to 5000 in the pod

kubectl port-forward --address 0.0.0.0 pod/mypod 8888:5000


Options:

--address=[localhost]: Addresses to listen on (comma separated). Only accepts IP addresses or localhost as a value. When localhost is supplied, kubectl will try to bind on both 127.0.0.1 and ::1 and will fail if neither of these addresses are available to bind.

默认情况下:$ kubectl port-forward 将绑定到 localhost,即 127.0.0.1在此设置中,localhost 将是容器的内部,即使使用 --publish (-p) 参数也无法从您的主机访问.

要允许不是来自 localhost 的连接,您需要通过前面提到的:--address 0.0.0.0。这将使 kubectl 侦听所有 IP 地址并相应地响应流量。

您的 Dockerfile CMD 应该类似于:

CMD ["bash", "-c", "kubectl -n namespace_test port-forward --address 0.0.0.0 service/postgres-11-2 2223:5432"]

附加参考: