在 docker 容器内无法访问 kubectl port-forward

如何解决在 docker 容器内无法访问 kubectl port-forward

鉴于有一个 pod(例如 postgres)在 Kubernetes 中运行,kubectl port-forward pod 15432:5432 用于将 pod 暴露给主机。

通常情况下,可以通过运行postgres客户端: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/ --network=host 访问端口转发的 pod。它只能通过 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 标志来解决问题?

解决方法

在 Mac 或 Windows 上使用 Docker 时,将使用虚拟机来运行您的容器。 即使使用 --net=host,容器也不会直接在您的桌面上运行,而是在 VM 上运行。因此,127.0.0.1 是 VM IP,而不是主机 IP。如你所说,你可以在Mac/Windows 上使用host.docker.internal 来获取真机的IP。 在 Linux 上,容器在没有虚拟机的情况下运行,因此直接在真实主机上运行。

您可能想调查网真是否可以以更通用和更强大的方式解决您的用例:https://www.telepresence.io/

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?