You need to enable JavaScript to run this app.
导航
Nginx Ingress 配置流量复制
最近更新时间:2024.08.06 15:42:14首次发布时间:2024.06.12 10:18:20

Nginx Ingress 支持通过流量复制,将集群中的流量复制到其他集群中,常用于仿真测试或压力测试。本文为您介绍如何使用 Nginx Ingress 配置流量复制。

背景信息

Nginx Ingress 的流量复制功能,也被称作请求复制或流量镜像,是一种将集群中的请求流量复制到多个目标集群的能力。支持多种应用场景,包括:

  • 压力测试:当用户应用发布新版本时,可以将生产集群中的流量复制到测试集群,使用实际的流量对新版本应用进行压测。这种场景下,能够在不影响生产环境的情况下测试新版本应用的可用性和性能。
  • 故障排查:当生产环境出现故障时,为了不影响生产环境的正常运行,可以将生产环境的流量复制到测试环境进行故障排查和处理。

alt

前提条件

  • 已创建 2 个集群,本例中为方便描述,定义为集群 A 和集群 B。详情请参见 创建集群
  • 集群中已安装 ingress-nginx 组件,并升级至 v1.8.4-vke.1 版本。

    说明

    邀测·申请试用】:ingress-nginx 组件的 v1.8.4-vke.1 版本目前处于邀测阶段,如需使用,请提交申请。

  • 已连接集群。详情请参见 连接集群
  • 将应用镜像上传至镜像仓库,详情请参见 推送和拉取镜像

在集群中部署业务

在集群 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。
  2. 执行以下命令,编辑 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