本篇文章给大家分享的是有关如何通过K8S Ingress Controller来实现应用的流量复制,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
如何在阿里云容器服务不同K8S集群内进行应用的流量复制
通常在系统进行重大重构或者发布新功能时,我们都需要进行压测以事先评估新系统的承载能力,传统情况下我们一般会在线下环境来模拟线上各种测试数据来对新系统进行测试,但是这种方式往往并不能有效地模拟出线上真实的访问量,尤其是模拟出正常流量中混杂着各色的异常流量,针对这种情况我们可以通过将线上的应用流量复制到指定的线下环境来对新系统进行仿真测试;另外一种情况假若我们线上系统遇到了性能瓶颈,但是又不能快速地定位出问题点,我们同样可以采用流量复制的方式来将应用的真实流量引导到线下环境来进行定位。下面主要跟大家分享下如何在阿里云容器服务不同K8S集群内进行应用的流量复制:
这里假设您已经在阿里云容器服务控制台申请了两个不同的K8S集群(暂定一个为K8S Product Cluster,一个为K8S Stage Cluster)。
一、在K8S Product Cluster中部署一个应用,并通过Ingress来对外暴露服务访问:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
# 当前配置为老版本镜像
- image: registry.cn-hangzhou.aliyuncs.com/xianlu/old-nginx
imagePullPolicy: Always
name: nginx
ports:
- containerPort: 80
protocol: TCP
restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
type: NodePort
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: nginx-ingress
spec:
rules:
# 这里配置使用了集群默认域名(您也可以使用自定义域名并作DNS解析)
- host: nginx.c37bf6b77bded43669ba2fb67448b4146.cn-hangzhou.alicontainer.com
http:
paths:
- path: /
backend:
serviceName: nginx-service
servicePort: 80
二、部署完成后可通过如下命令测试访问:
# 查看该应用的ingress配置
kubectl get ing nginx-ingress
NAME HOSTS ADDRESS PORTS AGE
nginx-ingress nginx.c37bf6b77bded43669ba2fb67448b4146.cn-hangzhou.alicontainer.com 47.110.199.44 80 8m
# 测试访问应用域名
curl http://nginx.c37bf6b77bded43669ba2fb67448b4146.cn-hangzhou.alicontainer.com
old
三、在K8S Stage Cluster中部署一个相同应用,同样通过Ingress来对外暴露服务访问:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
# 当前配置为新版本镜像
- image: registry.cn-hangzhou.aliyuncs.com/xianlu/new-nginx
imagePullPolicy: Always
name: nginx
ports:
- containerPort: 80
protocol: TCP
restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
type: NodePort
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: nginx-ingress
spec:
rules:
# 这里配置使用了集群默认域名(您也可以使用自定义域名并作DNS解析)
- host: nginx.c41eb6ca34a3e49f7aea63b8bc9e8ad98.cn-beijing.alicontainer.com
http:
paths:
- path: /
backend:
serviceName: nginx-service
servicePort: 80
四、部署完成后可通过如下命令测试访问:
# 查看该应用的ingress配置
kubectl get ing nginx-ingress
NAME HOSTS ADDRESS PORTS AGE
nginx-ingress nginx.c41eb6ca34a3e49f7aea63b8bc9e8ad98.cn-beijing.alicontainer.com 39.106.233.1 80 1m
# 测试访问应用域名
curl http://nginx.c41eb6ca34a3e49f7aea63b8bc9e8ad98.cn-beijing.alicontainer.com
new
这里假设我们希望将K8S Product Cluster中该应用 100% 的访问流量复制到K8S Stage Cluster中对应的应用服务上,即将所有访问域名nginx.c37bf6b77bded43669ba2fb67448b4146.cn-hangzhou.alicontainer.com
的请求复制转发一份到nginx.c41eb6ca34a3e49f7aea63b8bc9e8ad98.cn-beijing.alicontainer.com
上:
cdn.com/fd9845ba32c0dd0fd7322a8e90db229eeeb0827f.png">
说明:由于K8S Stage Cluster Ingress仅仅只作为复制流量的接收方,因此它不需要做任何配置修改,这里我们只需要在K8S Product Cluster Ingress上进行配置即可。
一、配置复制流量百分比和接收复制流量的应用域名
通过如下命令来修改K8S Ingress Controller的ConfigMap配置增加http-snippet配置片段,配置期望的复制流量百分比和接收复制流量的目标应用域名:
~ kubectl -n kube-system edit cm nginx-configuration
配置如下KV对:
http-snippet: |
split_clients "$date_gmt">
二、配置流量复制
这里我们通过configuration-snippet和server-snippet来修改源Ingress增加应用的流量复制配置(YAML参考如下):
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: nginx-ingress
annotations:
nginx.ingress.kubernetes.io/configuration-snippet: |
mirror /mirror;
nginx.ingress.kubernetes.io/server-snippet: |
location = /mirror {
internal;
set $shadow_service_name "nginx-product-service";
proxy_set_header X-Shadow-Service $shadow_service_name;
proxy_pass http://$mirror_servers$request_uri;
}
spec:
rules:
- host: nginx.c37bf6b77bded43669ba2fb67448b4146.cn-hangzhou.alicontainer.com
http:
paths:
- path: /
backend:
serviceName: nginx-service
servicePort: 80
至此,基于K8S Ingress Controller的应用流量复制配置已经完成。
这里我们尝试访问K8S Product Cluster中的应用域名nginx.c37bf6b77bded43669ba2fb67448b4146.cn-hangzhou.alicontainer.com
,可以看到每次请求K8S Product Cluster中的Ingress应用域名时,其都将复制一份同样的请求转发到K8S Stage Cluster中对应的应用服务中:
同时,由于前面我们在流量复制配置中配置了proxy_set_header X-Shadow-Service $shadow_service_name
,因此在K8S Stage Cluster目标应用接收的请求中,都会携带一个X-Shadow-Service
头来指明该镜像流量来源于哪个线上应用。
以上就是如何通过K8S Ingress Controller来实现应用的流量复制,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/yunqi/blog/2873525