Kubernetes的Ingress控制器比较

Kubernetes/云计算/资源调度/Go语言
21 人赞同了该文章

翻译:https://medium.com/flant-com/comparing-ingress-controllers-for-kubernetes-9b397483b46b

注意:此比较是受kubedex.com文章的启发,该文章一直缺少我们需要的一些实际数据。请检查它以及本文结尾处列出的其他有用链接。

标准

为了进行高质量的比较并获得有用的结果,你必须对主题有一个很好的了解,但这还不是全部。你还需要一套特定的条件来设置研究载体。我们不假装分析所有可能的Kubernetes Ingress/API网关/服务网格用例,但尝试强调控制器的最常见要求。要成功完成你自己的案例,还必须研究每种情况的所有细节和特殊性。

让我们从非常普遍的功能入手,以至于所有解决方案都已实现了这些功能,因此不予考虑:

  • 开源(我们只是不想在K8s堆栈的这一级别上拥有其他选项)
  • 动态服务发现;
  • SSL终止;
  • 对WebSocket的支持。

现在,我们要进行比较:

支持的协议

这是做出选择的基本参数。常规的HTTP(S)代理足以满足您的软件要求吗?还是通过gRPC,HTTP/2.0工作?也许它还需要TCP(带有SNI)或UDP?如果您的场景是非标准的,请确保进行了仔细考虑,以免以后再配置集群。每个控制器都有其自己的一组受支持的协议。

依赖(基础软件)

控制器的核心可以有几种类型的应用程序。最受欢迎的是NGINX,Traefik,HAProxy,Envoy。通常,选择可能不会严重影响您的流量处理方式,但是了解“潜在用户”的潜在特征和习惯总是很有用的。

流量路由

将流量路由到特定服务的决定的依据是什么?通常,可以使用主机和路径,但是还有其他可能性。匹配这些值是否也支持RegEx(正则表达式)?

命名空间限制

命名空间提供了一种逻辑上分离Kubernetes中资源的方法(例如,在生产,暂存等之间)。必须在每个名称空间中分别安装Ingress控制器(它们仅允许流量进入属于该名称空间的Pod)。并且有一些(实际上是绝大多数)在整个集群中全局运行。在这种情况下,流量可以去往任何Pod,而不管其名称空间如何。

上游探针

您如何将流量定向到应用程序及其服务的正常实例?有主动和被动检查,重试,熔断器,自定义运行状况检查等解决方案。如果对可用性有严格的要求并迅速从负载平衡中删除失败的服务,则这是一个非常重要的参数。

负载均衡算法

在这里,我们有很多选择,从传统的轮询rdp-cookie等非常规的选择。粘性会话在此类别中也很常见。

认证方式

控制器支持哪些授权方案?基本,摘要,OAuth,外部身份验证...我想,你已经知道它们。如果我们为开发人员使用许多环境(层)和/或仅通过Ingress访问的私有层,则这是一个重要参数。

流量分发

控制器是否支持常用的流量分配机制,如金丝雀部署,A / B测试,镜像/阴影?对于需要精确和仔细的流量管理以进行富有成效的测试,调试生产错误且影响最小,流量分析等的应用程序,这是一个非常敏感的主题。

付费订阅

控制器是否有带扩展功能和/或技术支持的付费版本?

图形用户界面(Web UI)

有没有用于控制器配置的图形界面?对于那些希望使用便利和/或需要对Ingress的配置进行一些更改,而又希望避免使用“原始”模板的用户而言,这一点很重要。如果开发人员想“即时”测试流量,它也很有用。

JWT验证

是否有内置的JSON Web令牌验证,用于对最终应用程序的用户进行验证和验证?

定制配置

在具有允许您将自己的指令,标志等添加到标准配置模板的机制的意义上,模板具有可扩展性。

基本的DDOS保护机制

基本速率限制算法或基于地址,白名单,国家/地区等的流量过滤的更复杂的变体。

请求跟踪

能够通过OpenTracing或其他选项监视,跟踪和调试从Ingress到特定服务/容器(最好在服务/容器之间)的请求。

WAF

支持Web应用程序防火墙

Ingress控制器

控制器列表已从Kubernetes官方文档开始,并扩展了其他知名选项。但是,由于特定的性质或较低的知名度/开发的早期阶段,其中的一些被排除在外。其余内容在下面进行了检查。我们将从总体描述开始,并在最后提供摘要表。

Kubernetes Ingress控制器

Kubernetes的“官方”控制器。它是由社区开发的。您可能会从名称中猜到,它基于nginx Web服务器,并补充了一组用于实现额外功能的Lua插件。

