Istio全栈监控

Posted 云时代的运维开发

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Istio全栈监控相关的知识,希望对你有一定的参考价值。


 

没关注?  伸出手指点这里


Service Mesh

云监控系列





    从单体应用到微服务架构、微服务容器化上云,我们需要管理和维护的服务变得越来越多,服务之间的调用关系越来越复杂,包括服务发现、负载平衡、故障恢复、监控度量和调用链路追踪在内的服务治理变得越来越重要。Istio是一个连接、管理和保护微服务的开放平台,它提供一种统一的方式来集成微服务、管理跨微服务的流量、实施策略和聚合遥测数据,解决了开发人员和运营商在单体应用程序向分布式微服务架构过渡时面临的挑战



Istio简介

Istio全栈监控  

    istio为可扩展性而设计,可以满足不同的部署需求。它使得创建一个包含负载平衡、服务到服务身份验证、监视等功能的已部署服务的网络变得非常容易,而服务代码中很少或根本没有代码更改。通过在整个环境中部署一个特殊的sidecar代理,截获微服务之间的所有网络通信,然后使用它的控制平面功能配置和管理istio,将istio支持添加到服务中,包括

  • 为HTTP、gRPC、WebSocket和TCP流量自动负载平衡

  • 通过丰富的路由规则、重试、故障转移和故障注入对流量行为进行细粒度控制

  • 一个可插拔策略层和配置API支持访问控制、速率限制和配额

  • 集群内所有入口和出口流量的自动监控、日志和追踪

  • 使用基于身份的强身份认证和授权来保护集群中服务到服务间通信

核心特点

  • 流量管理  istio的简单规则配置和流量路由允许您控制服务之间的流量和api调用,istio简化了诸如断路器、超时和重试等服务级别属性的配置,并使设置诸如A/B测试、金丝雀回滚和基于百分比流量分割等任务变得更轻而易举。有了更好的流量可见性和开箱即用的故障恢复功能,可以在问题产生之前发现问题,使调用更可靠,网络更健壮

  • 安全  istio的安全功能使开发人员无需专注于在应用程序级别的安全性,Istio提供了底层的安全通信通道,管理服务通信的身份认证、授权和加密。使用Istio服务通信在默认情况下使安全的,允许您在不同协议和运行时一致地执行策略--很少或根本不需要更改应用程序。Istio是平台独立的,与Kubernetes(或基础设施)网络策略一起使用的更有利,包括在网络和应用层保护pod-to-pod或service-to-service通信的能力

  • 可观测性  Istio强大的追踪、监控和日志记录功能让您能够深度观测服务网格部署。通过Istio的监控功能,可以真正了解服务性能如何影响上游和下游情况,而其自定义的仪表板提供了对所有服务性能的可见性,并让您了解该性能如何影响其他流程。Mixer组件负责策略控制和遥测收集,它提供了后端抽象和中介,将istio的其余部分与单个基础架构后端的实现细节隔离开来,并为操作员提供了对网格和基础架构后端之间的所有交互的细粒度控制

  • 平台支持  Istio是平台独立的,设计用于在各种环境上运行,包括跨云、内部部署、Kubernetes、Mesos等环境。可以将Istio部署在Kubernetes上,也可以运行在Consul上。Istio目前支持

    • 服务部署于Kubernetes

    • 使用Consul注册服务

    • 服务运行于单个虚拟机上

  • 集成和自定义  istio的策略执行组件可以扩展和定制,以与acl、日志记录、监视、配额、审核等现有解决方案集成

架构

    Istio服务网格在逻辑上分为数据平面和控制平面

数据平面  有一组作为sidecar部署的智能代理(Envoy)组成,这些代理与Mixer(一个通用策略和遥测集线器)一起调解和控制微服务之间的所有网络通信

控制平面  管理和控制代理以路由流量,此外控制平面配置Mixer以强制执行策略和遥测收集

Istio全栈监控

