Istio DestinationRule 流量管控
· 阅读需 8 分钟
DestinationRule 是 VirtualService 路由生效后,配置应用于请求的策略集
dr 的作用:
- 定义子集
- 流量控制

DR的基本用法-定义子集
mkdir chap3 && cd chap3
cp chap2/vs.yaml chap2/mygw1.yaml chap3/
#清除之前环境的svc,再新建一个 svc 来负载 pod1 pod2
kubectl delete svc svc2
kubectl delete svc svc1
#给 pod1 pod2 设置同样的标签
kubectl label pod pod1 name=pod
kubectl label pod pod2 name=pod
kubectl get pods -l name=pod
#查看标签
kubectl get pods --show-label
#具有共同的标签 name=pod,不同的标签:run=pod1 ; run=pod2
# 虽然写的是pod1,但是还是根据selecter的标签
kubectl expose --name=svc1 pod pod1 --port=80 --selector=name=pod
#查看 svc1 关联的pod
kubectl describe svc svc1 #在Endpoints上可以看到已经关联了 pod1 pod2
# 编辑 vs yaml
vim vs.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: myvs
spec:
hosts:
- "aa.yuan.cc"
gateways:
- mygw
http:
- route:
- destination:
host: svc1
subset: xx #subset是自定的标识
weight: 55
- destination:
host: svc1
subset: yy
weight: 45
# 启动 vs
kubectl apply -f vs.yaml
# 定义dr,编辑 dr yaml
vim dr.yaml
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: mydr
spec:
host: svc1 #管理的是 svc1 的流量
subsets:
- name: xx #自定义,跟 vs 的 subset 做匹配
labels: #根据标签做匹配
#version: v1
run: pod1
- name: yy #自定义
labels:
#version: v2
run: pod2
# 启动 dr
kubectl apply -f dr.yaml
kubectl get dr
# 客户端测试
while true ; do curl aa.yuan.cc ; sleep 1 ; done
查看 kiali 权重图

蓝绿部署
# 定义dr,编辑 dr yaml
vim dr.yaml
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: mydr
spec:
host: svc1 #管理的是 svc1 的流量
subsets:
- name: v1 #自定义,跟 vs 的 subset 做匹配
labels: #根据标签做匹配
#version: v1
run: pod1
- name: v2 #自定义
labels:
#version: v2
run: pod2
# 编辑 vs yaml
vim vs.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: myvs
spec:
hosts:
- "aa.yuan.cc"
gateways:
- mygw
http:
- route:
- destination:
host: svc1
subset: v1 #subset是自定的标识
weight: 100
- destination:
host: svc1
subset: v2
weight: 0 # 在权重上做蓝绿部署,100 : 0
# 启动 vs,dr
kubectl apply -f dr.yaml
kubectl apply -f vs.yaml
# 查看 kiali 流量分布
金丝雀发布(灰度发布)
# 编辑 vs yaml
vim vs.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: myvs
spec:
hosts:
- "aa.yuan.cc"
gateways:
- mygw
http:
- route:
- destination:
host: svc1
subset: v1
weight: 100
- destination:
host: svc1
subset: v2
weight: 0
# 流量的变化
1、v2 并没有对任何人开放
2、v2 对极少一部分人开放 #将权重从 100:0 切为 90:10
3、v2 给更多的人开放 #权重继续更改...
会话保持
会话保持的目的是,让同一个客户端访问的时候,访问到同一个pod上,istio用一致性哈希算法实现
了会话保持。
在trafficPolicy.loadBalancer.consistentHash里的字段包括:
httpHeaderName: 根据HTTP Header获取哈希值
httpCookie: 根据HTTP Cookie获取哈希值 (根据 Cookie 来做会话保持)
userSourceIp: 根据源IP获取哈希值 (根据 IP 地址来做的会话保持)
minimumRingSize: 哈希环所需的最小虚拟节点数量,默认值为1024
使用httpCookie时的字段:
name: cookie的名称
path: 设置cookie的路径
ttl:cookie的生命期
while true ; do curl aa.rhce.cc --cookie "user=tester" --silent -w "Status: %{http_code}\n"; sleep 1 ; done