1. 了解DR

DestinationRule定义的是经过VS之后,已经到达service的流量,主要可以用于:

  1. 定义子集
  2. 定义流量管理
    1. LB策略
      LB算法
      哈希一致性算法
    2. 连接池
    3. 异常处理

2. 定义子集

定义dr的时候,要指定此dr用于在哪个service上

2.1 创建dr

1
2
3
4
5
6
7
8
9
10
11
12
13
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: mydr
spec:
host: svc4
subsets:
- name: v1
labels:
run: pod1
- name: v2
labels:
run: pod2

2.2 创建vs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: myvs
spec:
hosts:
- "aa.rhce.cc"
- svc1
gateways:
- mygw
http:
- route:
- destination:
host: svc4
subset: v1
weight: 30
- destination:
host: svc4
subset: v2
weight: 70

验证流量

3. 流量管理

3.1 tls

是否启用tls

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: mydr
spec:
host: svc4
trafficPolicy:
tls:
mode: SIMPLE
subsets:
- name: v1
labels:
run: pod1
- name: v2
labels:
run: pod2

DISABLE 不要设置到上游端点的 TLS 连接
SIMPLE 发起到上游端点的 TLS 连接
MUTUAL 通过提供客户端证书进行身份验证,使用双向 TLS 保护与上游的连接
ISTIO_MUTUAL 通过提供客户端证书进行身份验证,使用双向 TLS 保护与上游的连接。与 Mutual 模式相比,该模式使用 Istio 自动生成的证书进行 mTLS 身份验证。使用此模式时,所有其他字段ClientTLSSettings应为空。

3.1 LB调度算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: mydr
spec:
host: svc4
trafficPolicy:
tls:
mode: DISABLE
loadBalancer:
simple: RANDOM
subsets:
- name: v1
labels:
run: pod1
- name: v2
labels:
run: pod2

3.2 会话保持

会话保持的目的是,让同一个客户端访问的时候,访问到同一个pod上,istio用一致性哈希算法实现了会话保持。

在trafficPolicy.loadBalancer.consistentHash里的字段包括:
  httpHeaderName: 根据HTTP Header获取哈希值
 httpCookie: 根据HTTP Cookie获取哈希值
 userSourceIp: 根据源IP获取哈希值
 minimumRingSize: 哈希环所需的最小虚拟节点数量,默认值为1024

 使用httpCookie时的字段:
  name: cookie的名称
  path: 设置cookie的路径
  ttl:cookie的生命期

3.2.1 基于cookie会话保持

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: mydr
spec:
host: svc4
trafficPolicy:
tls:
mode: DISABLE
loadBalancer:
consistentHash:
httpCookie:
name: user
ttl: 60s
subsets:
- name: v1
labels:
run: pod1
- name: v2
labels:
run: pod2

3.2.1 基于IP地址的会话保持

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: mydr
spec:
host: svc4
trafficPolicy:
tls:
mode: DISABLE
loadBalancer:
consistentHash:
userSourceIp: true
subsets:
- name: v1
labels:
run: pod1
- name: v2
labels:
run: pod2

4. 熔断

当A服务访问B服务的时候,访问量大,会给B服务带来压力,所以这个时候可以禁止访问B服务。这个就叫做熔断。

4.1 一些概念

连接数:
客户端向服务端发请求,需要建立TCP连接,那么建立TCP连接的数量就是连接数。
并发连接数(SBC):每秒建立的TCP连接数

请求数:
客户端建立连接后,先服务端发送GET/POST/HEAD数据包,服务器返回结果两种情况:
 1、http数据包头有close字段,关闭连接
 2、http数据包头有keep-live字段,本次连接不关闭,可以下一次继续发送请求,减少TCP连接
并发请求数(QPS):每秒钟处理的请求数

4.2 连接池

熔断的定义是在DR里定义的,主要有2部分

trafficPolicy:
 用于定义连接池
 连接池的定义分成两类:
  TCP连接
   maxConncections: 到目标主机的最大连接数
   connectTimeOut: TCP连接超时,最小值必须要大于1ms

  Thttp连接
   http1MaxPendingReguests: 针对一个目标的HTTP请求最大排队数量,默认是1024
   http2MaxRequests: 对一个后端的最大请求数
   maxRequestsPerConnection:
   maxReties: 在给定的时间,集群所有主机最大重试数,默认值为3

4.3 定义熔断

最多允许2个并发连接数,最多1个排队

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: mydr
spec:
host: svc4
trafficPolicy:
connectionPool:
tcp:
maxConnections: 2
http:
http1MaxPendingRequests: 1
maxRequestsPerConnection: 1
tls:
mode: DISABLE
loadBalancer:
consistentHash:
httpCookie:
name: user
ttl: 60s
subsets:
- name: v1
labels:
run: pod1
- name: v2
labels:
run: pod2

4.4 压测

1
fortio load -c 2 -n 20 -qps 0 http://aa.rhce.cc

#命令解释如下:
-c 表示并发数
-n 一共多少请求
-qps 每秒查询数,0 表示不限制

4.5 不同端口定义策略

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: mydr
spec:
host: svc4
trafficPolicy:
connectionPool:
tcp:
maxConnections: 2
http:
http1MaxPendingRequests: 1
maxRequestsPerConnection: 1
portLevelSettings:
- port:
number: 8888
connectionPool:
tcp:
maxConnections: 10
tls:
mode: DISABLE
loadBalancer:
consistentHash:
httpCookie:
name: user
ttl: 60s
subsets:
- name: v1
labels:
run: pod1
- name: v2
labels:
run: pod2

5. 异常处理

outlierDetection:用于定义熔断的条件,达到什么条件就开始熔断
consecutiveGatewayErrors: 1 连续错误几次开始熔断,该实例会被踢掉
interval:驱逐检查的时间间隔(驱逐检测的统计时间),默认为10秒

baseEjectionTime指定来一个实例被踢掉之后,最少多长时间之后加回来,如果连续触发熔断,熔断的时长会乘以相应的倍数,时间默认为30秒一个服务被驱逐的时间等于驱逐次数乘以最小驱逐时间,所以被驱逐的实例再被再次驱逐时会变得越来越长
maxEjectionPercent:服务的可驱逐故障实例的最大比例,默认为10%。官方不建议配置过高,过分的驱逐会影响服务的服务能力
minHealthPercent:最小健康比例,当负载的实例中,如果健康的实例数量低于这个比例,istio会进入恐慌模式,异常检查功能会被禁用,所有的服务不论是否是故障实例都可以接受请求。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: mydr
spec:
host: svc4
trafficPolicy:
connectionPool:
tcp:
maxConnections: 2
http:
http1MaxPendingRequests: 1
maxRequestsPerConnection: 1
portLevelSettings:
- port:
number: 8888
connectionPool:
tcp:
maxConnections: 10
outlierDetection:
consecutiveGatewayErrors: 1
interval: 10s
baseEjectionTime: 3m
maxEjectionPercent: 100
tls:
mode: DISABLE
loadBalancer:
consistentHash:
httpCookie:
name: user
ttl: 60s
subsets:
- name: v1
labels:
run: pod1
- name: v2
labels:
run: pod2