APISIX是一款基于Nginx和OpenResty构建的云原生API网关,它在设计之初就充分考虑了动态配置和分布式协作。与传统的Nginx需要手动修改配置文件并执行reload不同,APISIX将所有路由、上游、插件等配置都存储在etcd中,并通过watch机制实现实时同步。这种架构让网关在容器化环境中表现得非常灵活,因为容器本身的生命周期短暂且变化频繁,静态配置文件很难跟上服务的扩缩容节奏。动态路由正是解决这一问题的核心能力,它允许开发者在不影响现有流量的情况下,增删改查路由规则,并且改动会在极短时间内自动生效。

为什么选择APISIX作为容器化网关
在微服务和容器化大行其道的今天,API网关的选型直接影响系统的可维护性和扩展性。APISIX相比于Kong、Traefik等同类产品,最大的优势在于其完全基于etcd的配置中心和无状态工作节点设计。每个APISIX实例不保存任何本地配置,所有运行时数据都来自etcd,这意味着任何实例都可以被随时销毁和重建,而不会丢失路由信息。
从性能角度来看,APISIX使用OpenResty的异步非阻塞模型,单核可以处理数万QPS,同时插件采用动态加载机制,能够在不重启进程的情况下启用或禁用限流、认证、日志等功能。在容器化场景下,这种水平扩展能力至关重要:当流量高峰到来时,可以快速增加APISIX副本数,新实例启动后自动从etcd拉取全部配置,立即参与流量转发,无需人工干预。
另一个关键优势是APISIX对Kubernetes的原生支持。官方提供了Ingress Controller和CRD(自定义资源定义),可以将Kubernetes中的Service、Endpoints、Ingress等资源直接映射为APISIX的路由和上游。这种集成让容器环境下的动态路由不仅局限于APISIX自身的Admin API,还可以与K8s生态无缝对接,实现真正的声明式配置管理。
APISIX容器化部署实践
部署APISIX容器化通常有两种方式:一是使用官方提供的Docker镜像手动编排,二是通过Helm Chart部署到Kubernetes集群。无论哪种方式,核心组件都包括APISIX节点和etcd集群。etcd是APISIX的配置存储和协调中心,建议单独部署并配置持久化存储,以保证配置数据的安全。
下面是一个使用Docker Compose部署APISIX和etcd的示例。通过该配置可以快速启动一个包含三个APISIX实例和一个单节点etcd的本地环境。
version: '3'
services:
etcd:
image: bitnami/etcd:3.5
environment:
- ALLOW_NONE_AUTHENTICATION=yes
ports:
- "2379:2379"
- "2380:2380"
volumes:
- etcd_data:/bitnami/etcd
apisix:
image: apache/apisix:3.8.0-debian
depends_on:
- etcd
ports:
- "9080:9080"
- "9443:9443"
volumes:
- ./apisix_conf/config.yaml:/usr/local/apisix/conf/config.yaml:ro
restart: always
apisix-dashboard:
image: apache/apisix-dashboard:3.0.1-alpine
depends_on:
- apisix
ports:
- "9000:9000"
volumes:
- ./dashboard_conf/conf.yaml:/usr/local/apisix-dashboard/conf/conf.yaml:ro
restart: always
volumes:
etcd_data:
上述compose文件中,APISIX的配置文件通过volume挂载到容器内,主要需要指定etcd的地址。一个最小化的config.yaml内容如下:
apisix:
node_listen: 9080
enable_admin: true
enable_admin_cors: true
etcd:
host:
- "http://etcd:2379"
prefix: "/apisix"
timeout: 30
deployment:
role: traditional
role_traditional:
config_provider: etcd
对于生产环境,建议使用Helm Chart部署,因为Chart已经处理了高可用、健康检查、资源限制等细节。APISIX官方提供了完善的Helm仓库,执行helm repo add apisix https://charts.apiseven.com即可添加,然后通过helm install apisix apisix/apisix完成安装。Chart还支持配置自动扩展参数,比如autoscaling.enabled=true可以基于CPU或内存使用率自动调整APISIX的Pod数量,进一步增强动态性。
动态路由的核心机制与配置
APISIX中的路由(Route)和上游(Upstream)是两个核心概念。上游代表一组提供相同服务的后端节点,路由则负责定义匹配规则并将请求转发到对应的上游。动态路由的关键在于,路由和上游的创建、修改、删除都可以通过Admin API完成,而Admin API的操作会写入etcd,APISIX所有实例通过watch机制感知变化并更新内存中的路由表,整个过程无需重启服务。
下面通过一个完整的curl命令示例演示如何动态创建一条路由。首先创建一个上游,包含两个后端服务实例:
curl -X PUT http://127.0.0.1:9180/apisix/admin/upstreams/1 \
-H "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1" \
-d '{
"type": "roundrobin",
"nodes": {
"192.168.1.10:8080": 1,
"192.168.1.11:8080": 1
}
}'
然后创建一条路由,当请求的Host头为api.ippipp.com且路径以/v1/开头时,将请求转发到上游ID为1的节点。需要注意的是,代码块中的Upstream等占位符在实际使用时需要替换为真实值。
curl -X PUT http://127.0.0.1:9180/apisix/admin/routes/100 \
-H "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1" \
-d '{
"uri": "/v1/*",
"host": "api.ippipp.com",
"upstream_id": "1",
"plugins": {
"limit-count": {
"count": 100,
"time_window": 60,
"rejected_code": 503
}
}
}'
执行上述命令后,APISIX会立即应用新路由,无需任何reload操作。这种动态能力在容器化环境中非常有用,例如当后端服务进行滚动更新时,只需更新上游中的节点列表,旧Pod下线前先从上游中移除,新Pod就绪后再添加进来,整个过程流量无损。此外,APISIX还支持通过PATCH方法局部更新配置,比如只修改路由的限流阈值,而不影响其他字段。
与Kubernetes集成实现全自动动态路由
虽然Admin API已经足够动态,但在Kubernetes集群中,更推荐使用APISIX Ingress Controller和CRD来管理路由。这种方式将路由规则定义为Kubernetes资源,由Controller监听资源变化并同步到APISIX的etcd中,实现了声明式配置管理。开发者不再需要手动调用Admin API,只需维护YAML文件即可。
首先需要在K8s集群中安装APISIX Ingress Controller。官方提供了Helm Chart,执行以下命令即可:
helm repo add apisix https://charts.apiseven.com helm install apisix-ingress-controller apisix/apisix-ingress-controller \ --set apisix.adminKey=edd1c9f034335f136f87ad84b625c8f1
安装完成后,可以创建ApisixRoute自定义资源来定义动态路由。下面的示例展示了如何将Kubernetes中的Service自动映射为APISIX的上游,并定义基于路径的路由规则:
apiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
name: httpbin-route
spec:
http:
- name: rule1
match:
hosts:
- api.ippipp.com
paths:
- /v1/*
backends:
- serviceName: httpbin-service
servicePort: 80
当这个YAML文件被应用到集群后,Ingress Controller会解析资源并自动调用APISIX的Admin API创建对应的路由和上游。如果httpbin-service的Pod发生变化,比如扩容或缩容,Controller也会自动更新上游节点列表,确保APISIX始终将流量分发到健康的Pod上。这种集成方式进一步降低了运维复杂度,让动态路由真正融入容器编排的生命周期管理。
总结来说,APISIX容器化与动态路由的结合为现代微服务架构提供了高性能、高弹性的流量管理方案。通过etcd配置中心、Admin API和Kubernetes CRD三种方式,开发者可以根据实际场景选择最合适的配置管理路径。核心要点是理解APISIX的无状态工作节点设计和etcd的实时同步机制,这样才能在容器化环境中充分发挥动态路由的优势。