You need to enable JavaScript to run this app.
文档中心
容器服务

容器服务

复制全文
下载 pdf
Nginx Ingress
Nginx Ingress 配置流量复制
复制全文
下载 pdf
Nginx Ingress 配置流量复制
Nginx Ingress 支持通过流量复制,将集群中的流量复制到其他集群中,常用于仿真测试或压力测试。本文为您介绍如何使用 Nginx Ingress 配置流量复制。
注意
Nginx Ingress 功能即将下线,详情请参见 【产品公告】NGINX Ingress 停止维护公告
背景信息
Nginx Ingress 的流量复制功能,也被称作请求复制或流量镜像,是一种将集群中的请求流量复制到多个目标集群的能力。支持多种应用场景,包括:
  • 压力测试:当用户应用发布新版本时,可以将生产集群中的流量复制到测试集群,使用实际的流量对新版本应用进行压测。这种场景下,能够在不影响生产环境的情况下测试新版本应用的可用性和性能。
  • 故障排查:当生产环境出现故障时,为了不影响生产环境的正常运行,可以将生产环境的流量复制到测试环境进行故障排查和处理。
alt
前提条件
  • 已创建 2 个集群,本例中为方便描述,定义为集群 A 和集群 B。
  • 已安装 ingress-nginx 组件,并升级至最新版本。
在集群中部署业务
在集群 A 中部署业务
在集群 A 中部署旧版本的应用和服务。操作步骤如下:
  1. 使用如下 YAML 配置,创建旧版本应用和服务。
  • apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: nginx-old
    spec:
    replicas: 1
    selector:
    matchLabels:
    app: nginx-old
    template:
    metadata:
    labels:
    app: nginx-old
    spec:
    containers:
    - name: nginx
    image: doc-cn-beijing.cr.volces.com/vke/nginx-demo:v2.0
    ports:
    - containerPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
    name: service-old
    spec:
    selector:
    app: nginx-old
    ports:
    - name: rule
    protocol: TCP
    port: 80
    targetPort: 80
    type: NodePort
  1. 使用如下 YAML 配置,创建 Nginx Ingress,并指向旧版本服务。
  • apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
    name: ingress-old # 路由规则的名称
    spec:
    ingressClassName: nginx # 指定 Ingress Controller
    rules:
    - host: example.com # 需要对外提供访问的域名
    http:
    paths:
    - pathType: Prefix # 路径匹配规则,默认为 Prefix(前缀匹配)
    path: / # 请求匹配的路径
    backend:
    service:
    name: service-old # 需要对接的服务名称
    port:
    number: 80 # 需要对接服务的端口号
  1. 执行以下命令,验证是否可以访问到旧版本服务。其中,<EXTERNAL_IP>为 Nginx Ingress 对外暴露的 IP 地址。
  • curl -H "Host: example.com" http://<EXTERNAL_IP>
  • 预期结果如下,访问到了后端旧版本的应用。
  • This is the old version of nginx
在集群 B 中部署业务
在集群 B 中部署新版本的应用和服务。操作步骤如下:
  1. 使用如下 YAML 配置,创建新版本的应用和服务。
  • apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: nginx-new
    spec:
    replicas: 1
    selector:
    matchLabels:
    app: nginx-new
    template:
    metadata:
    labels:
    app: nginx-new
    spec:
    containers:
    - name: nginx
    image: doc-cn-beijing.cr.volces.com/vke/nginx-demo:v3.0
    ports:
    - containerPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
    name: service-new
    spec:
    selector:
    app: nginx-new
    ports:
    - name: rule
    protocol: TCP
    port: 80
    targetPort: 80
    type: NodePort
  1. 使用如下 YAML 配置,创建 Nginx Ingress,并指向新版本服务。
  • apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
    name: ingress-new # 路由规则的名称
    spec:
    ingressClassName: nginx # 指定 Ingress Controller
    rules:
    - host: example1.com # 需要对外提供访问的域名
    http:
    paths:
    - pathType: Prefix # 路径匹配规则,默认为 Prefix(前缀匹配)
    path: / # 请求匹配的路径
    backend:
    service:
    name: service-new # 需要对接的服务名称
    port:
    number: 80 # 需要对接服务的端口号
  1. 执行以下命令,验证是否可以访问到新版本服务。其中,<EXTERNAL_IP>为 Nginx Ingress 对外暴露的 IP 地址。
  • curl -H "Host: example1.com" http://<EXTERNAL_IP>
  • 预期结果如下,访问到了后端新版本的应用。
  • This is the new version of nginx
配置流量复制
说明
  • 集群 B(测试集群)作为镜像流量的接收方,无需配置额外的流量复制功能。仅在集群 A(生产集群)中配置流量复制功能即可。
  • 流量由集群 A 复制到集群 B 后,客户端仅能接收到集群 A 客户端的请求响应。集群 B 的客户端请求响应会被丢弃。
为了将集群 A(生产集群)上访问旧应用的流量,全部复制到集群 B(测试集群)上,需要在集群 A 上配置流量复制功能。操作步骤如下:
  1. 使用 kubectl 连接生产集群 A。
  1. 执行以下命令,编辑 Nginx-Ingress。
  • kubectl edit ingress ingress-old
  1. 在 Nginx Ingress 配置中添加流量复制功能的 Annotation。
  • apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
    name: ingress-old
    annotations:
    nginx.ingress.kubernetes.io/mirror-host: example1.com # 流量复制目标域名
    nginx.ingress.kubernetes.io/mirror-target: http://14.xxx.xxx.xxx # 跨集群场景时,填写对应 Nginx Ingress 的 VIP。同集群场景时,填写 service
    spec:
    ingressClassName: nginx
    rules:
    - host: example.com
    http:
    paths:
    - pathType: Prefix
    path: /
    backend:
    service:
    name: service-old
    port:
    number: 80
说明
Nginx Ingress 流量复制功能的更多配置详情,请参见 官方文档
结果验证
  1. 查看集群 B 中,新版本应用的 ingress-nginx-controller 日志,可以看到转发 IP 是集群 A 的 IP 地址。
  • alt
  1. 查询新版本应用的日志request: "GET /_mirror-30b2558b-5eab-42eb-8ffc-9c128a703479 HTTP/1.1
  • alt
  1. 旧版本的日志查询,调用正常,不影响线上调用。
  • alt
  • alt
最近更新时间:2026.05.20 10:54:36
这个页面对您有帮助吗?
有用
有用
无用
无用