
一、背景
流量镜像(Traffic Mirror)功能应用于以下两个场景:
二、方案简介
本文介绍如何通过Ingress nginx Controller来实现应用流量的复制,用于系统的仿真测试和问题定位。
三、操作步骤
3.1 部署测试应用
步骤1 在K8s集群Product Cluster部署应用。
应用负载

服务 路由


步骤2 在K8s集群Stage Cluster部署相同应用,方法同上
步骤3 获取应用域名信息
3.2 流量镜像配置
将K8s Product Cluster中应用100%的访问流量镜像到K8s Stage Cluster中应用服务上,即将所有访问域名"www.product-nginx.com"的请求复制一份转发到"www.stage-nginx.com"
步骤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%
配置说明:
流量百分比取值范围:(0, 100],百分比总和必须不大于100%。
支持同时配置多个不同的复制流量接收目标应用。
步骤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 访问域名测试

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

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

验证多个接收目标访问情况

----结束
链接:https://bbs.huaweicloud.com/blogs/419403
(版权归华为云社区原作者所有,侵删)