istio的基本特性

前言

本章主要介绍istio的三个特性,可观测性,弹性容错,流量路由特性

一.可观测性

由于sidecar在访问路径的两端,流量的进出都需要都过sidecar。

istio主要收集两类指标:

1.应用指标数据,例如:qps,失败总数,95/99线等

2.分布式追踪链路

1.应用指标数据

结合之前安装的附加支持组件,收集和展示metrics通过Prometheus and Grafana。

启动grafana

$ istioctl dashboard grafana

http:/ . /localhost:3000
访问地址后,选择istio service dashboard,在下拉框中选择出你的服务
webapp.istioinaction.svc.cluster.local,如下图展示
此时由于没有访问量,因此grafana上还没有数据展示,执行下面命令,进行访问pod
$ while true; do curl http:/ . /localhost/api/catalog; sleep .5; done

可以观察到下图中有数据产生,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的三大特性,可观测性,弹性容错,流量路由特性;结合实际的用例进行展示,后续将详细的介绍其原理和更丰富场景

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值