前言
本章主要介绍istio的三个特性,可观测性,弹性容错,流量路由特性
一.可观测性
由于sidecar在访问路径的两端,流量的进出都需要都过sidecar。
istio主要收集两类指标:
1.应用指标数据,例如:qps,失败总数,95/99线等
2.分布式追踪链路
1.应用指标数据
结合之前安装的附加支持组件,收集和展示metrics通过Prometheus and Grafana。
启动grafana
$ istioctl dashboard grafana
可以观察到下图中有数据产生,qps,成功率,P50/P90/P99线等
2.分布式追踪链路
分布式追踪dashboard使用之前的附加组件jaeger,使用命令打开
$ istioctl dashboard jaeger
http:/./localhost:16686
点击一通请求,从网关istio-ingressgateway进入,经过webapp service到catalog service;应用可以在http头中带上自己的标识传到下一个链路上,应用之间可以使用这个标识做些判断,istio并不知道标识的含义,istio会将其上送到追踪引擎中。
二.弹性容错
服务webapp请求catalog可能存在网络上的失败,之前会依赖框架jar配置执行重试,超时,熔断等一系列策略。现在istio可以不在 应用侧实现这些功能,sidecar可以实现这些弹性容错策略。
执行下面脚本,catalog服务100%返回错误
./bin/chaos.sh 500 100
#!/usr/bin/env bash
if [ $1 == "500" ]; then
POD=$(kubectl get pod | grep catalog | awk '{ print $1 }')
echo $POD
for p in $POD; do
if [ ${2:-"false"} == "delete" ]; then
echo "Deleting 500 rule from $p"
kubectl exec -c catalog -it $p -- curl -X POST -H "Content-Type: application/json" -d '{"active":
false, "type": "500"}' localhost:3000/blowup
else
PERCENTAGE=${2:-100}
kubectl exec -c catalog -it $p -- curl -X POST -H "Content-Type: application/json" -d '{"active":
true, "type": "500", "percentage": '"${PERCENTAGE}"'}' localhost:3000/blowup
echo ""
fi
done
fi
再次调用curl -v http:/./localhost/api/catalog,会返回500错误
为了验证isito会自动重试,./bin/chaos.sh 500 50将错误调整为50%,然后设置catalog的VirtualService,5xx失败时会自动重试3次
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: catalog
spec:
hosts:
- catalog
http:
- route:
- destination:
host: catalog
retries:
attempts: 3
retryOn: 5xx
perTryTimeout: 2s
再次执行
while true; do curl http:/./localhost/api/catalog ; sleep .5; done
会发现500错误少了很多,仅仅增加些许配置就可以实现弹性容错,最后删除掉脚本
./bin/chaos.sh 500 delete
三.流量路由
istio通过DestinationRule支持路由流量,不同标识的请求访问不同的版本,支持流量灰度发布
部署catalog v2版本
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: catalog
version: v2
name: catalog-v2
spec:
replicas: 1
selector:
matchLabels:
app: catalog
version: v2
template:
metadata:
labels:
app: catalog
version: v2
spec:
containers:
- env:
- name: KUBERNETES_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: SHOW_IMAGE
value: "true"
image: istioinaction/catalog:latest
imagePullPolicy: IfNotPresent
name: catalog
ports:
- containerPort: 3000
name: http
protocol: TCP
securityContext:
privileged: false
生成一个v2 catalog,其中会多返回一个url链接,现在访问http://localhost/api/catalog,由于负载均衡,几乎50%返回有图片,50%返回无图片。
为了实现流量的路由,部署DestinationRule
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: catalog
spec:
host: catalog
subsets:
- name: version-v1
labels:
version: v1
- name: version-v2
labels:
version: v2
然后部署VirtualService,实现流量全部路由到v1版本
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: catalog
spec:
hosts:
- catalog
http:
- route:
- destination:
host: catalog
subset: version-v1
这个时候进行访问,会发现流量都进去了v1版本,返回的都是无图片数据
接下来我们调整VirtualService,让其按条件支持流量路由到v1和v2版本上,VirtualService支持通过匹配不同的request path,cookie,headers进行路由。现在使用新版本的VirtualService
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: catalog
spec:
hosts:
- catalog
http:
- match:
- headers:
x-dark-launch:
exact: "v2"
route:
- destination:
host: catalog
subset: version-v2
- route:
- destination:
host: catalog
subset: version-v1
访问curl http://localhost/api/catalog -H "x-dark-launch: v2",在请求头中加上自定义键值对,VirtualService的匹配规则命中,将流量导入v2版本,其余的导入v1版本,返回如下
总结
本章简单的介绍istio的三大特性,可观测性,弹性容错,流量路由特性;结合实际的用例进行展示,后续将详细的介绍其原理和更丰富场景