0%

K8S Ingress 方案选型

ingress 产生背景:

由于 Pod 可能在任何时刻出现在任何节点上, 所以Pod IP 肯定会动态变化。

那么如何把这个动态的 Pod IP 暴露出去? Kubernetes 的 Service 机制就是用于解决此问题,Service 以 label 的形式选定一组带有指定label的 Pod,并监控和自动负载它们的 Pod IP,那么向外只暴露 Service IP 即可.

Ingress 就是配置各种域名找到对应那个 Service。

参考: https://mritd.me/2017/03/04/how-to-use-nginx-ingress/

ingress 组件对比

组件 ingress-nginx(官方) Kong Ingress traefik Voyager istio ingress
最新版本 v0.25 v0.5 v2.0 beta, v1.7.12 release v10.0 v1.2
动态服务发现 static(有生成器) static dynamic dynamic dynamic
支持协议 http, https, tcp, udp, grpc http, https http, https, grpc http, https, tcp http,https, grpc
base on nginx nginx + lua traefik (Go) haproxy+GO envoy
LB 策略 rr, least_conn, ip_hash rr rr, wrr rr rr, least_conn, random

Benchmarks

组件名 QPS 平均响应时间 总请求数 连接数 持续时间
traefik 28392 91.72ms 1705073 1000 1分钟
nginx 33591 101.25ms 2018427 1000 1分钟

traefik 性能达到 nginx 的85%

数据来源: https://docs.traefik.cn/benchmarks

ingress 组件特征对比

1. ingress-nginx特征

官方的ingress。安全、简单可靠。

支持http、https, tcp, udp和ssl termination。

负载均衡选项以及强大的路由,websocket支持,基础身份认证和追踪。

没有动态服务发现有点遗憾。有个配置生成器可以自动生成但还是不太完美。

2. Kong 特征

  • 入口路由:使用Ingress资源配置Kong

  • 运行状况检查和负载平衡:跨容器负载平衡请求,并支持主动和被动运行状况检查。

  • 配置插件:当请求代理到您的服务时,执行自定义代码。

  • 请求/响应转换:使用插件即时修改您的请求/响应。

  • 身份验证:使用身份验证插件保护您的服务。

  • Kong的声明性配置使用Kubernetes中的CRD配置所有Kong并以声明方式管理Kong

    它有扩展插件系统使它的功能远远超出了正常ingress该有的功能。

3. Traefik特性:

  • 无需安装其他依赖,通过Go语言编写的单一可执行文件
  • 支持 Rest API
  • 多种后台支持:Docker, Swarm, Kubernetes, Marathon, Mesos, Consul, Etcd, 并且还会更多
  • 后台监控, 可以监听后台变化进而自动化应用新的配置文件设置
  • 配置文件热更新。无需重启进程
  • 正常结束http连接
  • 后端断路器
  • 轮询,rebalancer 负载均衡
  • Rest Metrics
  • 支持最小化 官方 docker 镜像
  • 后台支持SSL
  • 前台支持SSL(包括SNI)
  • 清爽的AngularJS前端页面
  • 支持Websocket
  • 支持HTTP/2
  • 网络错误重试
  • 支持Let’s Encrypt (自动更新HTTPS证书)
  • 高可用集群模式

4. Voyager特性:

Voyager是一个构建于HAProxy之上的Ingress。由 AppsCode 开发的用于Kubernetes的L7和L4负载均衡。支持高可用性,会话,名称和基于path的虚拟主机。

文档资料比较少。参考:https://appscode.com/products/voyager/

5. Istio Ingress

如果您已经在运行Istio,那么这可能是一个很好的默认选择。它具有Ambassador拥有的一些更现代的功能。它也有故障注入,看起来可能很有趣。然而,Istio目前在这个领域做了很多工作,并且已经从Ingress转向Gateway。因此,如果您正在寻找每5秒钟没有发生变化的Ingress,您可能仍然需要考虑Ambassador。

插件机制对比

1.Traefik

Traefik 提供多种不同的中间件, 有些可以修改请求,标题,有些负责重定向,有些可以添加身份验证等等。这些中间件用于将请求发送到服务之前调整请求。

注:目前中间件都是由官方提供, 文档中未提供自定义中间件方法。

原理图:

有关auth的中间件目前提供了3种, 分别是:BasicAuth,DigestAuth,ForwardAuth。

其中 ForwardAuth 中间件可以将身份验证委派给外部自定义服务处理。如果自定义服务响应代码是2XX,则授予访问权限并执行原始请求。否则,返回自定义服务的响应。

原理图:

2.kong

Kong是围绕可扩展的插件架构设计的,并且已经捆绑了各种各样的插件。这些插件可用于修改请求/响应或对流量施加限制。
下图显示了KongPlugin资源如何链接到Ingress / Service或KongConsumer。

3.Voyager

官方文档未找到插件机制相关资料.

4.ingress-nginx

官方文档未找到插件机制相关资料.

对比 Traefik 和 kong ingress 的插件机制:

kong ingress 提供最大程度的定制化,可使用自定义插件修改请求/响应或对流量施加限制。 针对认证鉴权的需求, 可使用”Custom Resource Definitions”中的KongCredential做认证(需做一定修改以适用我们的需求)。

Traefik 本身有类似的插件机制, 但只提供官方插件,未提供自定义插件接入的方法(可通过查看源码了解中间件接入机制)。 针对认证鉴权的需求,可使用 ForwardAuth 插件转发到我们自定义的AuthServer来做。

备注:

ingress-nginx虽然没提供插件机制, 但针对Auth提供了4种方案:

  • Basic Authentication
  • Client Certificate Authentication
  • External Basic Authentication
  • External OAUTH Authentication

参考: https://kubernetes.github.io/ingress-nginx/examples/auth/oauth-external-auth/