Envoy  Istio使用Envoy代理的扩展版本,它是使用C++开发的一个高性能代理,用于协调服务网格中所有服务的所有入站和出站流量,Istio利用了Envoy的许多内置功能,例如:

  • 动态服务发现

  • 负载平衡

  • TLS传输

  • HTTP/2 和 gRPC 代理

  • 断路器

  • 健康检查

  • 按阶段展开基于百分比的流量分割

  • 故障注入

  • 丰富的监控指标

    Envoy作为一个sidecar部署到相关服务的同一个Kubernetes Pod内,这中部署方式允许Istio将大量关于流量行为的信号提取为属性。在Mixer中可以使用这些属性来强制执行策略决策,并将它们发送到监控系统,以提供有关整个网格行为的信息。sidecar代理模型还允许您向现有部署中添加Istio功能,而无需重新编排和重写代码

    Mixer是平台独立的组件,mixer在服务网格中实施访问控制和使用策略,并从Envoy代理和其他代理收集遥测数据。代理抽取请求级别的属性,并将其发送到mixer进行评估。Mixer包括一个灵活的插件模型,此模型使Istio能够适配各种主机环境和基础架构后端并与它们进行交互,因此,Istio从这些细节中抽象除了Envoy代理和Istio管理的服务

    Pilot为Envoy sidecar提供服务发现、智能路由的流量管理功能(如A/B测试、金丝雀发布等)和弹性(超时、重试、断路器等)。Pilot将控制流量行为的高级路由规则转换为特定于Envoy的配置,并在运行时将它传播到sidecars。Pilot抽象了特定于平台的服务发现机制并将其合成为任何符合Envoy数据平面API的sidecar都可以使用的标准格式。这种松耦合允许istio在多个环境(如kubernetes、consul或nomad)上运行,同时为流量管理维护相同的操作员界面

    Citadel通过内置的身份和凭据管理实现了service-to-service和end-user身份验证。您可以使用Citadel升级服务网格中的未加密流量。使用citadel,运营商可以基于服务标识而不是相对不稳定的第3层或第4层网络标识来实施策略。从0.5版开始,您可以使用istio的授权功能来控制谁可以访问您的服务

    Galley是Istio的配置验证、摄取、处理和分发组件。它负责将其余的Istio组件与从底层平台(例如kubernetes)获取用户配置的细节隔离开来

设计目标

  • 最大透明度  要采用Istio,操作员或开发人员必须尽可能减少工作量,以便从系统中获得实际价值。Istio可以自动将自己注入到服务之间的所有网络路径中。Istio使用sidecar代理来捕获流量,并在可能的情况下,自动编程网络层以通过这些代理路由流量,而无需对部署的应用程序代码进行任何更改。在kubernetes中,代理被注入pods,流量被iptables程序规则捕获。一旦注入sidecar代理流量路由将被编程,Istio就可以调解所有流量。这一原则也适用于性能。将Istio应用于部署时,运营商会看到所提供功能的能最小化资源成本。组件和api的设计都必须考虑性能和规模

  • 扩展性  随着运营商和开发人员越来越依赖istio提供的功能,系统必须随着需求而丰富功能。在继续添加新特性的同时,最大的需求是能够扩展策略系统,与其他策略和控制源集成,并将网格行为的信号传播到其他系统进行分析。策略运行时支持插入其他服务的标准扩展机制。此外,它允许扩展其词汇表,以允许基于网格生成的新信号实施策略

  • 轻便性  Istio生态系统在许多不同维度使用。Istio必须以最小的成本在任何云端或本地环境中运行,将基于Istio的服务移植到新环境的任务必须足够简单

  • 策略一致性  将策略应用于服务之间的api调用可以提供对网格行为的控制。将策略应用到不限于api级别表示的资源也同样重要。例如,将配额应用于ML训练任务消耗的cpu量比将配额应用于启动工作的调用更有用。为此,Istio使用自己的api将策略系统维护为一个独立的服务,而不是将策略系统揉到代理sidecar中,允许服务根据需要直接与之集成

安装和卸载

