Kubernetes 中部署 Apache APISIX 可以将其强大的 API 网关能力无缝融入云原生环境。下面我将详细解析其功能、部署方案、优势以及核心概念。
一、APISIX 在 K8s 中的核心价值:为什么选择它?
APISIX 在 K8s 中不仅仅是简单的入口路由,它作为一个全动态、高性能的 API 网关和处理平台,弥补了原生 Ingress Controller 的诸多短板:
特性 | K8s 原生 Ingress / 普通 Nginx Ingress Controller | Apache APISIX on K8s |
---|---|---|
动态更新 | 需要 Reload Nginx,可能导致流量中断和性能抖动。 | 绝对热更新。所有配置(路由、证书、插件)通过 etcd 实时生效,无需重启或 reload 任何 worker 进程。 |
性能 | 基于 Lua 的扩展(如 OpenResty)性能不错,但 Reload 是瓶颈。 | 极致性能。基于 etcd 监听变化,纯 C 语言写的插件运行在高性能 radixtree 路由匹配中。 |
可扩展性 | 扩展需要修改 Controller 代码或配置模板,复杂度高。 | 插件化架构。拥有80+ 官方插件(认证、安全、流量控制、可观测性、日志等),可动态启用/禁用,也支持自定义 Lua 或 Java 插件。 |
服务发现 | 主要依赖 K8s Endpoints API,与 K8s 服务绑定紧密。 | 支持多服务注册中心。除了原生 K8s Service,还支持 Nacos、Eureka、Consul 等,轻松实现跨集群、混合云的服务发现。 |
配置管理 | 配置通常写在 Ingress YAML 中,与业务服务耦合。 | 解耦。网关配置(路由、插件)由独立的 ApisixRoute 等 CRD 管理,更清晰,权限分离。 |
总结:如果你需要的是一个功能强大、性能极致、无需重启、能应对复杂路由和流量治理场景的云原生 API 网关,而不仅仅是一个基本的反向代理,那么 APISIX 是 K8s 环境的绝佳选择。
二、核心架构与工作原理
在 K8s 中部署 APISIX 通常采用以下架构,其数据平面和控制平面的交互如下图所示:
flowchart TD
A[管理员/DevOps] -->|1. 声明路由/插件规则| B[Kubectl Apply<br>ApisixRoute CRD]
subgraph K8s Cluster[Kubernetes Cluster]
B --> C[APISIX Ingress Controller<br>(控制平面)]
C -->|2. 转换并分发配置| D[etcd Cluster<br>(配置存储)]
subgraph DataPlane [数据平面]
E[APISIX Pods<br>(处理实际流量)]
end
D -->|3. 实时监听配置变化| E
end
F[外部客户端] -->|4. 入口流量| G[K8s Service<br>(LoadBalancer/NodePort)]
G -->|路由至| E
E -->|5. 根据规则转发| H[后端业务服务<br>(Pod 1, Pod 2, ...)]
-
数据平面 (Data Plane):
- 由
apisix
Pod 组成。它们是处理实际流量的代理节点,负责匹配路由、执行插件(如认证、限流、日志)、负载均衡等。其配置完全来自 etcd。
- 由
-
控制平面 (Control Plane):
apisix-ingress-controller
:这是一个独立的控制器 Pod。它监听 K8s API Server 中与 APISIX 相关的 CRD(如ApisixRoute
)资源的变化,然后将其转换为 APISIX 能理解的配置,并写入 etcd。它本身不处理任何流量。
-
配置存储:
etcd
:作为 APISIX 的配置数据库,所有路由、插件、上游等信息都存储在 etcd 中。apisix-ingress-controller
写入,apisix
Pod 读取并监听变化。
-
资源定义:
- 自定义资源定义 (CRDs):APISIX 引入了多种 CRD,让你能够使用熟悉的 K8s YAML 方式来管理网关配置。
ApisixRoute
:定义路由规则(匹配路径、方法、主机头等)以及绑定在路由上的插件。ApisixUpstream
:定义上游(后端服务)的高级策略,如负载均衡算法、健康检查、重试等。ApisixTls
:管理 TLS 证书。ApisixPluginConfig
:定义可复用的插件模板。
- 自定义资源定义 (CRDs):APISIX 引入了多种 CRD,让你能够使用熟悉的 K8s YAML 方式来管理网关配置。
三、核心功能详解
通过上述组件,APISIX 在 K8s 中提供了极其丰富的功能:
-
高级流量路由:
- 基于路径、Header、Cookie、查询参数、请求方法等进行路由。
- 支持金丝雀发布(按权重/比例分流)、蓝绿部署。
- 支持 A/B 测试。
-
强大的安全防护:
- 认证:JWT、Key Auth、Basic Auth、Wolf RBAC、OpenID Connect (OIDC) 等。
- 安全:CORS、CSRF、IP 黑白名单、URI 阻塞、WAF 集成。
- 限流限速:请求速率限制、并发请求限制、漏桶算法、请求突发。
-
可观测性:
- 指标:集成 Prometheus,暴露丰富的 metrics(QPS、延迟、带宽、状态码等)。
- 日志:支持将访问日志推送到 HTTP、Kafka、SkyWalking、Elasticsearch 等数十种目标。
- 追踪:支持 SkyWalking、Zipkin、Jaeger 等分布式追踪系统。
-
高可用与弹性:
- 数据平面 (
apisix
) 和控制器 (ingress-controller
) 均可水平扩展。 - 所有配置存储在 etcd 集群中,确保高可用。
- 支持 Pod 优雅终止,最大限度减少流量中断。
- 数据平面 (
四、部署方式
通常使用 Helm 进行一键部署,这是最推荐的方式。
# 添加 APISIX Helm 仓库
helm repo add apisix https://charts.apiseven.com
helm repo update
# 安装 APISIX,包含 APISIX、etcd、ingress-controller
helm install apisix apisix/apisix --set gateway.type=LoadBalancer --set ingress-controller.enabled=true --namespace apisix
关键配置参数:
gateway.type
: 设置为LoadBalancer
(云厂商)、NodePort
或LoadBalancer
。ingress-controller.enabled
: 必须启用。etcd.enabled
: 如果已有外部 etcd 集群,可设置为false
。
五、一个简单示例:部署并暴露服务
-
部署一个示例应用:
# httpbin.yaml apiVersion: apps/v1 kind: Deployment metadata: name: httpbin spec: replicas: 1 selector: matchLabels: app: httpbin template: metadata: labels: app: httpbin spec: containers: - name: httpbin image: kennethreitz/httpbin ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: httpbin-svc spec: selector: app: httpbin ports: - protocol: TCP port: 80 targetPort: 80
kubectl apply -f httpbin.yaml
-
创建 APISIX 路由规则 (
ApisixRoute
):# apisix-route.yaml apiVersion: apisix.apache.org/v2 kind: ApisixRoute metadata: name: httpbin-route spec: http: - name: httpbin-rule match: hosts: - local.httpbin.org # 匹配的域名 paths: - /* # 匹配的路径 backends: - serviceName: httpbin-svc servicePort: 80 plugins: - name: prometheus # 启用 Prometheus 插件,暴露指标 enable: true - name: limit-count # 启用限流插件 enable: true config: count: 5 time_window: 60 key: remote_addr rejected_code: 503 policy: local
kubectl apply -f apisix-route.yaml
-
访问测试:
- 获取 APISIX Gateway 的 IP:
kubectl get svc apisix-gateway -n apisix
- 使用
curl
访问(假设 IP 是10.0.0.1
):curl http://10.0.0.1/get -H 'Host: local.httpbin.org' # 应该能看到 httpbin 返回的 JSON
- 测试限流:快速连续请求 6 次,第 6 次会返回
503
。
- 获取 APISIX Gateway 的 IP:
总结
在 Kubernetes 中部署 Apache APISIX,你得到的是一个功能全面、性能卓越、完全动态的现代化 API 网关解决方案。它通过自定义资源 (CRD) 与 K8s 完美集成,允许 DevOps 和开发人员使用声明式的方式管理复杂的流量治理策略,极大地提升了 API 管理的效率和可靠性,是构建微服务架构和应对高并发场景的理想选择。