proxy-mirror
proxy-mirror 插件会将传入请求复制到次级上游,同时网关仍将原始请求发送到其配置的上游。它可以镜像每个请求,也可以按比例采样流量,用于故障排除、安全检查、测试和分析。网关会忽略镜像上游的响应。
示例
流量镜像需要一个网关可以访问的次级上游。以下示例使用 NGINX 作为该上游,并配置控制镜像请求的超时时间。
镜像部分流量
以下示例将大约 50% 的请求镜像到次级 NGINX 服务,同时所有请求仍会发送到路由的原始上游。
启动一个示例 NGINX 服务器以接收镜像流量:
- Docker
- Kubernetes
将 GATEWAY_CONTAINER 设置为正在运行的 APISIX 或 API7 Gateway 容器名称。创建专用网络并将网关连接到该网络:
export GATEWAY_CONTAINER=replace-with-gateway-container-name
docker network create gateway-mirror-net
docker network connect gateway-mirror-net "$GATEWAY_CONTAINER"
在同一网络中启动 NGINX:
docker run -d --name mirror-receiver \
--network gateway-mirror-net \
-p 127.0.0.1:8081:80 \
nginx:1.30.5-alpine
等待 NGINX 可用:
until curl -fsS "http://127.0.0.1:8081" > /dev/null; do
sleep 1
done
设置 Admin API 和 ADC 示例使用的镜像接收端 URL:
export MIRROR_RECEIVER_URL=http://mirror-receiver
为 NGINX Deployment 和 Service 创建 Kubernetes 清单:
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: aic
name: mirror-receiver
spec:
replicas: 1
selector:
matchLabels:
app: mirror-receiver
template:
metadata:
labels:
app: mirror-receiver
spec:
containers:
- name: nginx
image: nginx:1.30.5-alpine
ports:
- containerPort: 80
readinessProbe:
httpGet:
path: /
port: 80
---
apiVersion: v1
kind: Service
metadata:
namespace: aic
name: mirror-receiver
spec:
selector:
app: mirror-receiver
ports:
- name: http
port: 80
targetPort: 80
将清单应用到集群:
kubectl apply -f mirror-receiver.yaml
等待 NGINX 可用:
kubectl rollout status -n aic deployment/mirror-receiver
设置 Admin API 和 ADC 示例使用的镜像接收端 URL:
export MIRROR_RECEIVER_URL=http://mirror-receiver.aic.svc
创建一条启用 proxy-mirror 的路由:
- APISIX Admin API
- ADC
- Ingress Controller(Kubernetes)
curl "http://127.0.0.1:9180/apisix/admin/routes" -X PUT \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
-d @- <<EOF
{
"id": "traffic-mirror-route",
"uri": "/get",
"plugins": {
"proxy-mirror": {
"host": "$MIRROR_RECEIVER_URL",
"sample_ratio": 0.5
}
},
"upstream": {
"nodes": {
"httpbin.org": 1
},
"type": "roundrobin"
}
}
EOF
services:
- name: proxy-mirror-service
labels:
docs-example: proxy-mirror
routes:
- name: traffic-mirror-route
uris:
- /get
plugins:
proxy-mirror:
host: "${MIRROR_RECEIVER_URL}"
sample_ratio: 0.5
upstream:
type: roundrobin
nodes:
- host: httpbin.org
port: 80
weight: 1
预览此示例所管理的变更,并确认差异中没有意外的更新或删除:
adc diff -f adc.yaml \
--include-resource-type service \
--label-selector docs-example=proxy-mirror
同步已检查的服务配置:
adc sync -f adc.yaml \
--include-resource-type service \
--label-selector docs-example=proxy-mirror
- Gateway API
- APISIX CRD
apiVersion: v1
kind: Service
metadata:
namespace: aic
name: httpbin-external-domain
spec:
type: ExternalName
externalName: httpbin.org
---
apiVersion: apisix.apache.org/v1alpha1
kind: PluginConfig
metadata:
namespace: aic
name: proxy-mirror-plugin-config
spec:
plugins:
- name: proxy-mirror
config:
host: "http://mirror-receiver.aic.svc"
sample_ratio: 0.5
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
namespace: aic
name: traffic-mirror-route
spec:
parentRefs:
- name: apisix
rules:
- matches:
- path:
type: Exact
value: /get
filters:
- type: ExtensionRef
extensionRef:
group: apisix.apache.org
kind: PluginConfig
name: proxy-mirror-plugin-config
backendRefs:
- name: httpbin-external-domain
port: 80
apiVersion: apisix.apache.org/v2
kind: ApisixUpstream
metadata:
namespace: aic
name: httpbin-external-domain
spec:
ingressClassName: apisix
externalNodes:
- type: Domain
name: httpbin.org
---
apiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
namespace: aic
name: traffic-mirror-route
spec:
ingressClassName: apisix
http:
- name: traffic-mirror-route
match:
paths:
- /get
upstreams:
- name: httpbin-external-domain
plugins:
- name: proxy-mirror
enable: true
config:
host: "http://mirror-receiver.aic.svc"
sample_ratio: 0.5
将配置应用到集群:
kubectl apply -f proxy-mirror-ic.yaml
❶ host:配置接收镜像请求的上游协议和地址。
❷ sample_ratio:将采样率配置为 0.5,以镜像 50% 的流量。
向该路由发送 20 个请求:
for i in $(seq 1 20); do
curl -fsS "http://127.0.0.1:9080/get" > /dev/null || exit 1
done
发送到原始上游的 20 个请求都应成功。如果任何请求返回错误,该命令会提前退出。
检查 NGINX 访问日志:
- Docker
- Kubernetes
docker logs mirror-receiver 2>&1 | grep '"GET /get HTTP/1.1" 404'
kubectl logs -n aic deployment/mirror-receiver | grep '"GET /get HTTP/1.1" 404'
日志中应包含大约 10 个请求。由于每个请求都是独立采样,实际数量可能有所不同。NGINX 的默认配置未定义 /get,因此会对镜像请求返回 404;该响应会被忽略,不会影响原始上游的响应。
配置镜像超时
以下示例更新镜像请求使用的连接、读取和发送超时时间。当镜像上游响应缓慢或不可用时,较短的超时时间可以限制请求占用连接和网关资源的时长。
连接、读取和发送超时时间默认为 60 秒。若要更改这些值,请配置网关静态设置:
- 主机或 Docker
- Kubernetes(Helm)
在网关配置文件中添加或更新以下配置:
plugin_attr:
proxy-mirror:
timeout:
connect: 2000ms
read: 2000ms
send: 2000ms
重新加载网关以使更改生效。
对于 Helm 部署,请更新用于渲染 plugin_attr.proxy-mirror 的 Chart values,并保持 values 文件的其余内容不变。
对于 APISIX Helm Chart,请设置以下值:
apisix:
pluginAttrs:
proxy-mirror:
timeout:
connect: 2000ms
read: 2000ms
send: 2000ms
对于 API7 Gateway Helm Chart,请设置以下值:
pluginAttrs:
proxy-mirror:
timeout:
connect: 2000ms
read: 2000ms
send: 2000ms
然后使用该网关版本对应的 Chart 应用 values 文件:
helm upgrade <release-name> <chart-name> -n <namespace> -f values.yaml