今天就跟大家聊聊有关如何进行Kubernetes Ingress控制器的技术选型,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
导语:在Kubernetes的实践、部署中,为了解决 Pod 迁移、Node Pod 端口、域名动态分配等问题,需要开发人员选择合适的 Ingress 解决方案。面对市场上众多Ingress产品,开发者该如何分辨它们的优缺点?又该如何结合自身的技术栈选择合适的技术方案呢?在本文中,腾讯云中间件核心研发工程师厉辉将为你介绍如何进行Kubernates Ingress 控制器的技术选型。
阅读下文需要熟悉以下基本概念:
Kubernetes 的外部访问方式
在 Kubernetes 中,服务跟 Pod IP 主要供服务在集群内访问使用,对于集群外的应用是不可见的。怎么解决这个问题呢?为了让外部的应用能够访问 Kubernetes 集群中的服务,通常解决办法是 NodePort 和 LoadBalancer。
在Kubernetes的实践、部署中,为了解决像 Pod 迁移、Node Pod 端口、域名动态分配,或者是 Pod 后台地址动态更新这种问题,就产生了 Ingress 解决方案
Ingress 是Kubernetes中非常重要的外网流量入口。在Kubernetes中所推荐的默认值为Nginx Ingress,为了与后面Nginx 提供的商业版 Ingress 区分开来,我就称它为Kubernetes Ingress。
Kubernetes Ingress,顾名思义基于 Nginx 的平台,Nginx 现在是世界上最流行的 Nginx HTTP Sever,相信大家都对 Nginx 也比较熟悉,这是一个优点。它还有一个优点是 Nginx Ingress 接入 Kubernetes 集群所需的配置非常少,而且有很多文档来指引你如何使用它。这对于大部分刚接触 Kubernetes 的人或者创业公司来说,Nginx Ingress 的确是一个非常好的选择。
但是当 Nginx Ingress 在一些大环境上使用时,就会出现很多问题:
既然发现了 Nginx Ingress 有很多问题,那是不是考虑选择其他开源的、更好用的 Ingress?市场上比 Kubernetes Ingress 好用的Ingress起码有十几家,那么如何从这么多 Ingress 中选择适合自己的呢?
Ingress 自身是基于 HTTP 网关的,市面上 HTTP 网关主要有这么几种:Nginx、Golang 原生的网关,以及新崛起的 Envoy 。但是每个开发人员所擅长的技术栈不同,所以适合的 Ingress 也会不一样。
那么问题来了,我们如何选择一个更加好用的 Ingress 呢?或者缩小点范围,熟悉 Nginx 或 OpenResty 的开发人员,应该选择哪一个 Ingress 呢?
下面来介绍一下我对 Ingress 控制器选型的一些经验。
1.基本特点
前面有提到,每个人擅长的技术平台不一样,所以选择自己更加熟悉的 HTTP 网关也显得至关重要。比如 Nginx、HAProxy、Envoy 或者是 Golang 原生网关。因为你熟悉它的原理,在使用中可以实现快速落地。
抛开上述两点,就是公司业务对网关的特殊需求。你选择一个开源产品,最好肯定是开箱能用的。比如你需要 GRPC 协议转换的能力,那当然希望选的网关具备这样的功能。这里简单列一下影响选择的因素:
相比Kubernetes Ingress,我个人更推荐 APISIX 作为Ingress controller。虽然它在功能上比 Kong 会少很多,但是 APISIX 很好的路由能力、灵活的插件能力,以及本身的高性能,能够弥补在 Ingress 选型上的一些缺点。对于基于 Nginx 或 Openresty 开发的程序员,如果对现在的 Ingress 不满意,我推荐你们去使用 APISIX 作为 Ingress。
如何将 APISIX 作为 Ingress 呢?我们首先要做出一个区分,Ingress 是 Kubernetes 名称的定义或者规则定义,Ingress controller 是将 Kubernetes 集群状态同步到网关的一个组件。但 APISIX 本身只是 API 网关,怎么把 APISIX 实现成 Ingress controller 呢?我们先来简要了解一下如何实现 Ingress。
如果实现了第二部分,通过 Kubernetes Ingress 的配置,便可以很快的产生 APISIX。通过 APISIX Ingress controller 就可以产生 APISIX 相关的配置。当前为了快速的将 APISIX 落地为能够支持 Kubernetes 的 Ingress ,我们创建了一个开源项目,叫 Ingress Controller。
ingress controller 架构图
上图为Ingress controller 项目的整体架构图。左边部分为 Kubernetes 集群,这里可以导入一些 yaml 文件,对 Kubernetes 的配置进行变更。右边部分则是 APISIX 集群,以及它的控制面和数据面。从架构图中可以看出,APISIX Ingress 充当了 Kubernetes 集群以及 APISIX 集群之间的连接者。它主要负责监听 Kubernetes 集群中节点的变化,将集群中的状态同步到 APISIX 集群。另外,由于Kubernetes 倡导所有组件都要具备高可用的特性,所以在 APISIX Ingress 设计之初,我们通过双节点或多节点的模式来保证 APISIX Ingress Controller 的保障高可用。
各类 Ingress 横向对比
相对于市面上流行的 Ingress 控制器,我们简单对比来看看 APISIX ingress 有什么优缺点。上图是外国开发人员针对 Kubernetes Ingress 选型做的一张表格。我在原来表格的基础上,结合自己的理解,将 APISIX Ingress 的功能加入了进来。我们可以看到,最左边的是APISIX,后边就是 Kubernetes Ingress 和 Kong Ingress,后面的 Traefik,就是基于 Golang 的 Ingress。HAproxy 是比较常见的,过去是比较流行的负载均衡器。Istio 和 Ambassador 是国外非常流行的两个Ingress。接下来我们总结下这些 Ingress各自的优缺点:
APISIX Ingress:APISIX Ingress 的优点前面也提到了,它具有非常强大的路由能力、灵活的插件拓展能力,在性能上表现也非常优秀。同时,它的缺点也非常明显,尽管APISIX开源后有非常多的功能,但是缺少落地案例,没有相关的文档指引大家如何使用这些功能。
Kubernetes Ingress:即 Kubernetes 推荐默认使用的 Nginx Ingress。它的主要优点为简单、易接入。缺点是Nginx reload耗时长的问题根本无法解决。另外,虽然可用插件很多,但插件扩展能力非常弱。
Nginx Ingress:主要优点是在于它完全支持 TCP 和 UDP 协议,但是缺失了鉴权方式、流量调度等其他功能。
Kong:其本身就是一个 API 网关,它也算是开创了先河,将 API 网关引入到 Kubernetes 中当 Ingress。另外相对边缘网关,Kong 在鉴权、限流、灰度部署等方面做得非常好。Kong Ingress 还有一个很大的优点:提供了一些 API、服务的定义,可以抽象成 Kubernetes 的 CRD,通过K8S Ingress 配置便可完成同步状态至 Kong 集群。缺点就是部署特别困难,另外在高可用方面,与 APISIX 相比也是相形见绌。
Traefik :基于 Golang 的 Ingress,它本身是一个微服务网关,在 Ingress 的场景应用比较多。他的主要平台基于 Golang,自身支持的协议也非常多,总体来说是没有什么缺点。如果大家熟悉 Golang 的话,也推荐一用。
HAproxy:是一个久负盛名的负载均衡器。它主要优点是具有非常强大的负载均衡能力,其他方面并不占优势。
Istio Ingress 和 Ambassador Ingress 都是基于非常流行的 Envoy。说实话,我认为这两个 Ingress 没有什么缺点,可能唯一的缺点是他们基于 Envoy 平台,大家对这个平台都不是很熟悉,上手门槛会比较高。
看完上述内容,你们对如何进行Kubernetes Ingress控制器的技术选型有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。