如何为在K8s群集之外的同一本地主机上运行的外部服务创建端点?

时间:2020-01-12 12:09:18

标签: docker kubernetes docker-for-windows kubernetes-service kube-proxy

我使用的是Docker for Windows(docker-desktop),它带有一个小的单节点kubernetes实例。我有一个场景,我的Pod需要与运行在同一本地主机(windwos 10计算机)上但在k8s集群之外的某些外部服务进行通信。

我知道我可以在集群中使用kubernetes.docker.internal到达我的node/localhost。但是不幸的是,pod在映像中有一些我不想更改的默认连接字符串-说pod在默认情况下尝试连接到dns字符串-“ my-server”。因此,在我的场景中,我想定义一个名称为“ my-server”的K8s服务,该服务具有对kubernetes.docker.internal的终结点引用,以便kube-proxy可以将其正确路由到我的本地主机(即Windows 10计算机)。

这有可能吗?我已经检查过this解决方案,但是它讨论的是在其他节点或云上运行的外部服务。我还考虑将本地计算机的主机名用作外部名称,但这对于我的用例而言,在dns解析中并不完全可靠。所以我真的很想使用kubernetes.docker.internal作为服务端点。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我使用的一个技巧是将内部 IP 地址转发回 127.0.0.1 它工作得很好。

# linux
sudo iptables -t nat -A OUTPUT -p all -d 10.0.100.100 -j DNAT --to-destination 127.0.0.1

# osx 
sudo ifconfig lo0 alias 10.0.100.100

答案 1 :(得分:0)

我知道我可以从kubernetes.docker.internal 到达我的node/localhost

如果您确定可以通过此地址访问Windows机器,则有一些解决方案。

Kubernetes 允许您修改任何/etc/hosts中的Pod文件。我假设kubernetes.docker.internal解析为某些IP。如果您知道此IP,则可以将其添加到/etc/hosts中的容器使用的Pod文件中。这种方式可以将您想要的任何域名映射到该IP。有关详细信息,请参阅 kubernetes文档中的this文章。


如果由于某种原因在这种情况下无法使用IP,则还有另一种解决方案。您可以使用rewrite插件来修改核心dns 的默认行为。 this文章对此进行了很好的描述。