首页 > 解决方案 > 如何为面向公众的 Web 应用程序设置 DNS 和入口控制器?

问题描述

我试图理解 kubernetes 中入口和入口控制器的概念。但我不太确定最终产品应该是什么样子。以下是我不完全理解的内容:

鉴于我在某个地方有一个正在运行的 Kubernetes 集群,其中有一个主节点,它运行控制平面和 etcd 数据库。除此之外,我还有 3 个工作节点 - 每个工作节点都有一个公共 IPv4 地址和相应的 DNS A 记录 ( worker{1,2,3}.domain.tld),并且我可以完全控制我的 DNS 服务器。我希望我的用户通过www.domain.tld. 所以我将wwwCNAME 指向一个工作节点(我看到我的入口控制器,即被安排到 worker1 一个,所以我将它指向worker1.domain.tld)。

现在,当我安排一个由 2 个前端 pod 和 1 个数据库 pod 组成的工作负载时,其中 1 个服务用于前端,1 个服务用于数据库。根据现在的理解,我需要一个指向前端服务的入口控制器来实现某种负载平衡。这里有两个问题:

  1. 仅在一个工作节点上运行入口控制器是否没有意义通过其服务在内部平衡两个前端 pod?在集群中的每个工作节点上运行入口控制器是最佳实践吗?

  2. 无论出于何种原因,运行入口控制器的工作人员死亡,并被重新安排给另一个工作人员。所以入口点将位于另一个 IPv4 地址,对吗?从尝试通过 访问前端的用户的角度来看,www.domain.tld必须更新此 DNS 条目,对吗?怎么会这样?我是否需要在某处运行特定的支持 kubernetes 的 DNS 服务器?我不明白DNS服务器和kubernetes集群之间的连接。

额外的问题:如果我运行更多入口控制器副本(分布在多个工作人员中),我是否会在此处使用基于 DNS 循环的方法,将多个 IPv4 地址绑定到一个 DNS 条目?或者什么是实现 HA 的最佳解决方案。我不想在工作人员共享相同 IP 地址的情况下使用负载平衡 IP 地址。

标签: kuberneteskubernetes-ingress

解决方案


鉴于我在某个地方有一个正在运行的 Kubernetes 集群,其中有一个主节点,它运行控制平面和 etcd 数据库。除此之外,我还有 3 个工作节点——每个工作节点都有一个公共 IPv4 地址和相应的 DNS A 记录(worker{1,2,3}.domain.tld),我可以完全控制我的 DNS服务器。我希望我的用户通过 www.domain.tld 访问我的 Web 应用程序。所以我将 www CNAME 指向一个工作节点(我看到我的入口控制器,即被安排到 worker1 一个,所以我将它指向 worker1.domain.tld)。

现在,当我安排一个由 2 个前端 pod 和 1 个数据库 pod 组成的工作负载时,其中 1 个服务用于前端,1 个服务用于数据库。根据现在的理解,我需要一个指向前端服务的入口控制器来实现某种负载平衡。这里有两个问题:

  1. 仅在一个工作节点上运行入口控制器是否没有意义通过其服务在内部平衡两个前端 pod?在集群中的每个工作节点上运行入口控制器是最佳实践吗?

是的,这是一个很好的做法。为负载均衡器提供多个 Pod 对于确保高可用性很重要。例如,如果您运行ingress-nginx 控制器,您可能应该将其部署到多个节点。

  1. 无论出于何种原因,运行入口控制器的工作人员死亡,并被重新安排给另一个工作人员。所以入口点将位于另一个 IPv4 地址,对吗?从试图通过 www.domain.tld 访问前端的用户的角度来看,这个 DNS 条目必须更新,对吧?怎么会这样?我是否需要在某处运行特定的支持 kubernetes 的 DNS 服务器?我不明白DNS服务器和kubernetes集群之间的连接。

是的,IP会改变。是的,这需要在您的 DNS 服务器中更新。

有几种方法可以处理这个问题:

  1. 假设客户将处理中断。您可以在循环中列出所有负载均衡器节点并假设客户端将回退。这适用于某些协议,但主要意味着超时和问题,通常不应该使用,特别是因为当 k8s 认为它​​将创建/删除 LB 条目时,您仍然需要手动更新记录

  2. 自动配置外部 DNS 服务器。这可以通过external-dns项目来完成,该项目可以与大多数流行的 DNS 服务器同步,包括标准 RFC2136 动态更新,也包括亚马逊、谷歌、Azure 等云提供商。

额外的问题:如果我运行更多入口控制器副本(分布在多个工作人员中),我是否会在此处使用基于 DNS 循环的方法,将多个 IPv4 地址绑定到一个 DNS 条目?或者什么是实现 HA 的最佳解决方案。我不想在工作人员共享相同 IP 地址的情况下使用负载平衡 IP 地址。

是的,您基本上应该进行 DNS 循环。我会假设external-dns也会在这里做正确的事情。

另一种选择是做某种 ECMP。这可以通过让两个负载平衡器“宣布”相同的 IP 空间来实现。但是,这是一种高级配置,可能不是必需的。BGP/ECMP 和 DNS 更新之间有一些有趣的权衡,请参阅此 Dropbox 工程帖子,了解有关这些的更深入讨论。

最后,请注意,CoreDNS 正在考虑实现公共 DNS 记录,它可以在 Kubernetes 中本地解决这个问题,而无需外部资源。


推荐阅读