【问题标题】:How do I create an Endpoint for an external service running on the same localhost outside of K8s cluster?如何为在 K8s 集群之外的同一 localhost 上运行的外部服务创建端点?
【发布时间】:2020-01-12 12:09:18
【问题描述】:

我正在使用 Docker for Windows (docker-desktop),它附带一个小型单节点 kubernetes 实例。我有一个场景,我的 pod 需要与运行在同一 localhost(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 作为服务端点。有什么想法吗?

【问题讨论】:

  • 最好在代码中使服务器主机名可配置,而不是在 Kubernetes 层尝试破解它。
  • 嗨@DavidMaze,感谢您的回复,是的,这就是我要向我们的团队提出的建议。但是此时我们正在使用已经以这种方式构建的 docker 映像,我现在不想更改它。因此,我问了这个问题,以重用“我的服务器”作为服务别名,用于在主机上本地运行的实际服务。这是否意味着我们不能定义一个可以指向“kubernetes.docker.internal”作为后端的服务?

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


【解决方案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

【讨论】:

    【解决方案2】:

    我知道我可以在 集群到达我的node/localhost

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

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


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-14
      • 2019-10-12
      • 2020-02-17
      • 2022-08-13
      • 1970-01-01
      • 2021-06-05
      相关资源
      最近更新 更多