# 下载 istio1.3.0 安装包wget https://github.com/istio/istio/releases/download/1.3.0/istio-1.3.0-linux.tar.gztar -zxvf istio-1.3.0-linux.tar.gzcd istio-1.3.0
# 通过 helm 工具安装 istio# 创建 istio-system namespacekubectl create namespace istio-system
# 安装 istio CRDhelm template install/kubernetes/helm/istio-init --name istio-init --namespace istio-system | kubectl apply -f -
# 验证全部 23 个 istio CRD 都被提交到 kubernetes API Serverkubectl get crds | grep 'istio.io' | wc -l23
# 官方推荐生产部署helm template install/kubernetes/helm/istio --name istio --namespace istio-system | kubectl apply -f -
# 验证安装,确保所有pod状态为Runningkubectl get svc -n istio-systemkubectl get pods -n istio-system
# 如果 Istio 是使用 helm template 命令安装,使用以下命令卸载,然后删除 istio-system 命名空间helm template install/kubernetes/helm/istio --name istio --namespace istio-system | kubectl delete -f -kubectl delete namespace istio-system
# 如果使用 Helm 和 Tiller 安装,使用以下命令卸载helm delete --purge istiohelm delete --purge istio-inithelm delete --purge istio-cni


    

Istio监控

Istio全栈监控

    Istio为网格内的所有服务通信生成详细的遥测。这种遥测技术提供了服务行为的可观察性,允许运营商对其应用程序进行故障排除、维护和优化,而不会给服务开发人员带来任何额外负担。通过Istio,运营商可以全面了解被监控的服务如何与其他服务以及Istio组件本身进行交互。Istio生成以下类型的遥测,以提供服务网格的总体可观测性


监控指标  Istio基于四个"黄金信号"的监控(延迟、流量、错误和饱和)生成一组服务指标,Istio还提供了网格控制平面的详细监控指标,还提供了在这些指标之上构建的默认网格监视仪表板集

    Metrics提供了一种监视和理解网格整体行为的方法,为了监视服务行为,Istio为Istio服务网格中的所有服务流量生成度量指标,这些指标提供了有关行为的信息,例如总流量、流量中的错误率和请求的响应时间

    除了监视网格中服务的行为外,监视网格本身的行为也很重要,Istio组件根据其自身的内部行为导出监控指标,以深入了解网格控制平面的运行状况和功能

    Istio监控指标集合由操作员配置驱动,操作员选择收集度量的方式和时间,以及监控指标本身的详细程度。这使运营商能够灵活地调整监控指标集合,以满足其个人需求

    监控指标按级别划分为以下类型

  • 代理级别的监控指标  Istio监控指标集合从sidecar代理(Envoy)开始,每个代理生成一组关于通过代理(入站和出站)的所有通信量的指标,代理还提供有关代理本身的管理功能的详细统计信息,包括配置和运行状况信息;Envoy代理生成的监控指标在Envoy资源(如侦听器和集群)的粒度上提供对网格的监视。因此,需要了解服务网格和Envoy资源之间的联系,以监控Envoy指标;Istio允许操作员选择在每个工作负载实例中生成和收集哪些Envoy监控指标。默认情况下,Istio只启用一小部分由特使生成的统计信息,以避免大量的指标造成后端压力,并减少与指标收集相关的cpu开销。但是,操作员可以在需要时轻松扩展收集的代理度量集。这使得能够有针对性地调试网络行为,同时降低跨网格监视的总体成本

    Envoy 统计信息收集   Envoy的主要目标之一是使网络易于理解。根据配置的不同,特使会发出大量的统计数据。一般来说,统计数据分为三类

  • 下游(Downstream)  下游统计与传入连接/请求相关。它们由侦听器、http连接管理器、tcp代理过滤器等发出

  • 上游(Upstream)  上游统计与传出连接/请求相关。它们由连接池、路由器筛选器、tcp代理筛选器等发出

  • 服务器(Server)  服务器统计信息描述特使服务器实例的工作方式。服务器正常运行时间或分配的内存量等统计信息在此分类

    单个代理场景通常包括下游和上游统计信息。这两种类型可用于获取特定网络hop的详细画像。来自整个网格的统计数据提供了每个hop和整个网络健康状况的非常详细的画像,发布的统计数据在操作指南中有详细的记录。在v2 API中,Envoy有能力支持定制的、可插拔的接收器,Envoy中包含一些标准的接收器实现,一些接收器还支持带有tags/维度的统计信息。统计信息都是通过一个规范的字符串表示来标识的,这些字符串的动态部分被剥离为tags,用户可以通过标记说明符来配置

    Envoy提供三种类型的统计指标

  • Counters  只增不减无符号整数,例如:请求总数

  • Gauges  可增可减无符号整数,例如:当前活动的请求

  • Histograms  无符号整数,是值流的一部分,然后由收集器聚合,最终生成汇总的百分位值。例如,上游请求时间

    在内部为提高性能Counters和Gauges定期批量刷新,Histograms在接收时写入

  • 服务级别的监控指标  Istio为监视服务通信提供了一组面向服务的监控指标,这些指标涵盖了四个基本的服务监控需求:延迟、流量、错误和饱和。Istio附带了一组默认的仪表盘,用于根据这些指标监视服务行为。默认的Istio监控指标由一组与Istio一起提供的配置工件定义,并默认导出到prometheus。运营商可以自由地修改这些度量的形状和内容,以及更改其收集机制,以满足其各自的监视需求

    收集指标  Demo中通过添加istio配置,指示mixer为网格内的所有流量自动生成和报告一个新的监控指标,新增的配置控制Mixer的三个功能

  • 从Istio属性生成实例(本例中为监控指标值)

  • 创建能够处理生成实例的处理程序(已配置的Mixer适配器)

  • 根据一组规则将实例分派给处理程序

    metrics配置指示mixer向prometheus发送监控值,它使用三个配置节(块) 实例(instance)配置、处理程序(handler)配置和规则(rule)配置

    收集TCP服务的指标  一些特定于TCP的属性在Istio中启用TCP策略和控制,这些属性由服务器端的Envoy代理生成。它们在连接建立时转发给Mixer,在连接处于活动状态时定期转发(定期报告),在连接关闭时转发(最终报告)。定期报告的默认时间间隔为10秒,至少应为1秒。此外,上下文属性提供了在策略中区分http和tcp协议的能力

