繁体   English   中英

Docker Mac network_mode 主机和 kubernetes 使用种类

[英]Docker Mac network_mode host and kubernetes using kind

看到一些问题(例如https://github.com/docker/for-mac/issues/2716network_mode: host在 Mac 上不受支持。

但是,当我尝试使用kind运行 Kubernetes 集群并在 K8s 上运行 Spark 时,使用 Spark 主地址作为k8s://127.0.0.1:59369 ,它与 K8s 控制平面的地址和端口相同,我得到了一个 Connection Refused 错误,除非我使用network_mode: host 错误行:

Caused by: java.net.ConnectException: Failed to connect to /127.0.0.1:59369

这让我感到困惑,因为我认为network_mode: host应该对 Mac 没有影响,但有影响,它阻止我使用桥接网络并为该容器中的另一个应用程序添加端口映射。

任何想法如何解决这个问题?

在 Docker 桌面设置上指定主机网络会起作用; 问题是它指定的“主机”网络实际上并不是您在键盘上打字时直观期望的“主机”。

Docker MacOS 上的桌面启动隐藏的 Linux 虚拟机,容器在该虚拟机内运行。 当您运行docker run -p时,Docker Desktop 能够将该端口从 VM 转发到主机,因此端口映射正常工作。 但是,如果您使用docker run --net=host ,则可以访问 VM 的主机网络; 由于这通常会禁用 Docker 的网络层,因此 Docker 无法发现容器可能在做什么,并且它无法将任何内容从实际主机转发到 VM 到容器。 这就是主机网络“不起作用”的方式。

在实践中,我看到主机网络建议用于四件事:

  1. 具有不可预知或大量端口映射的进程,其中docker run -p无法使用
  2. 实际管理主机的网络环境,尽管在容器中运行
  3. 要访问同一主机上的非容器进程,其中host.docker.internal也可以工作
  4. 访问其他容器发布的端口,无需设置Docker网络

我认为这是您遇到的最后一种情况。 Kind 正在为 Kubernetes API 服务发布一个端口,因此端口 59369 可以在实际主机和 Linux VM 上访问。 现在,如果您的 Spark 容器激活主机网络,它正在使用 VM 的主机网络,但其他容器的已发布端口仍然可以在那里访问,这就是http://localhost:59369 URL 仍然有效的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM