云原生时代,Ingress 作为Kubernetes集群中服务的入口,已经被大家所接受。除了Kubernetes默认的NGINX Ingress Controller(基于原生 NGINX)之外, 业界也有不少其他第三方的 Ingress Controller 的实现。Apache APISIX作为国内最快毕业的 Apache 顶级项目,实现了Apache APISIX Ingress Controller,为Kubernetes用户提供了功能更为便捷的 Ingress 实现。
Apache APISIX Ingress Controller 现在作为 Apache APISIX 子项目正式捐献到Apache Software Foundation(以下简称 ASF),与社区共同成长。
Ingress 是访问Kubernetes集群的入口,流量按 Ingress 资源指定的规则分发到集群内部的上游服务。
下面是一个示意图,客户端通过 Ingress 对外暴露的服务地址进行访问,流量在 Ingress 内部经过规则匹配,最后分发到对应的 service 上。
可以发现,Ingress 充当了 Kubernetes 集群入口网关的角色。
图片
Kubernetes 默认的 Ingress 是基于 NGINX 实现的。NGINX Ingress Controller 帮助维护了 Kubernetes 集群与 NGINX 的状态同步,并且提供了基本的反向代理能力。
Apache APISIX Ingress Controller 基于 Apache APISIX, 集成Kubernetes的集群管理能力,支持使用 YAML 申明的方式动态配置入口流量的分发规则,绑定插件,并且支持服务发现、配置校验等能力。Apache APISIX Ingress Controller 将配置写入 Apache APISIX,由 Apache APISIX 承载业务流量。
Apache APISIX Ingress Controller 除了覆盖 NGINX Ingress Controller 已有的能力外,还解决了一些 Nginx Ingress Controller 的痛点。
1、动态加载配置,不再需要 reload
Ingress Controller 承载着服务的入口流量,在生产环境中,对可靠性有更高的要求。
NGINX Ingress Controller 将 YAML 配置文件转换为 nginx.conf,再触发 reload 使配置生效。生产环境中这是不能接受的,尤其在边缘流量采用⻓连接时,更容易导致事故。
Apache APISIX Ingress Controller 支持动态配置,即时生效。降低生产事故的风险,提高了运维可操作性。
2、强大的扩展能力
基于 Apache APISIX 强大的插件能力,Apache APISIX Ingress Controller 通过动态绑定插件来增强功能。
而 NGINX Ingress Controller 通过在 annotation 中增加大量的脚本片段来扩展 NGINX 的能力。这样的做法非常不易管理,生产环境中大量的脚本给运维人员带来极大困扰,极少的校验手段,也让每次改动都非常容易出错。
Apache APISIX 通过插件封装逻辑,易于管理;完善的文档,易于使用和理解。Apache APISIX Ingress Controller 通过配置即可绑定和解绑插件,无需操作脚本。
3、方便易用的灰度能力
业务服务常常需要调整权重,按比例控制流量。
Apache APISIX Ingress Controller 可以支持 service和 pod 级别的权重调整,配置清晰而且可读性更强。
在 NGINX Ingress Controller 中通过 annotation 的方式提供 canary 灰度方案,但有三个问题比较突出:
Apache APISIX Ingress Controller 可以替换 NGINX Ingress Controller,使用更为便捷的配置方式,动态的调整网关配置。无需 reload nginx,配置实时生效。
典型应用场景如下图所示。
图片
Apache APISIX Ingress 对外提供访问Kubernetes集群的入口,用户通过外部负载均衡器访问到 Apache APISIX Ingress。流量经过 Apache APISIX 路由规则,分发到目标上游服务。
内部支持通过Kubernetesservice 或者Kubernetespod IP + Port 的方式访问上游服务,Apache APISIX Ingress Controller 集成Kubernetes,实现服务自动注册和发现,实时同步Kubernetes状态变更。
得益于 Apache APISIX 丰富的插件支持,可以通过绑定插件,轻松扩展 Ingress 的能力。比如,限流、熔断、灰度发布、跨域、用量管控、健康检查等。
甚至可以自定义插件,满足特殊业务场景。比如,配合 Apache APISIX Ingress Controller 的服务发现机制,实现自定义的负载均衡能力。
一个简单的示例,通过 ApisixRoute 定义一个路由,指向端口是 8080 的上游服务。
apiVersion: apisix.apache.org/v1
kind: ApisixRoute
metadata:
name: foo-route
spec:
rules:
- host: foo.apisix.apache.org
http:
paths:
- backend:
serviceName: foo
servicePort: 8080
path: /hello*
当访问 foo.apisix.apache.org/hello 时,Apache APISIX Ingress 将会把请求转发到上游 foo 服务。
再来加个 proxy-rewrite 插件,实现转发给上游服务的同时修改 host 和 uri。
piVersion: apisix.apache.org/v1
kind: ApisixRoute
metadata:
name: foo-route
spec:
rules:
- host: foo.apisix.apache.org
http:
paths:
- backend:
serviceName: foo
servicePort: 8080
path: /hello*
plugins:
- enable: true
name: proxy-rewrite
config:
regex_uri:
- '^/(.*)'
- '/extend/$1'
scheme: http
host: foo-beta.apisix.apache.org
更多使用方法请关注https://github.com/apache/apisix-ingress-controller。
接下来,Apache APISIX Ingress Controller 将翻开新的篇章,在保证现有功能的稳定迭代的同时,后续也将支持 VM cluster 的部署方式,主要规划如下:
ApisixSSL
CRD and the logic.#52更多细节请关注项目issue。