Skip to content

Ingress选型

在 Kubernetes 中,service IP 和 Pod IP 主要供集群内部访问使用,对于集群外部是不可见的。

如果要从集群外部访问,常用是的以下 3 种方式。

(1)通过 NodePort 方式

如下图:

d6162bf1ecb094914dfa3ef3095dcbef MD5

我们忽略具体的实现细节,通过 NodePort 的方式会在所有的 Node 节点上映射一个端口,端口范围默认是 30000-32767。然后用户通过任意主机+映射端口来访问集群内部。

这种方式的优点是实现方式比较简单,缺点是如果映射的端口太多不好管理,每一个端口只能提供一种服务,还有以此生成的 iptables 规则也很多。

(2)通过 LoadBalancer 方式

如下图:

1439e262d8634e7c362438aefb950187 MD5

从图种可以看到 Load Balancer 服务暴露服务非常直接,直接把服务暴露到 Internet,通往指定端口的流量都会被转发到对于的服务,它没有过滤条件、没有规则等。

这种方式最大的缺点就是每个 LoadBalancer 都需要一个固定的 IP,而且更多情况下是需要云产商的支持。

(3)通过 Ingress 方式

如下图:

16688ffa004647ee831335155a3112cf MD5

Ingress 本身不提供服务,它依赖 Ingress Controller,Ingress Controller 以 Pod 的形式部署在 Kubernetes 集群内,实质上我们无法从外面直接访问,依然要将其暴露出来,暴露方式有几种:

  • 通过 NodePort 形式暴露,前面需接一个负载均衡
  • 通过 LoadBalancer 形式暴露,云产商默认就是这种方式
  • 直接在 Pod 中使用 hostport,前面需接一个负载均衡

ingress 的实现方式更智能、更友好,相对的配置就略微复杂,它一个 IP 可以暴露多个应用,支持同域名不同 uri,支持证书等功能。

目前 Ingress 暴露集群内服务的行内公认最好的方式,不过由于其重要地位,世面上有非常多的 Ingres Controller,常见的有:

  • Kubernetes Ingress
  • Nginx Ingress
  • Kong Ingress
  • Traefik Ingress
  • HAProxy Ingress
  • Istio Ingress
  • APISIX Ingress

除了上面列举的这些,还有非常多的 Ingress Controller,面对如此多的 Ingress Controller,我们该如何选择呢?参考的标准是什么?

一般情况下可以从以下几个维度进行判断:

  • 支持的协议:是否支持除 HTTP(S)之外的协议
  • 路由的规则:有哪些转发规则,是否支持正则
  • 部署策略:是否支持 ab 部署、金丝雀部署、蓝绿部署等
  • upstream 探针:通过什么机制判定应用程序正常与否,是否
  • 负载均衡算法:支持哪些负载均衡算法,Hash、会话保持、RR、WRR 等
  • 鉴权方式:
  • DDoS 防护能力:是否支持基本的限速、白名单等
  • 全链路跟踪:能否正常接入全链路监控
  • JWT 验证:
  • 图像界面:是否需要图形界面
  • 定制扩展性:是否方便扩展

下面分别对上述的 Ingress Controller 做简要介绍。

Kubernetes Ingress

github.com/kubernetes/ingress-nginx

Kubernetes Ingress 的官方推荐的 Ingress 控制器,

由于 Nginx 的普及使用,在将应用迁移到 K8S 后,该 Ingress 控制器是最容易上手的控制器,而且学习成本相对较低,如果你对控制器的能力要求不高,建议使用。

不过当配置文件太多的时候,Reload 是很慢的,而且

Nginx Ingress

github.com/nginxinc/kubernetes-ingress

Nginx Ingress 是 NGINX 开发的官方版本,它基于 NGINX Plus 商业版本,

相比官方控制器,它支持 TCP/UDP 的流量转发,付费版有很广泛的附加功能,主要缺点就是

Kong Ingress

github.com/Kong/kubernetes-ingress-controller

kong 在之前是专注于 API 网关,现在已经成为了成熟的 Ingress 控制器,相较于官方控制器,在路由匹配规则、upstream 探针、鉴权上做了提升,并且支持大量的模块插件,并且便与配置。

Traefik Ingress

github.com/containous/traefik

traefik Ingress 是一个功能很全面的 Ingress,官方称其为:Traefik is an Edge Router that makes publishing your services a fun and easy experience.

__

Istio Ingress

istio.io/docs/tasks/traffic-management/ingress

Istio 是 IBM,Google 和 Lyft(Envoy 的原始作者)的联合项目,它是一个全面的服务网格解决方案。它不仅可以管理所有传入的外部流量(作为 Ingress 控制器),还可以控制集群内部的所有流量。在幕后,Istio 将 Envoy 用作每种服务的辅助代理。从本质上讲,它是一个可以执行几乎所有操作的大型处理器。其中心思想是最大程度的控制,可扩展性,安全性和透明性。

__

借助 Istio Ingress,您可以微调流量路由,服务之间的访问授权,平衡,监控,金丝雀发布等.

不过社区现在更推荐使用 Ingress Gateways。

HAProxy Ingress

github.com/jcmoraisjr/haproxy-ingress

HAProxy 作为王牌的负载均衡器,在众多控制器中最大的优势还在负载均衡上。

__

APISIX Ingress

github.com/api7/ingress-controller

ApiSix Ingress 是一个新兴的 Ingress Controller,它主要对标 Kong Ingress。

下面附一张对比图:

360aaca086c33c21b6d6ec16438d0ecd MD5

图片来自腾讯云社区分享

__

这里还有一个更全的对比方案:https://docs.google.com/spreadsheets/d/1DnsHtdHbxjvHmxvlu7VhzWcWgLAn_Mc5L1WlhLDA__k/edit#gid=0

写在最后

每个控制器都有自己的优缺点,在选型的时候除了参考上面的标准外,还应考虑:

  • 技术人员的技术栈、维护能力
  • 公司业务的真实诉求

适合公司的才是最好的,一切不是为了用而用,而是因为需要而用。

参考链接:

最近更新