从本地 Docker 容器连接到 Kubernetes 中端口转发的 Postgresql 实例

问题描述 投票:0回答:1

我有一个 Django 应用程序,它与远程 Kubernetes 集群中运行的 Postgresql 数据库进行通信。有一个用于本地开发的

docker-compose.yml
文件。对于 Kubernetes 部署,我有一个用于 Django 应用程序的简单
deployment.yaml
文件,并且我使用 bitnami 的 helm 图表进行 Postgresql 部署。

我希望能够从运行 Django API 的 Docker 容器内连接到 Postgresql 实例。现在,当我对 Postgresql 实例进行端口转发时,我可以使用

psql
或其他工具从本地计算机连接到数据库。根据我的发现,为了能够从容器内访问本地主机上运行的服务,您需要通过
host.docker.internal
访问它。

我已在 docker compose 文件中添加了

extra_hosts
参数,并且可以正常访问本地计算机上运行的服务。但是,我无法从 Django API 容器内连接到端口转发的 Postgresql 实例。看来我无法以这种方式从容器连接到任何端口转发的服务。我做错了什么还是这是预期的行为?

docker kubernetes kubectl portforwarding
1个回答
0
投票

kubectl port-forward
通常用作开发人员或调试器工具;它并不认为自己是访问集群中服务的“正常”方式。这样做的结果之一是,默认情况下,它仅侦听 127.0.0.1(主机)本地主机接口。

您可以通过设置

kubectl port-forward
来侦听所有主机接口来修复此问题,特别是在未运行 Docker Desktop 的本机 Linux 主机上

kubectl port-forward --address 0.0.0.0 service/some-name-postgresql 5432

如果您使用 Docker Desktop(例如这个问题),那么与 Docker 相关的所有内容都在隐藏的 Linux 虚拟机中运行。对于从该虚拟机发出的调用,无论是到

host.docker.internal
还是更广泛的互联网,Docker Desktop 都需要运行代理来将这些请求转发到虚拟机之外。由于此代理位于主机上,因此它还可以到达侦听 127.0.0.1 的对象。 (这也与主机网络在容器内无法工作有关:“主机”实际上是 Linux 虚拟机。)

但是,如果您直接在本机 Linux 主机上使用核心 Docker 引擎,则 Docker 仅使用 Linux iptables 子系统来转发数据包。如果您使用调试工具环顾四周,

docker network inspect
可能会显示 Compose
default
网络为 172.18.0.0/16,并且在主机上,该网络上可能有一个 IPv4 地址为 172.18.0.1 的
docker1
接口。

从 Unix 网络的角度来看,这意味着请求来自

docker1
接口,但
kubectl port-forward
仅绑定到
lo0
(本地主机)接口。它不匹配,这就是为什么您会收到“连接被拒绝”错误的原因。更改端口转发以侦听所有接口可以消除此限制。

© www.soinside.com 2019 - 2024. All rights reserved.