双端口转发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"]
附加参考:
总结:
我有一个 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"]
附加参考: