备考ICA----Istio实验6---流量镜像 Traffic Mirroring 实验
流量镜像功能可以将生产的流量镜像拷贝到测试集群或者新的测试版本中,在不影响实际生产环境的情况下,测试具有实际生产流量的服务,帮助减低版本变更的风险。也可以用在不同集群间的同步
1. 部署httpbin应用
1.1 v1版本deployment
v1和v2一样拥有标签 app: httpbin ,同时拥有不同的version: v1标签
mirrors-httpbin-v1.yaml
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: httpbin-v1
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"]
ports:
- containerPort: 80
1.2 v2版本deployment
v2和v1一样拥有标签 app: httpbin ,同时拥有不同的version: v2标签
mirrors-httpbin-v2.yaml
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: httpbin-v2
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"]
ports:
- containerPort: 80
1.3 Service
service 通过标签 app: httpbin 关联 httpbin-v1 和 httpbin-v2
mirrors-httpbin-service.yaml
yaml
apiVersion: v1
kind: Service
metadata:
name: httpbin
labels:
app: httpbin
spec:
ports:
- name: http
port: 8000
targetPort: 80
selector:
app: httpbin
1.4 测试容器sleep
sleep 用于测试
mirrors-sleep.yaml
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: sleep
spec:
replicas: 1
selector:
matchLabels:
app: sleep
template:
metadata:
labels:
app: sleep
spec:
containers:
- name: sleep
image: curlimages/curl
command: ["/bin/sleep","3650d"]
imagePullPolicy: IfNotPresent
部署以上deployment和svc
bash
kubectl apply -f Traffic-Mirroring/mirrors-httpbin-v1.yaml
kubectl apply -f Traffic-Mirroring/mirrors-httpbin-v2.yaml
kubectl apply -f Traffic-Mirroring/mirrors-httpbin-service.yaml
kubectl apply -f Traffic-Mirroring/mirrors-sleep.yaml
2. 配置路由
2.1 所有流量到v1
2.1.1 部署dr和vs
Traffic-Mirroring/mirrors-httpbin-vs-dr.yaml
yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: httpbin
spec:
hosts:
- httpbin
http:
- route:
- destination:
host: httpbin
subset: v1
weight: 100
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: httpbin
spec:
host: httpbin
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
部署dr和vs
bash
kubectl apply -f Traffic-Mirroring/mirrors-httpbin-vs-dr.yaml
2.1.2 测试访问
通过sleep容器向httpbin发起访问
bash
kubectl exec deployments/sleep -- curl -sS http://httpbin:8000/headers
由于所有流量都被发给v1,所以v1有一条访问记录,而v2没有
bash
kubectl logs deployments/httpbin-v1
kubectl logs deployments/httpbin-v2
2.2 将v1的流量全部镜像给v2
2.2.1 部署vs
将v1所有的流量镜像给v2版本
Traffic-Mirroring/mirrors-httpbin-v1-2-v2.yaml
yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: httpbin
spec:
hosts:
- httpbin
http:
- route:
- destination:
host: httpbin
subset: v1
weight: 100
mirror:
host: httpbin
subset: v2
mirrorPercentage:
value: 100.0
部署vs
bash
kubectl apply -f Traffic-Mirroring/mirrors-httpbin-v1-2-v2.yaml
2.2.2 测试访问
通过sleep容器向httpbin发起访问
bash
kubectl exec deployments/sleep -- curl -sS http://httpbin:8000/headers
由于所有流量都被发给v1并且镜像给了v2,所以v1有一条访问记录,v2在同一时间也有一条相同的访问记录
bash
kubectl logs deployments/httpbin-v1
kubectl logs deployments/httpbin-v2
至此Istio的流量镜像 Traffic Mirroring 实验完成.