概括:
我有一个运行 kubectl port-forward 的 docker 容器,它将作为 k8s 服务运行的 postgres 服务的端口(5432)转发到本地端口(2223)。在 Dockerfile 中,我已经暴露了相关的 2223 端口。然后我通过发布所述端口 ( -p 2223:2223
)来运行容器
现在,当我尝试通过 访问 postgrespsql -h localhost -p 2223
时,出现以下错误:
psql: server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
但是,当我docker exec -ti
对上述容器执行上述操作并运行上述 psql 命令时,我可以连接到 postgres。
Dockerfile 命令:
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 run 命令的输出:
Forwarding from 127.0.0.1:2223 -> 5432
所以端口转发成功,我可以从 docker 容器内部连接到 postgres 实例。我不能做的是从容器外部连接到暴露和发布的端口
我认为有两种可能的解决方案可能对您的情况有所帮助:
--address
参数添加到kubectl port-forward
命令中。默认情况下,kubectl
仅绑定到 localhost,因此它不会按您的预期工作(请参阅:Kubectl 参考文档)。bridge
除非另有说明,否则所有新启动的容器都连接到默认网络。要解决您的问题,您可以使用host
网络而不是bridge
网络。可以在Docker 主机网络文档中找到:我将简要介绍这两种解决方案,向您展示它是如何工作的。
首先,我准备了
postgres
:广告 1。
这种方法与您的方法非常相似,我只是添加了
--address
参数:注意:我使用了一个
kubectl
已经安装的容器。我只是想让你注意kubectl port-forward --address $(hostname -i),localhost service/postgres 2223:5432
命令。从另一个终端选项卡我们可以检查它是否有效:
此外,我们可以在主机上执行相同的操作(从具有公开和发布端口的容器外部):
广告 2。
这种方法需要使用主机网络:
注意:我只是想让您注意
--network=host
选项(我使用与以前相同的容器):同样,我们可以检查它是否在容器外部按预期工作:
此外,如果您真的需要 docker 容器进行端口转发,则值得考虑。也许
kubectl port-forward
在后台运行会更好(请参阅:在后台执行 kubectl port-forward)。