作者张晋涛,Apache APISIX Committer、Kubernetes Ingress Nginx Reviewer,多个云原生开源项目的贡献者。
#
Apache APISIX Ingress 概览#
Apache APISIX Ingress 定义在 K8s 生态中,Ingress 作为表示 K8s 流量入口的一种资源,想要让其生效,就需要有一个 Ingress Controller 去监听 K8s 中的 Ingress 资源,并对这些资源进行相应规则的解析和实际承载流量。在当下趋势中,像 Kubernetes Ingress Nginx 就是使用最广泛的 Ingress Controller 实现。
而 APISIX Ingress 则是另一种 Ingress Controller 的实现。跟 Kubernetes Ingress Nginx 的区别主要在于 APISIX Ingress 是以 Apache APISIX 作为实际承载业务流量的数据面。如下图所示,当用户请求到具体的某一个服务/API/网页时,通过外部代理将整个业务流量/用户请求传输到 K8s 集群,然后经过 APISIX Ingress 进行后续处理。
从上图可以看到,APISIX Ingress 分成了两部分。一部分是 APISIX Ingress Controller,作为控制面它将完成配置管理与分发。另一部分 APISIX Proxy Pod 负责承载业务流量,它是通过 CRD(Custom Resource Definitions)的方式实现的。Apache APISIX Ingress 除了支持自定义资源外,还支持原生的 K8s Ingress 资源。
#
Apache APISIX 简述前边我们提到了 APISIX Ingress 是采用 Apache APISIX 作为实际承载业务流量的数据面,那么 Apache APISIX 项目又是做什么的呢?
Apache APISIX 是 Apache 基金会旗下的顶级开源项目,也是当前最活跃的开源网关项目。作为一个动态、实时、高性能的开源 API 网关,Apache APISIX 提供了负载均衡、动态上游、灰度发布、服务熔断、身份认证、可观测性等丰富的流量管理功能。
Apache APISIX 可以帮助企业快速、安全地处理 API 和微服务流量,比如限流认证、日志安全功能,以及支持丰富的自定义插件。目前也与很多开源项目如 Apache SkyWalking、Prometheus 等之类的组件进行了相关集成。
#
APISIX Ingress vs K8s Ingress Nginx因为本人同时参与到了 APISIX Ingress 与 K8s Ingress Nginx 两个项目的开发和维护,所以很多人也会问我,这两个项目做比较的话,到底该如何选择?或者说为什么有了 K8s Ingress Nginx 还要再做 APISIX Ingress。
#
配置层面在 APISIX Ingress 中,我们增加了一些丰富且灵活的配置,比如通过单个配置文件去实现灰度部署。但在 K8s Ingress Nginx 中去实现如上效果的话,最少也需要有两个 Ingress 资源文件才可以完成。
#
丰富度在丰富度上,由于 Apache APISIX 本身的自带功能丰富且允许多种插件扩展使用,所以使用 APISIX Ingress 就可以省去自己额外配置功能的繁琐步骤,可以将更多的时间投入到实际开发中。
#
架构分离APISIX Ingress 采用了数据面与控制面的分离架构,所以用户可以选择将数据面部署在 K8s 集群内部/外部。但 K8s Ingress Nginx 是将控制面和数据面放在了同一个 Pod 中,如果 Pod 或控制面出现一点闪失,整个 Pod 就会挂掉,进而影响到业务流量。
这种架构分离,给用户提供了比较方便的部署选择,同时在业务架构调整场景下,也方便进行相关数据的迁移与使用。
#
APISIX Ingress 特性详解由于 Apache APISIX 是一个全动态的高性能网关,所以在 APISIX Ingress 自身就支持了全动态,包括路由、SSL 证书、上游以及插件等等。
同时 APISIX Ingress 还具有以下特性:
- 支持 CRD,更容易理解声明式配置;同时状态检查可保证快速掌握声明配置的同步状态
- 支持高级路由匹配规则以及自定义资源,可与 Apache APISIX 官方 50 多个插件 & 客户自定义插件进行扩展使用
- 支持 K8s 原生 Ingress 配置
- 支持流量切分
- 支持 gRPC plaintext 与 TCP 4 层代理
- 服务自动注册发现,无惧扩缩容
- 更灵活的负载均衡策略,自带健康检查功能
以下我们将从 CRD 与自定义资源层面进行详细的介绍。
#
CRD 扩展在前面的介绍中我们提到了 CRD,那么 APISIX Ingress 是如何使用 CRD 扩展的?
从用户层面来看,当 Client 发起请求,到达 Apache APISIX 后,会直接把相应的业务流量传输到后端(如 Service Pod),从而完成转发过程。此过程不需要经过 Ingress Controller,这样做可以保证一旦有问题出现,或者是进行变更、扩缩容或者迁移处理等,都不会影响到用户和业务流量。
同时在配置端,用户通过 kubectl apply,可将自定义 CRD 配置应用到 K8s 集群。Ingress Controller 会持续 watch 这些资源变更,来将相应配置应用到 Apache APISIX。
#
自定义资源APISIX Ingress 目前已经支持的自定义资源主要是以下 5 类,涉及到路由、上游、消费者、证书相关和集群公共配置的相关类别。
#
APISIX Route(路由)自定义资源 APISIX Route 中 spec
属性的顶级配置是 http
。但其实 spec
是同时支持两种配置的,一种是下图示例的 spec.http
,主要用于 7 层代理;另一种是 spec.stream
,用于 4 层代理。在配置文件中,我们首先为其自定义了一项规则,即 match 下的相关参数。
如上图后端配置示例使用了同一个 Service,实际使用中大家根据场景进行调整即可。需要注意的是,weight
属性是用来配置相关 Service 权重。通过以上配置,从而实现一套完整的路由自定义资源。
#
APISIX Upstream(上游)在配置 APISIX Upstream 时,需要注意 name
的内容要与 K8s 集群的 Service 保持一致,这样可以保证后续 APISIX Ingress Controller 准确匹配其相应流量。
在配置文件中,spec.loadbalancer
主要负责负载均衡策略的设置,有多种策略模式可供选择。spec.schem
e 则是协议类型的配置,目前只支持 HTTP 和 gRPC 协议。spec.healthCheck
主要是对健康检查功能进行设置,比如设置其活跃状态、生效协议与路径和最终反馈等参数配置。
#
APISIX Consumer(消费者)在 APISIX Consumer 配置中,主要是增加了认证相关的功能,比如 spec.authParameter
,目前该配置参数支持 BasicAuth
与 KeyAuth
这两种比较常见的认证类型。
通过 value
可直接去配置相关的 username
和 password
,或者直接使用 secret
进行配置,相比前者的明文配置会更安全一些。
#
APISIX TLS(证书)APISIX TLS 主要是为了进行证书的管理。如示例所示,用户可以通过 hosts
来配置多个域名,secret
下的参数就是对应的配置证书。
同时 APISIX TLS 还配有 spec.client
,用于进行 mTLS 双向认证的配置。
#
APISIX Config 相关关于自定义资源支持的 Config 类型我们会从两个方面进行描述。
一种是 APISIX Cluster Config,它主要用于一些通用配置。目前支持在 K8s 或者 Apache APISIX 中全局使用 Prometheus 插件/全局配置 SkyWalking,后续开发中也会去增加一些其他的通用配置。
另一种就是我们现在正在 PR 中的 APISIX Plugin Config。大家如果感兴趣的话,也可以点击链接来一起参与讨论。Plugin Config 主要是将通用的插件配置统一集合在一起,比如一些同样的配置,用户就可以通过 APISIX Plugin Config 同时应用在多个路由当中,省去了额外多项独立配置的繁琐步骤。
#
APISIX Ingress 上手实践目前大家可以通过 Helm Charts 的方式来进行 APISIX Ingress 的部署。通过一条命令,就可以同时把 Apache APISIX 以及 APISIX Ingress,包括 Apache APISIX 所需要用到的 etcd 全部部署好,步骤非常简单。
#
实践场景一:流量切分通过使用 APISIX Ingress 可以实现按比例进行流量切分的效果,具体操作如下:
#
步骤一:配置 APISIX Upstream#
步骤二:配置 APISIX Route通过在 backends
中去配置 subset
和 weight
,来实现用户请求流量进入时的分流。如下图示例就是 90% 的流量会进入到 v1 中,10% 的流量进入到 v2 中。
通过以上两步,就可以十分方便地按比例进行流量切分,实现类似灰度发布等场景需求。 更多具体操作细节也可参考:Apache APISIX Ingress Controller 中的流量切分。
#
实践场景二:配置认证如果想在 APISIX Ingress 中为某些路由配置 Basic Auth,可以参考如下操作:
#
步骤一:创建 APISIX Consumer 资源如前文所提到的,可以在 APISIX Consumer 配置中增加 basicAuth
,并为其指定用户名和密码。
#
步骤二:配置 APISIX Route,增加认证相关参数在自定义资源 APISIX Route 中,通过在后端添加 authenticatio
n,将其开启并指定认证类型即可。
通过以上步骤,就可以实现使用 Consumer 去完成相关配置认证。
#
实践场景三:K8s 资源扩展正如我们在开头提到过的,APISIX Ingress 不仅支持自定义资源,还同时支持 K8s 原生的 Ingress 资源。
如上图是 K8s Ingress 资源。通常情况下如果想要在资源上做 rewrite,可以通过增加 annotation 配置属性。这样当用户携带 httpbin.org
请求时,就可以通过路径 /sample 将它重定向到 /ip。
当上述需求使用 APISIX Ingress 时,只需在 Ingress 增加一个 kubernetes.io/ingress.class: apisix
,去指定 APISIX Ingress Controller 去监听这个资源,同时通过配置 k8s.apisix.apache.org/rewrite-target: "/ip"
,就可以完成重定向到 /ip 路径。
以上示例只是目前 APISIX Ingress 对于原生 K8s Ingress 支持的一种方式,更多示例大家可以查看具体文档进行参考使用。
#
未来规划之后 APISIX Ingress 将会继续在功能与生态上进行更新,目前阶段已经完成了 APISIX Ingress 与 Cert-manager 集成,后续将逐步实现以下目标:
- 完成 Kubernetes V1.22+ 与 CRD V1 版本的适配支持(已经完成,即将在 APISIX Ingress V1.3 版本 中发布)
- 支持 Gateway API(预计在 Q4 阶段实现)
- 扩展新架构,以便于用户在不需要使用 etcd 的情况下,可以正常使用 APISIX Ingress
- 丰富产品生态,扩展 APISIX Ingress 社区
最后也希望大家能够多多地参与到项目中来,比如每两周的周三下午 2 点都会有一次 APISIX Ingress 社区会议,会跟大家同步一下当前的项目进展或者遇到的问题。大家可以持续关注 Apache APISIX 视频号,届时可以直接参与社区会议直播。
点此查看更多关于 APISIX Ingress 社区会议细节。