【问题标题】:What is the relationship between an nginx ingress controller and a cloud load balancer?nginx入口控制器和云负载均衡器之间有什么关系?
【发布时间】:2018-07-23 04:20:42
【问题描述】:
我将nginx ingress controller 部署到我的集群。这会在我的云提供商(假设 AWS 或 GCE)中配置一个负载均衡器。但是,集群内的所有流量都由控制器根据我的入口规则和注释进行路由。
那么,让云中的负载均衡器放在这个控制器前面的目的是什么?控制器似乎正在执行实际的负载平衡?
我想了解如何使用它,以便云负载均衡器实际上将流量路由到集群内的机器,同时仍然遵循我的所有 nginx 配置/注释,或者即使这是可能的/有意义的。
【问题讨论】:
标签:
nginx
kubernetes
kubernetes-ingress
【解决方案1】:
您可能有一个包含多个主节点的高可用性 (HA) 集群,负载均衡器是一种简单实用的“进入”您的 Kubernetes 集群的方法,因为您的应用程序应该可供您的用户使用(他们在与您的集群不同的网络)。
因此,您需要有一个 K8S 集群的入口点。
LB 是一个易于配置的入口点。
以这张图片为例:
您的 API 服务器是负载平衡的。来自集群外部的调用将通过 LB 并由 API 服务器管理。只有一个 master(被选出来的)负责将集群的状态持久化到 etcd 数据库中。
当您拥有ingress controller 和ingress rules 时,在我看来,在K8S 中配置和管理它们会更容易,而不是将它们写入LB 配置文件(并在每次修改时重新加载配置)。
我建议你看看https://github.com/kelseyhightower/kubernetes-the-hard-way 并在里面做练习。这是理解流程的好方法。
【解决方案2】:
Ingress 控制器是一个“控制器”,在 kubernetes 术语中是一个软件循环,它监听声明性配置(Ingress 资源)和相关“集群状态”的变化,比较两者,然后“协调”集群的状态到声明性配置。
在这种情况下,“集群的状态”是以下各项的组合:
- 由控制器生成的 nginx 配置文件,由运行 nginx 的集群中的 pod 使用
- 云提供商的配置,指示提供商的边缘流量基础设施向集群中的 nginx pod 提供满足特定条件的特定外部传递流量。
因此,当您更新 Ingress 资源时,控制器会注意到更改,创建新的 nginx 配置文件,更新并重新启动运行 nginx 的 pod。
就物理架构而言,将事物可视化为集群“内部”与“外部”或“集群”和“云”并不准确。客户可见的一切都是抽象的。
在 GCP 中,在客户可见的虚拟机、负载平衡器和托管集群之下有多个数据包和流量管理层。
以入口为目标的外部流量在到达“您的”集群之前会通过 Google 基础架构中的多个逻辑控制点,您无法查看这些控制点的详细信息。