APISIX是什么?
Apache APISIX 是一个动态、实时、高性能的 API 网关, 提供负载均衡、动态上游、灰度发布、服务熔断、身份认证、可观测性等丰富的流量管理功能。
你可以使用 Apache APISIX 来处理传统的南北向流量,以及服务间的东西向流量, 也可以当做 k8s ingress controller 来使用。
Apache APISIX 的技术架构如下图所示:
APISIX比NGINX的优势有哪些?
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 灰度方案,但有三个问题比较突出:
- annotation 必须在 yaml 文件级别定义,这意味着每次需要调整权重就必须创建一个 yaml 配置文件。
- canary annotations 之间存在优先级,只能按照既定优先级配置,限制了灵活性。
- 如果后端服务数量大于两个,再想通过权重分配流量将变得十分困难。
APISIX的特性
你可以把 Apache APISIX 当做流量入口,来处理所有的业务数据,包括动态路由、动态上游、动态证书、 A/B 测试、金丝雀发布(灰度发布)、蓝绿部署、限流限速、抵御恶意攻击、监控报警、服务可观测性、服务治理等。
- 全平台
- 云原生: 平台无关,没有供应商锁定,无论裸机还是 Kubernetes,APISIX 都可以运行。
- 运行环境: OpenResty 和 Tengine 都支持。
- 支持 ARM64: 不用担心底层技术的锁定。
- 多协议
- TCP/UDP 代理: 动态 TCP/UDP 代理。
- Dubbo 代理: 动态代理 HTTP 请求到 Dubbo 后端。
- 动态 MQTT 代理: 支持用
client_id
对 MQTT 进行负载均衡,同时支持 MQTT 3.1.* 和 5.0 两个协议标准。 - gRPC 代理:通过 APISIX 代理 gRPC 连接,并使用 APISIX 的大部分特性管理你的 gRPC 服务。
- gRPC 协议转换:支持协议的转换,这样客户端可以通过 HTTP/JSON 来访问你的 gRPC API。
- Websocket 代理
- Proxy Protocol
- Dubbo 代理:基于 Tengine,可以实现 Dubbo 请求的代理。
- HTTP(S) 反向代理
- SSL:动态加载 SSL 证书。
- 全动态能力
- 热更新和热插件: 无需重启服务,就可以持续更新配置和插件。
- 代理请求重写: 支持重写请求上游的
host
、uri
、schema
、enable_websocket
、headers
信息。 - 输出内容重写: 支持自定义修改返回内容的
status code
、body
、headers
。 - Serverless: 在 APISIX 的每一个阶段,你都可以添加并调用自己编写的函数。
- 动态负载均衡:动态支持有权重的 round-robin 负载平衡。
- 支持一致性 hash 的负载均衡:动态支持一致性 hash 的负载均衡。
- 健康检查:启用上游节点的健康检查,将在负载均衡期间自动过滤不健康的节点,以确保系统稳定性。
- 熔断器: 智能跟踪不健康上游服务。
- 代理镜像: 提供镜像客户端请求的能力。
- 流量拆分: 允许用户逐步控制各个上游之间的流量百分比。
- 精细化路由
- 支持全路径匹配和前缀匹配
- 支持使用 Nginx 所有内置变量做为路由的条件,所以你可以使用
cookie
,args
等做为路由的条件,来实现灰度发布、A/B 测试等功能 - 支持各类操作符做为路由的判断条件,比如
{"arg_age", ">", 24}
- 支持自定义路由匹配函数
- IPv6:支持使用 IPv6 格式匹配路由
- 支持路由的自动过期(TTL)
- 支持路由的优先级
- 支持批量 Http 请求
- 安全防护
- 运维友好
- OpenTracing 可观测性: 支持 Apache Skywalking 和 Zipkin。
- 对接外部服务发现:除了内置的 etcd 外,还支持
Consul
和Nacos
的 DNS 发现模式,以及 Eureka。 - 监控和指标: Prometheus
- 集群:APISIX 节点是无状态的,创建配置中心集群请参考 etcd Clustering Guide。
- 高可用:支持配置同一个集群内的多个 etcd 地址。
- 控制台: 操作 APISIX 集群。
- 版本控制:支持操作的多次回滚。
- CLI: 使用命令行来启动、关闭和重启 APISIX。
- 单机模式: 支持从本地配置文件中加载路由规则,在 kubernetes(k8s) 等环境下更友好。
- 全局规则:允许对所有请求执行插件,比如黑白名单、限流限速等。
- 高性能:在单核上 QPS 可以达到 18k,同时延迟只有 0.2 毫秒。
- 故障注入
- REST Admin API: 使用 REST Admin API 来控制 Apache APISIX,默认只允许 127.0.0.1 访问,你可以修改
conf/config.yaml
中的allow_admin
字段,指定允许调用 Admin API 的 IP 列表。同时需要注意的是,Admin API 使用 key auth 来校验调用者身份,在部署前需要修改conf/config.yaml
中的admin_key
字段,来保证安全。 - 外部日志记录器:将访问日志导出到外部日志管理工具。(HTTP Logger, TCP Logger, Kafka Logger, UDP Logger)
- Helm charts
- 高度可扩展
- 自定义插件: 允许挂载常见阶段,例如
init
,rewrite
,access
,balancer
,header filer
,body filter
和log
阶段。 - 自定义负载均衡算法:可以在
balancer
阶段使用自定义负载均衡算法。 - 自定义路由: 支持用户自己实现路由算法。
- 自定义插件: 允许挂载常见阶段,例如
apisix-ingress-controller
Apache APISIX Ingress Controller 可以替换 NGINX Ingress Controller,使用更为便捷的配置方式,动态的调整网关配置。无需 reload nginx,配置实时生效。
典型应用场景如下图所示。
Apache APISIX Ingress 对外提供访问Kubernetes集群的入口,用户通过外部负载均衡器访问到 Apache APISIX Ingress。流量经过 Apache APISIX 路由规则,分发到目标上游服务。
内部支持通过Kubernetes service 或者Kubernetes pod IP + Port 的方式访问上游服务,Apache APISIX Ingress Controller 集成Kubernetes,实现服务自动注册和发现,实时同步Kubernetes状态变更。
得益于 Apache APISIX 丰富的插件支持,可以通过绑定插件,轻松扩展 Ingress 的能力。比如,限流、熔断、灰度发布、跨域、用量管控、健康检查等。
甚至可以自定义插件,满足特殊业务场景。比如,配合 Apache APISIX Ingress Controller 的服务发现机制,实现自定义的负载均衡能力。
使用
待续……
参考文档: