【发布时间】:2021-06-05 10:59:05
【问题描述】:
我有一个只有公有子网的 AWS EKS 集群(出于安全原因,我们不需要私有子网,我真的想避免 NAT 数据传输费用)。在集群中,我们有 serviceA 和 serviceB。两者都通过面向公众的 LB 支持的 Ingress (Traefik) 公开。
所以这是我的问题:我们有一个配置选项 'serviceB_url' 这个配置既被 serviceA 用来从集群内部访问 serviceB,也被用来生成应该从集群外部工作的链接。所以基本上,我希望相同的 URL 在集群内部和外部都可以使用。 DNS 指向面向公众的负载均衡器 IP,当然我可以从集群内部解析名称。
但这是我的问题:我无法访问它。由于负载均衡器 IP 是公共的,因此流量使用互联网网关离开 VPC,并使用未列入白名单的节点公共 IP 从外部到达负载均衡器。
到目前为止我对此的看法:
-
我们之前有公共子网和私有子网。使用 NAT 网关,我们可以简单地将 NAT 的公共 IP 列入白名单。尽管这很有效,但我认为这不是一个干净的解决方案,因为 traffik 采取了一条非常不必要的路径。另外,如前所述,由于费用很高,我们希望摆脱 NAT 网关。
-
我知道 Ingress 的设计目的是向 OUTSIDE 公开,应该使用 Service 向 INSIDE 公开。但是使用该服务,我在中间丢失了我的反向代理。另外,我想知道对于对请求中使用的 URL 或是否需要 TLS 挑剔的服务来说,这将如何工作。进一步考虑这个想法,我可以想象某种内部部署的反向代理服务会执行一些 URL 重写魔术。但是,是的,我已经不喜欢这个了。
-
在经典(意味着更静态)基础架构中,我可能会通过使用 /etc/hosts 条目来解决这个问题,这些条目指向运行服务的节点的私有,我们使用一些内部使用的自定义 DNS。
-
我读到我可以使用 CoreDNS 来重写 URL,例如。 foo.example.com 到 foo-internal.example.com。所以我可以将外部 URL 重写为 serviceB.my-namespace.svc.cluster-domain.example。再一次,我想知道这对于那些对其 URL 和/或 TLS 挑剔的应用程序来说是如何工作的。可能需要为此创建一个反向代理。而且,再一次,对我来说听起来很老套。
-
当然,我可以去更改我的应用程序并将配置选项拆分为“serviceB_url_internal”和“serviceB_url_external”。我只是想以某种方式用 Kubernetes 解决这个问题。
-
最后,我认为我真正想要的是一个集群范围的 DNS 配置,它只返回反向代理 clusterIP 而不是我想要访问的 URL 的面向互联网的负载均衡器的 ip。这将解决问题,我不需要任何 URL 重写或其他时髦的东西。我可以使用 Ingress 本身以某种方式配置它吗?至少可以选择加入这样的事情会很棒。或者有没有这样的服务? (这真的有用吗?)
如果你已经读到这里,谢谢:)
我只是想知道我是否在这里遗漏了一些明显的东西,而且它实际上很容易配置。如何以干净的方式解决这个问题?或者使用相同的 URL 从集群内部和外部访问服务的想法是完全错误的?我可以想象这对于本地安装来说没什么大不了的,因为节点的“公共 ip”是众所周知的,白名单在那里并不是什么大问题。
【问题讨论】:
标签: kubernetes kubernetes-ingress traefik amazon-eks traefik-ingress