如何设置从 Windows 主机到 Vagrant Linux VM 到 Docker 容器的端口转发?

如何设置从 Windows 主机到 Vagrant Linux VM 到 Docker 容器的端口转发?

我使用的是 Windows 主机,在 Vagrant 中使用 VirtualBox 提供程序运行 CoreOS,在该 CoreOS 中,我运行着 Kubernetes 0.14.2 单节点集群(我无法让最新版本 0.15 可靠地运行)。我创建了一个 nginx 服务,如Kubernetes Docker 指南

kubectl -s http://localhost:8080 run-container nginx --image=nginx --port=80 --api-version="v1beta2"

kubectl expose rc nginx --port=80 --api-version="v1beta2"

假设 Kubernetes 服务代理已打开10.0.0.123:80,当我curl 10.0.0.123从 CoreOS 机器运行时,我会得到示例 HTML——正是我想要的。

Vagrant VM 有 2 个网络 - NAT 和主机专用适配器都使用 virtio-net。

我已经设置了 Vagrant/VirtualBox 端口转发,因此当我从 Windows 上的端口 8080 访问 VM 时,它将访问 VM 中的端口 80,对吗?

==> coreos-01: Forwarding ports...
    coreos-01: 80 => 8080 (adapter 1)
    coreos-01: 22 => 2222 (adapter 1)

端口转发有效,因为127.0.0.1:2222使用 ssh 连接有效。

以下是默认设置和/或由 Kubernetes 设置的路由:

 $ sudo iptables -t nat -S
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-N DOCKER
-N KUBE-PORTALS-CONTAINER
-N KUBE-PORTALS-HOST
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A PREROUTING -j KUBE-PORTALS-CONTAINER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT -j KUBE-PORTALS-HOST
-A POSTROUTING -s 10.1.0.0/16 ! -o docker0 -j MASQUERADE
-A KUBE-PORTALS-CONTAINER -d 10.0.0.2/32 -p tcp -m comment --comment "default/kubernetes" -m tcp --dport 443 -j REDIRECT --to-ports 51828
-A KUBE-PORTALS-CONTAINER -d 10.0.0.1/32 -p tcp -m comment --comment "default/kubernetes-ro" -m tcp --dport 80 -j REDIRECT --to-ports 35793
-A KUBE-PORTALS-CONTAINER -d 10.0.0.123/32 -p tcp -m comment --comment "default/nginx" -m tcp --dport 80 -j REDIRECT --to-ports 34303
-A KUBE-PORTALS-HOST -d 10.0.0.2/32 -p tcp -m comment --comment "default/kubernetes" -m tcp --dport 443 -j DNAT --to-destination 10.0.2.15:51828
-A KUBE-PORTALS-HOST -d 10.0.0.1/32 -p tcp -m comment --comment "default/kubernetes-ro" -m tcp --dport 80 -j DNAT --to-destination 10.0.2.15:35793
-A KUBE-PORTALS-HOST -d 10.0.0.123/32 -p tcp -m comment --comment "default/nginx" -m tcp --dport 80 -j DNAT --to-destination 10.0.2.15:34303

我的问题是,当我尝试curl 127.0.0.1:8080从 Windows 机器运行时,我得到了连接被拒绝如何从 Windows 主机连接到在 Kubernetes 中运行的服务,例如正在运行的东西10.0.0.123:80?谢谢!

答案1

您可以在创建服务时执行此操作,方法是将字段添加publicIPs到 JSON 定义,或者使用虚拟机的 IP 地址覆盖: kubectl expose rc nginx --port=80 --api-version="v1beta2" --overrides='{"publicIPs": ["172.17.8.101"], "apiVersion": "v1beta2"}'

另一个可行的方法是配置 Putty - 在连接 / SSH / 隧道中,添加单独的端口,例如在这种情况下,本地 8080 需要指向 10.0.0.123:80,因此 Putty 会说L8080 10.0.0.123:80。这很不方便,因为服务 IP 不是静态的。

Vagrant/VirtualBox 中的端口转发可以被删除,但它似乎不起作用。

相关内容