TCP Attribute Flow(图片太大,不支持上传,可以访问原图链接)

https://istio.io/docs/tasks/telemetry/metrics/tcp-metrics/istio-tcp-attribute-flow.svg

  • 控制面板的监控指标  

  • Pilot

    Galley

    Mixer

    Citadel

    pormtheus默认能够抓取Istio自监控指标无需额外配置

分布式追踪  Istio为每个服务生成分布式跟踪span,为操作员提供对网格中的调用流和服务依赖性的详情

访问日志  当流量流入网格中的服务时,Istio可以生成每个请求的完整记录,包括源和目标元数据。此信息使操作员能够审核服务行为,直至单个工作负载实例级别




Demo

Istio全栈监控

    官方提供一个bookinfo应用程序,氛围四个独立的微服务

  • productpage  微服务调用详细信息并查看微服务以填充页面

  • details  包含图书信息

  • reviews  包含书评,它也叫收视率微服务。包含三个版本

    • 版本v1不调用分级服务

    • 版本v2调用评级服务,并将每个评级显示为1到5个黑星

    • v3版本调用评级服务,并将每个评级显示为1到5颗红星

  • ratings  包含书评附带的图书排名信息

其架构图为

Istio全栈监控

以bookinfo Demo为例展示Istio全栈监控

