社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  NGINX

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

马哥Linux运维 • 2 月前 • 83 次点击  

一、背景

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

  • 在系统进行重大重构或者发布新功能时,可以通过将线上的应用流量镜像到指定的线下环境来对新系统进行仿真测试。

  • 线上系统遇到性能瓶颈,要快速地定位出问题时,可以采用流量镜像的方式来将应用的真实流量引导到线下环境来进行问题定位。

二、方案简介

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

三、操作步骤

3.1 部署测试应用

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

应用负载

服务 路由

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

步骤3 获取应用域名信息

  • Product Cluster : www.product-nginx.com

  • Stage Cluster: www.Stage-nginx.com
    ----结束

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 访问域名测试

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

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

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

----结束

链接:https://bbs.huaweicloud.com/blogs/419403

版权归华为云社区原作者所有,侵删)


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/167496
 
83 次点击