nginx-ingress-controller流量复制/流量镜像

举报
可以交个朋友 发表于 2023/12/29 20:08:38 2023/12/29
【摘要】 一、背景流量镜像(Traffic Mirror)功能应用于以下两个场景:在系统进行重大重构或者发布新功能时,可以通过将线上的应用流量镜像到指定的线下环境来对新系统进行仿真测试。线上系统遇到性能瓶颈,要快速地定位出问题时,可以采用流量镜像的方式来将应用的真实流量引导到线下环境来进行问题定位。 二、方案简介本文介绍如何通过Ingress nginx Controller来实现应用流量的复制,用...

一、背景

流量镜像(Traffic Mirror)功能应用于以下两个场景:

  • 在系统进行重大重构或者发布新功能时,可以通过将线上的应用流量镜像到指定的线下环境来对新系统进行仿真测试。
  • 线上系统遇到性能瓶颈,要快速地定位出问题时,可以采用流量镜像的方式来将应用的真实流量引导到线下环境来进行问题定位。
    image.png

二、方案简介

本文介绍如何通过Ingress nginx Controller来实现应用流量的复制,用于系统的仿真测试和问题定位。

三、操作步骤

3.1 部署测试应用

步骤1 在K8s集群Product Cluster部署应用。

应用负载
image.png

服务 路由
image.png
image.png

步骤2 在K8s集群Stage Cluster部署相同应用,方法同上

步骤3 获取应用域名信息

3.2 流量镜像配置

将K8s Product Cluster中应用100%的访问流量镜像到K8s Stage Cluster中应用服务上,即将所有访问域名"www.product-nginx.com"的请求复制一份转发到"www.stage-nginx.com"

  • K8s Stage Cluster Ingress仅作为复制流量的接收方,不做任何配置修改
  • 在将K8s Product Cluster中应用的访问流量镜像到K8s Stage Cluster中对应的应用服务后,客户端只会收到K8s Product Cluster中的请求响应,K8s Stage Cluster中的请求响应会被丢弃。

步骤1 配置nginx-ingress configmap

在nginx-ingress-controller configmap中增加以下内容,配置多个流量接收目标

kubectl get configmap -nkube-system
kubectl edit configmap nginx-ingress-controller -n kube-system

#追加一下配置
data:
  http-snippet: |
    split_clients "$date_gmt" $mirror_servers1 {
       100%    www.stage-nginx1.com;
    }
    split_clients "$date_gmt" $mirror_servers2 {
       100%    www.stage-nginx2.com;
    }

配置多个接收目标并且每个目标流量都是100%
配置说明:

  1. 流量百分比取值范围:(0, 100],百分比总和必须不大于100%。
  2. 支持同时配置多个不同的复制流量接收目标应用。

步骤2 配置product cluster集群应用ingress

通过configuration-snippet和server-snippet修改源Ingress,增加应用的流量镜像配置。
参考如下

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress
  annotations:
    nginx.ingress.kubernetes.io/configuration-snippet: |
        # 配置多个接收目标
        mirror /mirror1;
        mirror /mirror2;
    nginx.ingress.kubernetes.io/server-snippet: |
        # 配置第1个接收复制的集群
        location = /mirror1 {
            internal;
            # 不打印mirror请求日志
            #access_log off;
            # 设置proxy_upstream_name,格式必须为[Namespace]-[BackendServiceName]-[BackendServicePort]
            set $proxy_upstream_name    "default-nginx-service-80";
            # 自定义字符串,会作为请求头X-Shadow-Service值传给mirror server
            set $shadow_service_name    "nginx-product-service";
            proxy_set_header X-Shadow-Service  $shadow_service_name;
            proxy_set_header Host $mirror_servers1; 
            proxy_pass http://$mirror_servers1$request_uri;
        }
        # 配置第2个接收复制的集群
        location = /mirror2 {
            internal;
            # 不打印mirror请求日志
            #access_log off;
            # 设置proxy_upstream_name,格式必须为[Namespace]-[BackendServiceName]-[BackendServicePort] 
            set $proxy_upstream_name    "default-nginx-service-80";
            # 自定义字符串,会作为请求头X-Shadow-Service值传给mirror server
            set $shadow_service_name    "nginx-product-service";
            proxy_set_header X-Shadow-Service  $shadow_service_name;
            proxy_set_header Host $mirror_servers2;
            proxy_pass http://$mirror_servers2$request_uri;
        }
spec:
  rules:
  - host: www.product-nginx.com
    http:
      paths:
      - path: /
        backend:
          service:
            name: nginx-product
            port:
              number: 80
        pathType: ImplementationSpecific

步骤3 修改coredns hosts配置

在K8s Product Cluster集群coredns插件中添加需要发送流量镜像的域名解析

kubectl get configmap -n kube-system
kubectl edit configmap coredns -n kube-system

data:
  Corefile: |-
    .:5353 {
        bind {$POD_IP}
        # 添加服务域名解析
        hosts {
            192.168.4.16 www.stage-nginx1.com
            192.168.4.53 www.stage-nginx2.com
            fallthrough
        }
...

----结束

四、验证

步骤 1 Product 访问域名测试
image.png

  1. 观察product集群nginx-ingress-controller日志
    图中可以看出每次访问都会产生两条流量其中192.188.XXX.56为发往stage集群流量。
    image.png

  2. 观察stage集群nginx-ingress-controller日志
    图中可以看出在product cluster每次访问都会有流量复制过来。
    image.png

  3. 验证多个接收目标访问情况
    image.png

----结束

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。