由于NGINX的普及以及在用作控制器时对其进行的最小改动,对于处理K8的普通工程师来说,它可能是最简单,最直接的选择。

NGINX Ingress控制器

这是NGINX开发人员的官方产品,该产品也具有基于NGINX Plus的商业版本。NGINX控制器具有很高的稳定性,持续的向后兼容性,没有任何第三方模块,并且由于消除了Lua代码而保证了较高的速度(与官方控制器相比)。

即使与官方控制器相比,免费软件版本也受到很大限制(由于缺少上述Lua模块)。同时,付费版本具有相当广泛的附加功能:实时指标,JWT验证,活动的运行状况检查等。与NGINX Ingress相比,重要的优势是对TCP / UDP流量的全面支持(在社区版本中也是如此!)。主要缺点是缺乏交通分配功能,尽管这项工作似乎正在进行中

Kong

Kong Ingress由Kong Inc开发,并且有两个版本:商业版本和免费版本。Kong Ingress建立在NGINX之上,并增加了扩展其功能的Lua模块。

最初,它作为API网关专注于API请求的处理和路由。但是,到目前为止,它已成为成熟的Ingress控制器。它的主要优点是易于安装和配置的大量其他模块/插件(包括来自第三方开发人员的模块/插件)。它为多种附加功能开辟了道路。附带地,内置功能已经提供了许多可能性。使用CRD执行配置。

Kong的一个重要功能是它只能在一个环境中运行(而不是支持跨命名空间)。这是一个颇具争议的话题:有些人认为它是一个缺点(必须为每个环境生成实例),而另一些人则认为它是一项特殊功能(较高的隔离度,因此一个控制器的故障影响仅限于其环境) )。

Traefik

最初,此代理是为微服务请求及其动态环境的路由而创建的,因此具有许多有用的功能:连续更新配置(不重新启动),支持多种负载平衡算法,Web UI,指标导出,支持各种协议,REST API,Canary版本等。开箱即用的“让我们加密证书”支持是另一个不错的功能。主要缺点是,为了组织控制器的高可用性,您必须安装并连接其自己的KV存储器。

虽然许多不错的新功能(包括带有SNI的TCP / SSL,金丝雀部署和流量镜像/阴影,改进的Web UI)已经在Traefik v2.0的新版本(19年9月)中发布,但其中一些功能(例如WAF支持)已经发布还在讨论中。

19年9月,引入了来自同一开发商的另一种服务网格解决方案。它被称为Maesh,建在Traefik的顶部。

HAProxy

HAProxy是众所周知的代理服务器和负载平衡器。作为Kubernetes集群的一部分,它提供了“软”配置更新(无流量丢失),基于DNS的服务发现,通过API的动态配置。HAProxy还支持完全自定义配置文件模板(通过替换ConfigMap)以及在其中使用Spring Boot函数。通常,开发人员将重点放在已消耗资源的高速,优化和效率上。HAProxy的优点之一是大量受支持的平衡算法。

