Kubernetes 为什么需要 Ingress

Kubernetes 为什么需要 Ingress

💡 原文中文,约2900字,阅读约需7分钟。
📝

内容提要

Kubernetes 中 Service 和 Pod 默认仅集群内可访问,NodePort/LoadBalancer 存在仅支持四层负载均衡、每个服务需单独创建负载均衡器、依赖云厂商等限制。Ingress 作为统一流量入口,提供七层负载均衡,可复用单个负载均衡器和 IP 服务多个 Service,支持基于 Host 和 URL 的路由,并附加授权、限流、SSL 等功能。Ingress 需配合 Ingress Controller(如 Nginx Ingress Controller)生效,后者根据 Ingress 规则生成 nginx.conf 并重载。

🔎

延伸解读

Ingress 的核心价值:复用入口与七层路由

文章指出,LoadBalancer 类型的 Service 每个服务都需要单独创建负载均衡器,且仅支持四层负载均衡。Ingress 通过复用单个外部负载均衡器和 IP,为多个 Service 提供服务,同时支持基于 Host 和 URL 的七层路由。这意味着在需要暴露多个 HTTP 服务时,Ingress 能简化系统结构并降低基础架构成本,尤其适合云上环境。

Ingress 资源与 Controller 的分工

Ingress 资源本身不会自动创建负载均衡器,必须依赖 Ingress Controller 才能生效。以 Nginx Ingress Controller 为例,Controller 容器从 Informer 订阅 Service 和 EndPoint 变化,生成 nginx.conf 并执行 nginx -s reload 通知同 Pod 内的 Nginx 重新加载。因此,集群中必须运行一个 Ingress Controller,且其自身也需要通过 LoadBalancer 类型的 Service 暴露到集群

路由规则膨胀的实践警示

文章示例中,15 个服务和 100+ 条 Ingress 路由规则生成的 nginx.conf 达到 4.3 MB。这提示读者,随着微服务数量和路由规则增加,Ingress 配置会变得庞大,可能影响可维护性。作者建议合理划分微服务和构建对应的 Ingress 结构,避免将所有规则集中在一个 Ingress 中,从而降低管理复杂度。

Ingress Controller 的选型空间

除了默认的 Nginx Ingress Controller,主流云厂商提供了自己的开源版本,社区中还有基于 OpenResty 的 Kong Ingress Controller、Apache APISIX Ingress Controller,以及基于 Traefik 的实现。不同 Controller 在功能、性能和生态上可能有差异,读者可根据实际环境选择,但需注意它们都遵循 Ingress 资源定义来管理负载均衡器。

❓

Q&A

Kubernetes 中为什么需要 Ingress?

因为默认 Service 和 Pod 仅集群内可访问,NodePort 和 LoadBalancer 类型的 Service 存在限制:LoadBalancer 仅支持四层负载均衡,每个服务需单独创建负载均衡器,增加开销和管理成本;且依赖云厂商支持 LoadBalancer 的环境。Ingress 作为统一流量入口,提供七层负载均衡,可复用单个负载均衡器和 IP 服务多个 Service,支持基于 Host 和 URL 的路由,并附加授权、限流、SSL 等功能。

Ingress 和 LoadBalancer 类型的 Service 有什么区别?

LoadBalancer 类型的 Service 仅支持四层负载均衡,每个服务需要单独创建一个负载均衡器,且要求集群运行在支持 LoadBalancer 的云环境中。而 Ingress 提供七层负载均衡,可以复用单个负载均衡器和 IP 为多个 Service 提供服务,支持基于 Host 和 URL 的路由,并附加授权、限流、SSL 等七层功能,降低了基础架构成本。

Ingress 支持哪些路由方式?

Ingress 提供七层负载均衡,仅支持转发 HTTP(S) 流量的规则。常见的 HTTP 路由方式分为基于 Host 和基于 URL 两种。

Ingress 如何生效?需要什么组件配合?

Ingress 资源本身不会自动创建负载均衡器,必须配合 Ingress Controller 才能生效。Ingress Controller 根据 Ingress 规则管理负载均衡器,例如 Nginx Ingress Controller 会生成 nginx.conf 配置文件并重载 Nginx。

Nginx Ingress Controller 是如何工作的?

Nginx Ingress Controller 可以理解为运行在 Pod 中的 Nginx 服务器,负责将请求重定向到集群内部的其他 Service。其 Nginx 守护进程容器和 Ingress Controller 容器运行在同一 Pod 中,Ingress Controller 从 Informer 订阅 Service、EndPoint 资源的变化,生成对应的 nginx.conf 配置文件,最后执行 nginx -s reload 通知 Nginx 重新加载配置。

除了 Nginx Ingress Controller,还有哪些常见的 Ingress Controller 实现?

除了 Nginx Ingress Controller,主流云服务厂商都提供了自己的开源版本 Ingress Controller。开源社区中比较火的有基于 OpenResty 实现的 Kong Ingress Controller 和 Apache APISIX Ingress Controller,还有基于 Traefik 实现的 Ingress Controller。

🏷️

标签

➡️

继续阅读