1. 了解DR
DestinationRule定义的是经过VS之后,已经到达service的流量,主要可以用于:
- 定义子集
- 定义流量管理
- LB策略
LB算法
哈希一致性算法
- 连接池
- 异常处理
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
|