如何从集群内访问 Kubernetes Ingress

时间:2021-03-07 09:28:45

标签: kubernetes kubernetes-ingress traefik amazon-eks traefik-ingress

我有一个只有公共子网的 AWS EKS 集群(出于安全原因,我们不需要私有子网,我真的想避免 NAT 数据传输费用)。在集群中,我们有 serviceA 和 serviceB。两者都通过面向公众的 LB 支持的 Ingress (Traefik) 公开。

所以这是我的问题:我们有一个配置选项“serviceB_url”这个配置被 serviceA 用来从集群内部访问 serviceB 并生成应该从集群外部工作的链接。所以基本上,我希望在集群内部和外部都使用相同的 URL。 DNS 指向面向公众的负载均衡器 IP,当然我可以从集群内部解析名称。

但这是我的问题:我无法访问它。由于负载均衡器 IP 是公开的,因此流量使用互联网网关离开 VPC,并使用未列入白名单的节点公共 IP 从外部到达负载均衡器。

我目前对此的看法:

  1. 我们之前有公共和私有子网。使用 NAT 网关,我们可以简单地将 NAT 的公共 IP 列入白名单。尽管这有效,但我认为这不是一个干净的解决方案,因为流量采用了非常不必要的路径。另外,如前所述,我们希望摆脱 NAT 网关,因为费用很高。

  2. 我知道 Ingress 的设计目的是向 OUTSIDE 公开,并且应该使用 Service 向 INSIDE 公开。但是使用该服务,我在中间丢失了反向代理。另外,我想知道这对于对请求中使用的 URL 或是否需要 TLS 很挑剔的服务如何工作。进一步考虑这个想法,我可以想象某种内部部署的反向代理服务,它会执行一些 URL 重写魔术。但是,是的,我已经不喜欢这个了。

  3. 在经典(意味着更静态)的基础架构中,我可能会通过使用 /etc/hosts 条目指向运行服务的节点的私有条目来解决这个问题,我们使用一些内部使用的自定义 DNS。

  4. 我读到我可以使用 CoreDNS 来重写 URL,例如。 foo.example.com 到 foo-internal.example.com。所以我可以将外部 URL 重写为 serviceB.my-namespace.svc.cluster-domain.example。再一次,我想知道这对于对其 URL 和/或 TLS 很挑剔的应用程序如何工作。可能需要为此创建一个反向代理。再一次,对我来说听起来很糟糕。

  5. 当然,我可以去更改我的应用程序并将配置选项拆分为“serviceB_url_internal”和“serviceB_url_external”。我只想用 Kubernetes 以某种方式解决这个问题。

  6. 最后,我认为我真正想要的是一个集群范围的 DNS 配置,它只返回反向代理 clusterIP,而不是我想要访问的 URL 的面向 Internet 的负载均衡器的 ip。这将解决问题,我不需要任何 URL 重写或其他时髦的东西。我可以使用 Ingress 本身以某种方式配置它吗?至少有一个选择加入这样的事情会很棒。或者有这样的服务吗? (这真的有效吗?)

如果你读到这里,谢谢:)

我只是想知道我是否在这里遗漏了一些明显的东西,而且它实际上非常容易配置。如何以干净的方式解决这个问题?或者使用相同的 URL 从集群内部和外部访问服务的想法完全错误?我可以想象这对于本地安装来说没什么大不了的,因为节点的“公共 ip”是众所周知的,并且白名单在那里不是一个大问题。

1 个答案:

答案 0 :(得分:1)

将以下重写添加到 CoreDNS 配置映射对我有用:

rewrite name external.url.to.servicaA traefik-service.traefik-namespace.svc.cluster.local

当然,这会带来在单独的配置映射中维护此条目的缺点。更喜欢带有注释或 CRD 的解决方案。