跳到主要内容

DR流量管理

1.基础用法

创建Service同时转发到pod1和pod2

kubectl label pod pod1 xx=xx
kubectl label pod pod2 xx=xx
kubectl expose --name=svc3 pod pod1 --port=80 --selector=xx=xx

DestinationRule定义子集,VS引用子集

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: mydr
spec:
host: svc1
subsets:
- name: v1
labels:
run: pod1
- name: v2
labels:
run: pod2

VS内配置每个子集的权重

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: myvs
spec:
hosts:
- "aa.xiebo.pro"
gateways:
- mygw
http:
- route:
- destination:
host: svc1
subset: v1
weight: 65
- destination:
host: svc1
subset: v2
weight: 35

2.是否启用tls

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: mydr
spec:
host: svc1
trafficPolicy:
tls:
mode: SIMPLE
  • DISABLE 不要设置到上游端点的 TLS 连接。

  • SIMPLE 发起到上游端点的 TLS 连接。

  • MUTUAL 通过提供客户端证书进行身份验证,使用双向 TLS 保护与上游的连接。

  • ISTIO_MUTUAL 通过提供客户端证书进行身份验证,使用双向 TLS 保护与上游的连接。

    • 与 Mutual 模式相比,该模式使用 Istio 自动生成的证书进行 mTLS 身份验证。 使用此模式时,所有其他字段ClientTLSSettings应为空

3.LB调度算法

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: mydrLEAST_REQUEST
spec:
host: svc3
trafficPolicy:
loadBalancer:
#simple: RANDOM #默认的负载均衡策略模型为随机
simple: LEAST_REQUEST #请求将转发到请求数量最少的实例
#simple: PASSTHROUGH #将连接转发到调用者请求的原始IP地址,不进行任何形式的负载均衡
#simple:ROUND_ROBIN #一个基本的轮询负载均衡策略,这对于许多场景(如端点加权)是不安全的,建议使用LEAST_REQUEST

完整样例

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: mydr
spec:
host: svc1
trafficPolicy:
loadBalancer:
simple: RANDOM
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN
- name: v3
labels:
version: v3

4.会话保持

注:会话保持并不能在多子集的情况下保持会话在同一子集,只能在子集内保持请求到同一pod

  • 在trafficPolicy.loadBalancer.consistentHash里的字段包括:
    • httpHeaderName: 根据HTTP Header获取哈希值
    • httpCookie: 根据HTTP Cookie获取哈希值
      • 使用httpCookie时的字段:
        • name: cookie的名称
        • path: 设置cookie的路径
        • ttl:cookie的生命期
    • userSourceIp: 根据源IP获取哈希值
    • minimumRingSize: 哈希环所需的最小虚拟节点数量,默认值为1024
    • 使用httpCookie时的字段:
      • name: cookie的名称
      • path: 设置cookie的路径
      • ttl:cookie的生命期

样例

VirtualService

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: myvs2
spec:
hosts:
- "bb.xiebo.pro"
gateways:
- mygw
http:
- route:
- destination:
host: svc3
subset: v1

DestinationRoute

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: mydr
spec:
host: svc3
trafficPolicy:
loadBalancer:
consistentHash:
#基于IP的会话保持
useSourceIp: true
#基于cookie的会话保持
#httpCookie:
#name: user
#ttl: 60s
subsets:
- name: v1
labels:
xx: xx