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/