【发布时间】:2021-06-02 04:56:51
【问题描述】:
鉴于有一个 pod(例如 postgres)在 kubernetes 中运行,kubectl port-forward pod 15432:5432 被用于将 pod 暴露给主机。
通常可以通过运行postgres客户端在host中访问:psql -h 127.0.0.1 -p 15432,或者通过访问http://127.0.0.1:15432,或者直接建立TCP连接:echo > /dev/tcp/127.0.0.1/15432 && echo yes。如果连接建立成功,kubectl 会提示消息Handling connection for 15432 进行验证。
但是,使用127.0.0.1/172.17.0.1 在容器内访问端口转发的 pod 是不可能的,尽管标志 --network=host 是否正在使用。只能通过host.docker.internal访问
这可能是 docker for mac 独有的问题。我还没有在linux上验证过。
这是我在 docker 中运行连接测试时的日志。很明显TCP连接无法建立。
$ docker run --network=host -it --rm postgres:12.4 /bin/bash
# inside container
# unsuccessful for establishing TCP connection to 127.0.0.1:15432
root@docker-desktop:/# echo > /dev/tcp/127.0.0.1/15432 && echo yes
bash: connect: Connection refused
bash: /dev/tcp/127.0.0.1/15432: Connection refused
# unsuccessful for establishing TCP connection to 172.17.0.1:15432
[root@docker-desktop /]# echo > /dev/tcp/172.17.0.1/15432 && echo yes
bash: connect: Connection refused
bash: /dev/tcp/172.17.0.1/15432: Connection refused
# no surprise: unsuccessful for psql 127.0.0.1
root@docker-desktop:/# psql -h 127.0.0.1 -p 15432
psql: error: could not connect to server: could not connect to server: Connection refused
Is the server running on host "127.0.0.1" and accepting
TCP/IP connections on port 15432?
# successful for host.docker.internal
root@docker-desktop:/# psql -h host.docker.internal -p 15432
Password for user root:
这里有一些可能有用的 nslookup/ifconfig 日志:
Server: 192.168.65.1
Address: 192.168.65.1#53
Non-authoritative answer:
Name: host.docker.internal
Address: 192.168.65.2
bash-5.0# ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:02
inet addr:172.17.0.2 Bcast:172.17.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:12 errors:0 dropped:0 overruns:0 frame:0
TX packets:3 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:984 (984.0 B) TX bytes:202 (202.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:1 errors:0 dropped:0 overruns:0 frame:0
TX packets:1 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:29 (29.0 B) TX bytes:29 (29.0 B)
为什么 docker 容器和主机之间的连接存在差异? host.docker.internal 如何解决底层问题?是否有其他方法可以通过提供 docker run 标志来解决问题?
【问题讨论】:
-
kubectl port-forward不应该是您在 Kubernetes 中访问服务的主要方式。您可以将这个任务作为 Kubernetes 作业来运行吗? (由于 Docker Desktop for Mac 上隐藏的 Linux VM,您遇到了一些问题,因此“127.0.0.1”可能是主机、Linux VM 或容器,具体取决于设置方式;但是主机网络广泛地说,它不适用于 MacOS。)
标签: macos docker kubernetes networking docker-for-mac