1、简介
很多情况下,当我们对服务做了重构,或者我们对项目做了重大优化时,怎么样保证服务是健壮的呢?在传统的服务里,我们只能通过大量的测试,模拟在各种情况下服务的响应情况。虽然也有手工测试、自动化测试、压力测试等一系列手段去检测它,但是测试本身就是一个样本化的行为,即使测试人员再完善它的测试样例,无法全面的表现出线上服务的一个真实流量形态 。
流量镜像的设计,让这类问题得到了最大限度的解决。流量镜像讲究的不再是使用少量样本去评估一个服务的健壮性,而是在不影响线上坏境的前提下将线上流量持续的镜像到我们的预发布坏境中去,让重构后的服务在上线之前就结结实实地接受一波真实流量的冲击与考验,让所有的风险全部暴露在上线前夕,通过不断的暴露问题,解决问题让服务在上线前夕就拥有跟线上服务一样的健壮性。由于测试坏境使用的是真实流量,所以不管从流量的多样性,真实性,还是复杂性上都将能够得以展现,同时预发布服务也将表现出其最真实的处理能力和对异常的处理能力。
流量镜像(Traffic Mirroring),也称为影子流量(Shadow Traffic),是指将实际用户请求的副本发送到另一个服务实例,而不会影响到实际用户的请求。
2、特点
实时流量复制:流量镜像功能可以将实际的生产流量实时复制到另一组服务。这样,您可以在不影响生产环境的情况下测试新版本的服务或进行其他实验。
非侵入性测试:流量镜像不会影响实际的生产流量。被镜像的流量仅用于测试,不会对外部用户产生任何影响。这种非侵入性的方式可以确保在进行测试时不会对实际服务质量产生影响。
独立镜像目标:可以选择不同的服务作为流量镜像的目标。例如,您可以将流量镜像到一个新的版本服务,进行 A/B 测试或者功能验证。这种灵活性允许您对新版本服务进行全面测试,确保其正常运行后再进行实际流量切换。
粒度控制:Istio 允许对流量镜像进行精细控制。您可以通过配置规则指定哪些流量需要被镜像,镜像的比例以及镜像的目标服务。这种粒度控制可以帮助您更精确地进行测试和验证。
易于配置:通过 Istio 的 VirtualService 配置,可以轻松实现流量镜像。只需在 VirtualService 中添加相应的 mirror 配置即可。
3、部署示例应用
准备httpbin v1
[root@mast01 istio]# vim httpbin-v1.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: httpbin-v1
namespace: bookinfo
spec:
replicas: 1
selector:
matchLabels:
app: httpbin
version: v1
template:
metadata:
labels:
app: httpbin
version: v1
spec:
containers:
– image: docker.io/kennethreitz/httpbin
imagePullPolicy: IfNotPresent
name: httpbin
command: [“gunicorn”, “–access-logfile”, “-“, “-b”, “0.0.0.0:80”, “httpbin:app”]
[root@mast01 istio]# istioctl kube-inject -f httpbin-v1.yaml | kubectl create -f –
deployment.apps/httpbin-v1 created
[root@mast01 istio]# curl $(kubectl -n bookinfo get po -l version=v1,app=httpbin -ojsonpath='{.items[0].status.podIP}’)/headers
{
“headers”: {
“Accept”: “/“,
“Host”: “10.244.205.218”,
“User-Agent”: “curl/7.29.0”,
“X-B3-Sampled”: “1”,
“X-B3-Spanid”: “c37cccea2a821df5”,
“X-B3-Traceid”: “6a523d4baf4ceda4c37cccea2a821df5”
}
}
准备httpbin v2
[root@mast01 istio]# vim httpbin-v2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: httpbin-v2
namespace: bookinfo
spec:
replicas: 1
selector:
matchLabels:
app: httpbin
version: v2
template:
metadata:
labels:
app: httpbin
version: v2
spec:
containers:
– image: docker.io/kennethreitz/httpbin
imagePullPolicy: IfNotPresent
name: httpbin
command: [“gunicorn”, “–access-logfile”, “-“, “-b”, “0.0.0.0:80”, “httpbin:app”]
[root@mast01 istio]# istioctl kube-inject -f httpbin-v2.yaml | kubectl create -f –
deployment.apps/httpbin-v2 created
Service文件
[root@mast01 istio]# vim httpbin-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: httpbin
namespace: bookinfo
labels:
app: httpbin
spec:
ports:
- name: http
port: 8000
targetPort: 80
selector:
app: httpbin
[root@mast01 istio]# kubectl apply -f httpbin-svc.yaml
service/httpbin created
添加v1
使用bookinfo.com/httpbin访问,因此直接修改bookinfo这个virtualservice即可
[root@mast01 istio]# kubectl -n bookinfo get vs
NAME GATEWAYS HOSTS AGE
bookinfo [“productpage-gateway”] [“bookinfo.com”] 6d
gateway-front-tomcat [“productpage-gateway”] [“productpage.bookinfo.com”] 2d21h
reviews [“reviews”] 2d
[root@mast01 istio]# kubectl -n bookinfo edit vs bookinfo
添加httpbin的规则
…
- match:
- uri:
prefix: /httpbin
name: httpbin-route
rewrite:
uri: /
route: - destination:
host: httpbin
subset: v1
…
访问http://bookinfo.com/httpbin/headers,查看日志(发现只有v1有请求)
添加v2
创建gateway和virtualservice,由于都是使用http请求,因此,直接
[root@mast01 istio]# vim httpbin-destinationRule.yaml
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: httpbin
namespace: bookinfo
spec:
host: httpbin
subsets:
- name: v1
labels:
version: v1 - name: v2
labels:
version: v2
[root@mast01 istio]# kubectl apply -f httpbin-destinationRule.yaml
destinationrule.networking.istio.io/httpbin created
为httpbin-v1添加mirror设置,mirror点为httpbin-v2
[root@mast01 istio]# kubectl -n bookinfo edit vs bookinfo
…
- match:
- uri:
prefix: /httpbin
name: httpbin-route
rewrite:
uri: /
route: - destination:
host: httpbin
subset: v1
mirror:
host: httpbin
subset: v2
mirror_percent: 100
…
访问http://bookinfo.com/httpbin/headers,查看日志(发现v1和v2都有请求)
声明:文中观点不代表本站立场。本文传送门:http://eyangzhen.com/418736.html