istio-http流量管理
Posted netonline
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了istio-http流量管理相关的知识,希望对你有一定的参考价值。
参考
1. 定义目标与规则
- istio 服务网格中对服务进行了进一步抽象:
- 可以使用 Pod 标签对具体的服务进程进行分组;
- 可以定义服务的负载均衡策略;
- 可以为服务指定 TLS 要求;
- 可以为服务设置连接池大小。
- istio 中,同一服务不同组别的后端被称为
子集(Subset)
,也经常被称为服务版本
。 - 在 istio 中,建议为每个网格都设置明确的目标访问规则,在通过 istio 流量控制之后,会选择明确的子集,根据规则或在子集中规定的流量策略来进行访问,这种规则被称为
DestinationRule
,样例如下:
规则需要注意的地方如下:cat flaskapp-destinationrule.yaml apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: flaskapp spec: host: flaskapp.default.svc.cluster.local trafficPolicy: loadBalancer: simple: LEAST_CONN subsets: - name: v1 labels: version: v1 trafficPolicy: loadBalancer: ROUND_ROBIN - name: v2 labels: version: v2
- host: 必要字段,代表1个
Service
资源,或1个ServiceEntry
定义的外部服务。- 建议:为防止不同命名空间服务重名,可以使用完全限定名。
- trafficPolicy: 流量策略,在
DestinationRule
与Subset
都可以定义,Subset
中的级别更高。 - subsets: 该字段使用标签选择器定义不同的子集。
- host: 必要字段,代表1个
2. 定义默认路由
2.1 定义默认路由
- 建议每个服务都创建1个默认路由,在没有特定的路由规则时,使用默认路由规则访问指定子集,一以此确保服务在默认情况下的行为稳定性,样例如下:
cat flaskapp-default-vs.yaml apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: flaskapp spec: hosts: - flaskapp.default.svc.cluster.local http: - route: - destination: host: flaskapp.default.svc.cluster.local subset: v1
- VirtualService: istio 流量控制过程中的枢纽,负责对流量进行甄别与转发。
- 针对主机名工作,但
hosts
字段是一个数组内容,可以针对多个主机名进行工作。 - 可以为多种协议的流量提供服务,如
http
,tcp
,tls
等。
- 针对主机名工作,但
- 在
http
的下一级,即具体的路由规则。- 支持多条路由。
2.2 验证
# 应用目标规则与默认路由
kubectl apply -f flaskapp-destinationrule.yaml
kubectl apply -f flaskapp-default-vs.yaml
# 验证,可同步观察 kiali & Jaeger 等
kubectl exec -it -c sleep $(kubectl get pod -l app=sleep,version=v1 -o jsonpath=‘{.items..metadata.name}‘) /bin/bash
bash-4.4# for i in `seq 100` ; do http --body http://flaskapp.default/env/version ; done
2.3 总结
在 istio 中部署1个业务应用时,建议:
- 使用
app
标签表明应用身份; - 使用
version
标签表明应用版本; - 创建目标规则;
- 创建默认路由规则,默认路由得配置清单应该成为服务网格环境下的必要部署内容。
3. 流量拆分与迁移
3.1 权重
cat flaskapp-default-vs.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: flaskapp
spec:
hosts:
- flaskapp.default.svc.cluster.local
http:
- route:
- destination:
host: flaskapp.default.svc.cluster.local
subset: v1
weight: 70
- destination:
host: flaskapp.default.svc.cluster.local
subset: v2
weight: 30
# 应用
kubectl apply -f flaskapp-default-vs.yaml
# 验证,可同步观察 kiali & Jaeger 等
# 因是权重的原因,验证时样本量需要大一些
kubectl exec -it -c sleep $(kubectl get pod -l app=sleep,version=v1 -o jsonpath=‘{.items..metadata.name}‘) /bin/bash
bash-4.4# for i in `seq 100` ; do http --body http://flaskapp.default/env/version ; done | awk -F "v1" ‘{print NF-1}‘
注意点:
- 流量分配是有权重的,且权重总和必须是
100
; - 如果不显示声明权重,则默认值是
100
。
3.2 获取 istio 对象
kubectl get
,kubectl api-resources
列出当前集群支持的所有对象类型- Kiali --> Istio Config
以上是关于istio-http流量管理的主要内容,如果未能解决你的问题,请参考以下文章