通过Docker在本地Kubernetes:为什么我们需要端口转发?

尝试了我的Mac上的Kubernetes,按照本指南和使用docker-toolbox,我不明白为什么我需要这一步:

Note: On OS/X you will need to set up port forwarding via ssh: boot2docker ssh -L8080:localhost:8080 

api服务器正在运行--net=host所以我应该能够使用curl <ip-of-my-docker-machine>:8080但是我的连接被拒绝了。 用ssh设置端口转发解决了这个问题,但是我还是不明白为什么我不能直接控制主机。 任何解释都会很好。

api服务器只侦听localhost,而不是docker-machine的ip地址。

您可以让主机VM将docker-machine ip的请求转发到localhost

 docker-machine ssh default sudo /usr/local/sbin/iptables -t nat -I PREROUTING -p tcp -d $(docker-machine ip) --dport 8080 -j DNAT --to-destination 127.0.0.1:8080 

在Mac上,docker在boot2docker虚拟机中运行 。 使用--net=host选项,api服务器在虚拟机的主机networking上运行,而不是在Mac的主机networking上运行。 你也可以在没有端口转发的情况下ssh进入boot2docker虚拟机,并从那里curlAPI,然后你只需要在ssh-ed下载kubectl客户端到虚拟机中。

因为Docker虚拟机默认拒绝外部stream量,当使用--net=host时,Docker不会自动设置防火墙规则来允许stream量,因此不能使用curl <ip-of-my-docker-machine>:8080 。 这篇文章更深入。