值得一提的是,在最近的(June'19)v2.0版本中出现了许多新功能,并且即将推出的v2.1有望具有更多的新功能(包括OpenTracing支持)。

Voyager

Voyager基于HAProxy,并作为通用解决方案提供,适合大量提供商使用。它的显着特点包括L7和L4流量均衡。通过一切手段,航海者TCP L4流量平衡可能被称为该解决方案的主要特点之一。

虽然完整的HTTP / 2和GRPC协议的支持已经在今年早些时候出现(与V9.0.0版本),为支持证书管理的(支持让的加密证书)可能是从那时起集成在航海最新的突出特点。

Contour

Contour不仅基于Envoy,而且还与该流行代理的作者共同开发。通过特殊的CRD(称为IngressRoute的新API)管理Ingress资源的能力是其特殊功能。对于具有多个开发团队并发使用一个集群的组织,这有助于保护相邻环境中的流量并保护它们免受Ingress资源更改时产生的错误的影响。

它还提供了一组扩展的平衡算法(镜像,自动重复,限制请求率等等),详细的流量和故障监控。对于某些人来说,也许缺少对粘性会议的支持将是一个严重的缺陷(朝这个方向的持续努力已经走了很长一段路)。

Istio

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

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

这里是学习Istio的精彩介绍:“ 使用Istio返回微服务 ”。

Ambassador

大使是另一个基于特使的解决方案。它有免费和商业版本。大使被描述为“微服务的Kubernetes原生API网关”,它带来了相应的好处-例如与K8s原语的紧密集成。它具有Ingress控制器所期望的功能,也可以与各种服务网格解决方案(Consul,Linkerd,Istio)一起使用。

顺便说一下,大使工程师最近发布了他们的基准测试结果,比较了Envoy(如Ambassador Pro),HAProxy和NGINX(如社区的官方Kubernetes Ingress)的性能。

Gloo

Gloo是在Envoy之上构建的新软件(于18年3月发布),被称为“功能网关”,因为其作者坚持认为“网关应从功能而非服务中构建API 。”其“功能级路由”的意思是它可用于为后端为微服务,无服务器功能和/或旧版应用程序实现的混合应用程序路由流量。

Gloo具有可插拔的体系结构,可提供您可能期望的大多数功能,但是其中一些功能仅在其商业版本(Gloo Enterprise)中可用。它的文档说明了如何轻松地将它与Linkerd&Istio等服务网格解决方案集成。

Skipper

Skipper是HTTP路由器和反向代理,因此不支持多种协议(例如,添加gRPC时没有热情)。从技术上讲,它使用Endpoints API(而不是Kubernetes Services)将流量路由到Pod。它的巨大优势是通过其丰富的过滤器集可以创建,更新和删除所有HTTP数据的高级HTTP路由功能。船长的路由规则可以在不停机的情况下进行更新。正如Skipper的作者所言,它可以很好地与其他解决方案一起使用,例如提供其他功能的AWS ELB(与其他Ingress解决方案相比)。

这是 Skipper与它的作者(Zalando)制作的其他Kubernetes Ingress控制器的比较

其他注意事项

在这里有Traefik和Istio时,您可能会注意到缺少另一个流行的服务网格解决方案-Linkerd。不列出原因如下:

为简单起见,Linkerd不提供其自己的入口控制器。相反,Linkerd旨在与您选择的入口控制器一起使用。

比较表

本文的结尾是这个巨大的摘要表:

您可以单击它以进行更详细的查看。该表还提供Google表格格式。

摘要

本文的目的是提供对每种特定情况下可以完成的操作的更完整的理解(尽管一点也不详尽!)。通常,每个控制器都有其优点和缺点。

Kubernetes官方Ingress易于使用,成熟,并提供了足以满足大多数情况的出色功能。如果对可靠性和功能实现的质量有很高的要求,则应注意基于NGINX Plus的Ingress商业版本。Kong拥有最丰富的插件集(以及它们提供的机会),并且在其商业版本中提供了更多功能,它还拥有基于自定义资源的动态配置。

看看Traefik和HAProxy的如果有增加了平衡和授权方法的要求。它们是开源项目,多年来证明了自己的功能,非常稳定且不断发展。Contour已经存在了两年,但它看起来仍然很年轻,并且主要具有Envoy之上的基本功能。如果您需要在应用程序前面安装WAF,请注意Kubernetes或HAProxy使用的旧Ingress。

基于Envoy的产品具有最丰富的功能集(尤其是Istio)。这是一个复杂的解决方案,“几乎可以做任何事。”顺便说一句,这意味着需要更广泛的相关经验来配置/运行/操作它们。在某些其他情况下(Gloo),其许多功能可能仅在付费版本中提供。如果您的应用程序需要高级或经常更改的HTTP路由表,那么Skipper可能是一个很好的解决方案。

如果我们谈论什么全球K8S社区选择的发展趋势,Istio和Traefik的优势是显而易见的 - 甚至是“官方” Kubernetes入口是明显落后的时候,我们比较的GitHub星(25000+,几乎对20000小于6000相应)。Kong Ingress和HAProxy Ingress位于相对数量最少的恒星(小于1000)。

其他要参考的文章/评论

如果您选择Ingress解决方案,以下是一些其他文章可能会有用:

转自:https://zhuanlan.zhihu.com/p/87735361

【转】Kubernetes的Ingress控制器比较的更多相关文章

  1. 干货分享:如何使用Kubernetes的Ingress API

    您可以通过使用诸如Kong for Kubernetes的Ingress控制器(使用自定义资源定义并提供许多插件)来极大地扩展Ingress资源的功能. Kubernetes正在整个技术行业中得到采用 ...

  2. Kubernetes:Ingress总结(一)

    Blog:博客园 个人 参考:Ingress | Kubernetes.<Kubernetes进阶实战>.<Kubernetes网络权威指南 > 何谓Ingress?从字面意思 ...

  3. kubernetes系列09—Ingress控制器详解

    本文收录在容器技术学习系列文章总目录 1.认识Ingress 1.1 什么是Ingress? 通常情况下,service和pod仅可在集群内部网络中通过IP地址访问.所有到达边界路由器的流量或被丢弃或 ...

  4. kubernetes 学习 ingress

    ingress是Kubernetes 暴露服务的一种方式. Ingress由两部分组成:Ingress Controller 和 Ingress 服务.     Ingress Contronler ...

  5. [转帖]K8s 工程师必懂的 10 种 Ingress 控制器

    K8s 工程师必懂的 10 种 Ingress 控制器 https://www.kubernetes.org.cn/5948.html 控制器有好多啊. 2019-10-18 23:07 中文社区 分 ...

  6. 08 . Kubernetes之 ingress及Ingress Controller

    Ingress简介 ingress是什么? 上篇文章介绍service时有说了暴露了service的三种方式ClusterIP.NodePort与LoadBalance,这几种方式都是在service ...

  7. Kubernetes之Ingress

    在Service篇里面介绍了像集群外部的客户端公开服务的两种方法,还有另一种方法---创建Ingress资源. 定义Ingress (名词)-进入或进入的行为;进入的权利;进入的手段或地点;入口. 接 ...

  8. NGINX Ingress控制器1.0.0升级迁移文档(翻译)

    Ingress 是什么 Ingress 是对k8s集群中服务的外部访问进行管理的 API 对象,典型的访问方式是 HTTP. Ingress 可以提供负载均衡.SSL 终结和基于名称的虚拟托管. 最近 ...

  9. Kubernetes:Ingress总结(二)

    Blog:博客园 个人 参考:Ingress | Kubernetes.<Kubernetes进阶实战> Contour是Kubernetes Ingress控制器的另一款开源实现,它以高 ...

随机推荐

  1. 使用Jenkins的Git Parameter插件来从远程仓库拉取指定目录的内容

    更换插件安装源 系统管理---插件管理---高级---升级站点,把默认的插件下载地址换成下面这个: https://mirrors.tuna.tsinghua.edu.cn/jenkins/updat ...

  2. .Net DLL类库引用时没有注释信息

    自己编写的类库提供给别人引用时,别人获取不到DLL内部的方法.变量的注释信息,无法了解内部情况和使用方法. 原因:没有随DLL类库一同输出注释文档 解决方案: 在VS界面中选中提供给别人的类库项目 在 ...

  3. 自定义标签之inclusion_tag

    1.在当前app下创建templatetags文件夹 2.在templatetags文件夹下面创建自定义的mytag.py文件 3.在mytag.py文件中的代码 from django.templa ...

  4. IO模型之AIO代码及其实践详解

    一.AIO简介 AIO是java中IO模型的一种,作为NIO的改进和增强随JDK1.7版本更新被集成在JDK的nio包中,因此AIO也被称作是NIO2.0.区别于传统的BIO(Blocking IO, ...

  5. 记录java+testng运行selenium(三)---xml、ini、excel、日志等配置

    一: ini文件 ini目前只用处存储浏览类型及需要打开的url,ini文件放在configs文件夹下面. 读取ini代码如下: package toolskit.documents; import ...

  6. JS函数篇【2】

    什么是函数 函数的作用,可以写一次代码,然后反复地重用这个代码. <h3 onload="add2(1,2,3);add3(4,5,6)"></h3> &l ...

  7. PAT基础级-钻石段位样卷2-7-7 危险品装箱 (25 分)

    集装箱运输货物时,我们必须特别小心,不能把不相容的货物装在一只箱子里.比如氧化剂绝对不能跟易燃液体同箱,否则很容易造成爆炸. 本题给定一张不相容物品的清单,需要你检查每一张集装箱货品清单,判断它们是否 ...

  8. ES6 解构赋值详解

    解构赋值是对赋值运算符的扩展,可以将属性/值从对象/数组中取出,赋值给其他变量. 一.数组的解构赋值 1.基本用法 只要等号两边的模式相同,左边的变量就会被赋予对应的值. let [a, [[b], ...

  9. k8s的etcd

    etcd是一个高可用的分布式键值(key-value)数据库.etcd内部采用raft协议作为一致性算法,etcd基于Go语言实现. etcd是一个服务发现系统,具备以下的特点: 简单:安装配置简单, ...

  10. puppeteer报错 UnhandledPromiseRejectionWarning: Error: Protocol error (Page.getLayoutMetrics): Target closed.

    puppeteer运行时报错: UnhandledPromiseRejectionWarning: Error: Protocol error (Page.getLayoutMetrics): Tar ...