# 部署微服务 bookinfo 于 istio-system namespace(修改yaml文件增加metadata `namespace: istio-system`)kubectl label namespace istio-system istio-injection=enabledkubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
# 验证各个模块s是否runningkubectl -n istio-system get serviceskubectl -n istio-system get pods
# 通过来自某个pod(ratings)的curl命令向bookinfo发送请求,确认应用程序其正在运行kubectl exec -it $(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}') -c ratings -- curl productpage:9080/productpage | grep -o "<title>.*</title>"<title>Simple Bookstore App</title>
# 为应用程序定义ingress gatewaykubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yamlkubectl -n istio-system get gateway
export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].nodePort}')export INGRESS_HOST=$(kubectl get po -l istio=ingressgateway -n istio-system -o jsonpath='{.items[0].status.hostIP}')export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
# 确认可从群集中外部访问应用程序curl -s http://${GATEWAY_URL}/productpage | grep -o "<title>.*</title>"<title>Simple Bookstore App</title>
# 应用默认目标规则kubectl apply -f samples/bookinfo/networking/destination-rule-all.yamlkubectl -n istio-system get destinationrules -o yaml
# metrics.yaml文件定义double_request_count监控项的收集规则kubectl apply -f samples/bookinfo/telemetry/metrics.yaml# (可以多次)访问productpagecurl http://$GATEWAY_URL/productpage# expose prometheus,浏览器访问prometheus dashboardkubectl -n istio-system port-forward --address=0.0.0.0 $(kubectl -n istio-system get pod -l app=prometheus -o jsonpath='{.items[0].metadata.name}') 9090:9090 &# expose grafana查看监控大盘kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=grafana -o jsonpath='{.items[0].metadata.name}') 3000:3000 &# 查询double_request_count监控项(前缀istio_是默认添加的)istio_double_request_count{destination="details-v1",instance="172.17.0.12:42422",job="istio-mesh",message="twice the fun!",reporter="client",source="productpage-v1"} 8istio_double_request_count{destination="details-v1",instance="172.17.0.12:42422",job="istio-mesh",message="twice the fun!",reporter="server",source="productpage-v1"} 8istio_double_request_count{destination="istio-policy",instance="172.17.0.12:42422",job="istio-mesh",message="twice the fun!",reporter="server",source="details-v1"} 4istio_double_request_count{destination="istio-policy",instance="172.17.0.12:42422",job="istio-mesh",message="twice the fun!",reporter="server",source="istio-ingressgateway"}   4
# 收集新的遥测数据kubectl apply -f samples/bookinfo/telemetry/tcp-metrics.yamlkubectl apply -f samples/bookinfo/platform/kube/bookinfo-ratings-v2.yamlkubectl apply -f <(istioctl kube-inject -f samples/bookinfo/platform/kube/bookinfo-ratings-v2.yaml)kubectl apply -f samples/bookinfo/platform/kube/bookinfo-db.yamlkubectl apply -f samples/bookinfo/networking/destination-rule-all.yamlkubectl apply -f samples/bookinfo/networking/virtual-service-ratings-db.yamlcurl http://$GATEWAY_URL/productpage# 以上服务运行成功,可在prometheus dashboard查看metricsistio_mongo_received_bytes{destination_version="v1",instance="172.17.0.18:42422",job="istio-mesh",source_service="ratings-v2",source_version="v2"}
# jaeger dashboardkubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=jaeger -o jsonpath='{.items[0].metadata.name}') 15032:16686 &# 当bookinfo应用程序启动并运行时,访问http://$gateway_url/productpage一次或多次以生成追踪信息for i in `seq 1 100`; do curl -s -o /dev/null http://$GATEWAY_URL/productpage; done
# 网格可视化 kialiKIALI_USERNAME=$(read -p 'Kiali Username: ' uval && echo -n $uval | base64)KIALI_PASSPHRASE=$(read -sp 'Kiali Passphrase: ' pval && echo -n $pval | base64)NAMESPACE=istio-system
cat <<EOF | kubectl apply -f -apiVersion: v1kind: Secretmetadata: name: kiali namespace: $NAMESPACE labels: app: kialitype: Opaquedata: username: $KIALI_USERNAME passphrase: $KIALI_PASSPHRASEEOF
helm template --set kiali.enabled=true --set "kiali.dashboard.jaegerURL=http://jaeger-query:16686" --set "kiali.dashboard.grafanaURL=http://grafana:3000" install/kubernetes/helm/istio --name istio --namespace istio-system > $HOME/istio.yaml kubectl apply -f $HOME/istio.yaml
# 创建service graphkubectl -n istio-system get svc kiali
# (多次)浏览productpage页面curl http://$GATEWAY_URL/productpage
kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=kiali -o jsonpath='{.items[0].metadata.name}') 20001:20001 &
# 可以浏览器访问 http://localhost:20001/kiali/console,查看整个Mesh状态




小结

Istio全栈监控

    文章对下一代微服务Istio及全栈监控方法进行简单介绍,更多特性可以进一步探索




推 荐 阅 读

[1] https://istio.io

[2]https://prometheus.io

[3]https://www.kiali.io

[4]https://jaegertracing.io/

[5]https://grafana.com



Istio全栈监控











以上是关于Istio全栈监控的主要内容,如果未能解决你的问题,请参考以下文章

Istio是啥?

idou老师教你学Istio 20 : Istio全景监控与拓扑

Istio监控详解

在Play with Kubernetes平台上以测试驱动的方式部署Istio

idou老师教你学Istio :如何用istio实现监控和日志采集

谷歌IBM和Lyft联合推出开放源代码项目Istio