Apache APISIX 云原生API网关,以插件体系提供认证、限流与协议转换能力
Apache APISIX 是 Apache 基金会的顶级项目,定位是API 网关而不是 Ingress Controller。这个区别很关键:
Ingress Controller 只解决「外部流量怎么进集群」,路由能力为主
API 网关 在入口之上叠加认证、限流、熔断、协议转换、可观测等业务能力
APISIX 的数据平面基于 OpenResty(Nginx + Lua),配置存储在 etcd 中,变更通过 etcd 的 watch 机制实时推送到数据平面,不需要 reload Nginx。这是它和传统 Nginx 网关最本质的差别。
在 Kubernetes 上使用 APISIX 有三种姿态,先想清楚要哪一种:
1. 纯 API 网关 只装 APISIX + etcd + Dashboard,路由通过 Admin API 或 Dashboard 配置,与 Kubernetes 资源无关
2. 网关 + Ingress Controller 额外装 apisix-ingress-controller,由 Ingress / Gateway API / ApisixRoute 资源驱动
3. 网关 + Ingress Controller(standalone) 不装 etcd,控制器以 YAML 配置驱动 APISIX,部署最简单
第三种(standalone 模式)是近几年官方主推的形态,因为没有 etcd 就少了一大块运维负担。
helm repo add apisix https://apache.github.io/apisix-helm-chart
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
方式一:APISIX 加 Ingress Controller(默认 etcd 模式)
helm install apisix \
--namespace ingress-apisix \
--create-namespace \
--set ingress-controller.enabled=true \
--set ingress-controller.apisix.adminService.namespace=ingress-apisix \
--set ingress-controller.gatewayProxy.createDefault=true \
apisix/apisix
方式二:standalone 模式,不需要 etcd
helm install apisix \
--namespace ingress-apisix \
--create-namespace \
--set apisix.deployment.role=traditional \
--set apisix.deployment.role_traditional.config_provider=yaml \
--set etcd.enabled=false \
--set ingress-controller.enabled=true \
--set ingress-controller.config.provider.type=apisix-standalone \
--set ingress-controller.apisix.adminService.namespace=ingress-apisix \
--set ingress-controller.gatewayProxy.createDefault=true \
apisix/apisix
方式三:只装 Ingress Controller,用 apisix/apisix-ingress-controller chart 连接已有的 APISIX 实例,通过 --set apisix.adminService.* 指定 Admin API 所在的命名空间、服务名与端口。
验证:
kubectl get pods -n ingress-apisix
9080 HTTP 入口
9443 HTTPS 入口
9180 Admin API,配置网关的核心接口
9000 Dashboard
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: httpserver-route
namespace: default
spec:
ingressClassName: apisix
rules:
- host: httpbin.org
http:
paths:
- path: /get
pathType: Exact
backend:
service:
name: httpbin
port:
number: 80
In 规则不支持的场景下,用 k8s.apisix.apache.org/ 前缀的注解补齐,例如开启 HTTPS 跳转、指定上游协议等。
APISIX 自己的 CRD 能力比 Ingress 强得多,是生产环境推荐的方式:
apiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
name: httpbin-route
namespace: default
spec:
http:
- name: rule1
match:
hosts:
- httpbin.org
paths:
- /get
methods:
- GET
backends:
- serviceName: httpbin
servicePort: 80
weight: 100
plugins:
- name: limit-count
enable: true
config:
count: 100
time_window: 60
key_type: var
key: remote_addr
rejected_code: 429
灰度发布,两个 backend 加权重:
apiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
name: canary-route
namespace: default
spec:
http:
- name: canary
match:
hosts:
- app.example.com
paths:
- /*
backends:
- serviceName: app-v1
servicePort: 80
weight: 90
- serviceName: app-v2
servicePort: 80
weight: 10
一条路由也可以通过 plugin_config_name 引用共享的 ApisixPluginConfig,把 CORS、Prometheus 这类通用插件抽出来复用:
apiVersion: apisix.apache.org/v2
kind: ApisixPluginConfig
metadata:
name: common-plugins
namespace: default
spec:
plugins:
- name: cors
enable: true
config:
allow_origins: "*"
- name: prometheus
enable: true
ApisixRoute 路由规则,APISIX 最核心的资源
ApisixUpstream 上游配置:负载均衡、健康检查、超时
ApisixPluginConfig 插件配置集,可被多条路由复用
ApisixConsumer 消费者,配合认证插件使用
ApisixGlobalRule 全局插件,对所有路由生效
APISIX 的插件通过路由或全局规则启用,配置直接写在路由资源里。常用插件:
认证 key-auth、basic-auth、jwt-auth、hmac-auth、openid-connect
限流 limit-count、limit-req、limit-conn
安全 ip-restriction、cors、csrf、waf
流量 redirect、rewrite、traffic-split、proxy-rewrite
转换 grpc-transcode、response-rewrite、fault-injection
可观测 prometheus、zipkin、skywalking、opentelemetry
插件也支持通过 Wasm 自行扩展,或者用 serverless-pre-function 这类函数式插件做临时逻辑。
不装 Ingress Controller 时,直接操作 Admin API:
kubectl -n ingress-apisix port-forward svc/apisix-admin 9180:9180
# 查看路由列表
curl http://127.0.0.1:9180/apisix/admin/routes -H 'X-API-KEY: <admin-key>'
# 创建一条路由
curl http://127.0.0.1:9180/apisix/admin/routes/1 -X PUT \
-H 'X-API-KEY: <admin-key>' \
-d '{
"uri": "/get",
"upstream": {
"type": "roundrobin",
"nodes": { "httpbin.org:80": 1 }
}
}'
# 查看 etcd 中的配置
kubectl -n ingress-apisix exec deploy/apisix-etcd -- \
etcdctl get /apisix --prefix --keys-only
# 数据平面日志
kubectl -n ingress-apisix logs deploy/apisix --tail=100 -f
# Ingress Controller 日志
kubectl -n ingress-apisix logs deploy/apisix-ingress-controller --tail=100 -f
# 错误日志单独看,配置类错误多半在这里
kubectl -n ingress-apisix exec deploy/apisix -- tail -100 /usr/local/apisix/logs/error.log
# 查看某条路由在 APISIX 里的实际形态
curl http://127.0.0.1:9180/apisix/admin/routes -H 'X-API-KEY: <admin-key>' | jq
kubectl -n ingress-apisix get pods
--set apisix.admin.credentials.admin 之类的参数换成随机值,并确保 Admin API 只监听集群内。plugins 里显式声明,或用 ApisixGlobalRule 全局启用。排查「限流没生效」时先确认插件挂在哪一级。limit-count 这类计数插件在多副本下需要考虑共享存储。默认的本地计数在网关多副本时每个 Pod 各算一份,总限额会被放大。需要全局精确限流时要配置 Redis 等外部存储。/usr/local/apisix/conf/nginx.conf 会在下次重载时被覆盖,一切改动都应通过路由资源或 Admin API 完成。kubectl — Kubernetes集群管理工具ingress — APISIX支持的上一代路由对象gateway-api — APISIX支持的新一代路由APIkong — 同为API网关的另一个主流选择higress — 基于Envoy与Istio的云原生网关helm — Kubernetes包管理器