云原生 - Istio可观察性之监控(四)

作者:justmine
头条号:大数据与云原生
微信公众号:大数据与云原生
创作不易,在满足创作共用版权协议的基础上可以转载,但请以超链接形式注明出处。
为了方便阅读,微信公众号已按分类排版,后续的文章将在移动端首发,想学习云原生相关知识,请关注我

一、回顾

云原生 - 体验Istio的完美入门之旅(一)

云原生 - Why is istio(二)

云原生 - Istio可观察性之分布式跟踪(三)

[请持续关注...]

如前所述,业务微服务化后,每个单独的微服务可能会有很多副本,多个版本,这么多微服务之间的相互调用、管理和治理非常复杂,Istio统一封装了这块内容在代理层,最终形成一个分布式的微服务代理集群(服务网格)。管理员通过统一的控制平面来配置整个集群的应用流量、安全规则等,代理会自动从控制中心获取动态配置,根据用户的期望来改变行为。

话外音:借着微服务和容器化的东风,传统的代理摇身一变,成了如今炙手可热的服务网格。

Istio就是上面service mesh架构的一种实现,通过代理(默认是envoy)全面接管服务间通信,完全支持主流的通信协议HTTP/1.1,HTTP/2,gRPC ,TCP等;同时进一步细分控制中心,包括Pilot、Mixer、Citadel等。

话外音:后面系列会详细介绍控制中心的各个组件,请持续关注。

整体功能描述如下:

  • 连接(Connect)

    控制中心从集群中获取所有微服务的信息,并分发给代理,这样代理就能根据用户的期望来完成服务之间的通信(自动地服务发现、负载均衡、流量控制等)。

  • 保护(Secure)

    所有的流量都是通过代理,当代理接收到未加密流量时,可以自动做一次封装,把它升级成安全的加密流量。

  • 控制(Control)

    用户可以配置各种规则(比如 RBAC 授权、白名单、rate limit 、quota等),当代理发现服务之间的访问不符合这些规则,就直接拒绝掉。

  • 观察(Observe)

    所有的流量都经过代理,因此代理对整个集群的访问情况知道得一清二楚,它把这些数据上报到控制中心,那么管理员就能观察到整个集群的流量情况。

二、前言

作为服务网格的一个完整解决方案,为了追求完美,Istio高度抽象并设计了一个优雅的架构,涉及到众多的组件,它们分工协作,共同组成了完整的控制平面。为了更好地学习如何运用Istio的连接、安全、控制、可观察性全面地治理分布式微服务应用,先从战略上鸟瞰Istio,进一步从战术上学习Istio将更加容易,故作者决定从可观察性开始Istio的布道,先体验,再实践,最后落地,一步步爱上Istio,爱上云原生,充分利用云资源的优势,解放应用开发工程师的双手,使他们仅仅关注业务实现,让专业的人做专业的事,为企业创造更大的价值。

三、Istio的可观察性

1. 日志

当流量流入服务网格中的微服务时,Istio可以为每个请求生成完整的记录,包括源和目标的元数据等。使运维人员能够将服务行为的审查控制到单个微服务的级别。

2. 监控

Istio基于监控的4 个黄金信号(延迟、流量、错误、饱和度)来生成一系列的服务指标,同时还提供了一组默认的服务网格监控大盘。

话外音:Istio还为服务网格控制平面提供了更为详细的监控指标。

3. 分布式跟踪

Istio根据采样率为每个请求生成完整的分布式追踪轨迹,以便运维人员可以理解服务网格内微服务的依赖关系和调用流程。

可以看出,Istio的可观察性,致力于解决两方面的问题:

1、症状:什么病?

  • 是Istio的问题?

  • 哪个Istio组件的问题?

  • [...]

2、原因:为什么得这种病?

  • 怎样跟踪、分析、定位?

  • 是异常,还是偶然事件?

  • [...]

知晓了症状(什么)和原因(为什么),治病应该就信手拈来了吧,如果还不知如何治病,那就去格物致知吧。

话外音:不仅如此,Istio还支持按需降级或关闭某些功能的能力,请持续关注。

四、Why - 为什么需要监控?

在软件形态上,Service Mesh将业务系统中的非业务功能剥离到独立的中间件系统中。同时,为了解耦运维,以Sidecar的方式将中间系统注入到业务容器内,在落地过程中难免会面临稳定性、运维模式变化等诸多的问题与挑战,如何确保网格的生产稳定和可靠呢?

从设计之初,Istio都致力于建设一个高可用的基础架构,以防止服务质量降低而影响业务本身。为了跟踪分布式系统中的每个信号,Istio基于Google网站可靠性工程师小组(SRE)定义的四个监控关键指标,全面而详细地监控业务系统和自身。

黄金四信号:

  • 延迟(Latency)

    处理请求的时间,即发送请求和接收响应所需的时间,比如:请求成功与请求失败的延迟。

    在微服务中提倡“快速失败”,特别要注意那些延迟较大的错误请求。这些缓慢的错误请求会明显影响系统的性能,因此追踪这些错误请求的延迟是非常重要的。

  • 流量(Traffic)

    也称吞吐量,用于衡量系统的容量需求,即收到多少请求,比如:请求率(HTTP请求数/秒)。

    对于分布式系统,它可以帮助您提前规划容量以满足即将到来的需求等。

  • 错误(Errors)

    衡量系统发生的错误情况,比如:请求错误率。

  • 饱和度(Saturation)

    衡量网络和服务器等资源的负载,主要强调最能影响服务状态的受限制资源。

    每个资源都有一个限制,之后性能将降低或变得不可用。了解分布式系统的哪些部分可能首先变得饱和,以便在性能下降之前调整容量。

黄金四信号几乎深度覆盖了所有想知道到底怎么回事的相关信息,既是监控系统发现问题的关键,也是保障高可用基础性框架的关键。

话外音:分布式系统不同于单体应用,监控信号是异常检测的关键,是预警的重要积木。

五、What - Istio的监控?

为了监控应用服务行为,Istio为服务网格中所有出入的服务流量都生成了指标,例如总请求数、错误率和请求响应时间等。

为了监控服务网格本身,Istio组件可以导出自身内部行为的详细统计指标,以提供对服务网格控制平面功能和健康情况的洞察能力。

话外音:Istio指标收集可以由运维人员配置来驱动,即运维人员决定如何以及何时收集指标,以及收集的详细程度,灵活地调整指标收集策略来满足个性化的监控需求。

代理级别指标

Istio指标收集从sidecar代理(Envoy)开始,它为通过代理的所有流量(入站和出站)生成一组丰富的指标,同时允许运维人员为每个工作负载实例(微服务)配置如何生成和收集哪些指标。

Envoy统计信息收集详细说明:https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/observability/statistics.html?highlight=statistics

服务级别指标

除了代理级别指标之外,Istio还提供了一组用于监控服务通信的指标。这些指标涵盖了四个基本的服务监控需求:延迟、流量、错误、饱和度,同时Istio也提供了一组默认的仪表盘,用于监控基于这些指标的服务行为。

默认的Istio指标由Istio提供的配置集定义并默认导出到Prometheus。运维人员可以自由地修改这些指标的形态和内容,更改它们的收集机制,以满足各自的监控需求。

备注:运维人员也可以选择关闭服务级别指标的生成和收集。

控制面板指标

每一个Istio的组件(Pilot、Galley、Mixer等)都提供了对自身监控指标的集合。这些指标容许监控Istio自己的行为。

六、How - Istio监控是如何工作的?

1、部署监控大盘

root@just:~# istioctl manifest apply --set values.grafana.enabled=true
[...]
✔ Finished applying manifest for component Grafana.
[...]
root@just:~# kubectl -n istio-system get svc grafana -o yaml
apiVersion: v1
kind: Service
[...]name: grafananamespace: istio-system
spec:[...]type: NodePortports:[...]nodePort: 3000[...]

话外音:测试环境使用NodePort联网,仅供参考。

浏览器访问:http://[主机IP]:3000/dashboard/db/istio-mesh-dashboard。

微服务应用BookInfo监控大盘

为了更好的阅读体验,上面仅截取了部分监控,可以看出监控的四个黄金信号吧,同时,为了使指标统计更精确,有的指标还通过P50、P90、P99维度分别展示,避免长尾误导。除了业务监控,Istio也提供了自身平台的监控大盘,如下:

可以看出Istio的默认监控大盘非常全面,该监控的都监控起来了,到目前为止,大家已经从整体上了解和体验Istio的监控体系。

2、扩展新指标

为了支持个性化监控需求,Istio支持自定义指标来扩展监控体系,下面将添加一个新指标(将每个请求计数两次),并发送到Prometheus。

备注:Istio也支持自定义Mixer Adapter来支持其他监控后端。

2.1 定义指标

创建名为doublerequestcount的新指标,告诉Mixer如何根据Envoy报告的属性为请求创建指标维度和生成值,即对于doublerequestcount的每个instance,指示Mixer为它提供值2

备注:Istio将为每个请求生成一个Instance。

# Configuration for metric instances
apiVersion: config.istio.io/v1alpha2
kind: instance
metadata:name: doublerequestcount # metric namenamespace: istio-system
spec:compiledTemplate: metricparams:value: "2" # count each request twice# 表示指标的维度,为prometheus指标的{}部分。# 参考: {destination="",instance="",job="",message="",reporter="",source=""}`dimensions:reporter: conditional((context.reporter.kind | "inbound") == "outbound", "client", "server")source: source.workload.name | "unknown"destination: destination.workload.name | "unknown"message: '"twice the fun!"'monitored_resource_type: '"UNSPECIFIED"'

2.2 定义指标处理器

创建能够处理生成的instances的handlers,即告诉Prometheus适配器如何将收到的指标转换为Prometheus格式的指标。

# Configuration for a Prometheus handler
apiVersion: config.istio.io/v1alpha2
kind: handler
metadata:name: doublehandlernamespace: istio-system
spec:compiledAdapter: prometheusparams:metrics:# Prometheus metric name- name: double_request_count # Mixer instance name (完全限定名称)instance_name: doublerequestcount.instance.istio-system kind: COUNTER# 此处标签为doublerequestcount instance配置的dimensions。label_names:- reporter- source- destination- message

在指标名称之前,Prometheus适配器会添加了istio_前缀,因此该指标在Prometheus中最终名称为 istio_double_request_count

2.3 关联指标到处理器

根据一组rules向handlers分配instances,如下将网格中的所有请求生成的指标都发送到doublehandler处理器,也可以使用match条件,筛选指标。

# Rule to send metric instances to a Prometheus handler
apiVersion: config.istio.io/v1alpha2
kind: rule
metadata:name: doublepromnamespace: istio-system
spec:actions:- handler: doublehandlerinstances: [ doublerequestcount ]

2.4 通过Prometheus UI查看新指标

到目前为止,就可以在监控大盘(grafana)中使用该指标了。

七、总结

本篇先回顾了Istio历史系列文章,然后大致概述了Istio的整体功能,以及可观察性,最后从why、what、how的角度详细介绍了Istio的监控体系,并通过自定义指标演示了如何支持个性化监控需求。除了分布式跟踪、监控,Istio的可观察性还包括日志,敬请期待,请持续关注。

八、最后

如果有什么疑问和见解,欢迎评论区交流。

如果觉得本篇有帮助的话,欢迎推荐转发

如果觉得本篇非常不错的话,可以请作者吃个鸡腿,创作的源泉将如滔滔江水连绵不断,嘿嘿。

九、参考

https://istio.io/docs/concepts/observability

https://istio.io/docs/reference/config/policy-and-telemetry/metrics

https://istio.io/docs/ops/common-problems/observability-issues

https://raw.githubusercontent.com/istio/istio/master/install/kubernetes/helm/istio/charts/mixer/templates/config.yaml

https://istio.io/docs/tasks/observability/metrics/using-istio-dashboard

https://istio.io/docs/tasks/observability/metrics/collecting-metrics

https://istio.io/docs/tasks/observability/metrics/tcp-metrics

https://istio.io/docs/tasks/observability/metrics/querying-metrics

https://istio.io/docs/reference/config/policy-and-telemetry/adapters/prometheus

https://mp.weixin.qq.com/s/KMnIzA5i99ZSkAtIujVqJA

https://istio.io/docs/tasks/observability/metrics/collecting-metrics

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/311922.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

word List 09

word List 09 如果存在什么问题,欢迎批评指正!谢谢

phpword 模板 多页_高中数学:各题型答题模板,吃透,灵活运用数学公式,解题更快!...

暑假已经接近尾声,部分地区已经开学了。最近有同学留言说,高三了,数学成绩很不好,该怎么办?数学拉分很多。针对高三复习,大家一定要注意题型的积累,每个题型都是有相应的答题模板,积…

使用.NET Core优雅获取并展示最新疫情数据

前言新型冠状病毒的出现,着实让人紧张。我每天一大早都会去查看今天的最新数据,可是每次的数据都挺让人揪心的。今天突然间很想看看过去的历史的数据,结果查了很多资料都不是很全。反正国家让我们待在家里做贡献,那我们也可以多做…

linux源码_从linux源码看epoll及epoll实战揭秘

从linux源码看epoll前言在linux的高性能网络编程中,绕不开的就是epoll。和select、poll等系统调用相比,epoll在需要监视大量文件描述符并且其中只有少数活跃的时候,表现出无可比拟的优势。epoll能让内核记住所关注的描述符,并在对应的描述符事…

《ASP.NET Core 微服务实战》-- 读书笔记(第9章)

第 9 章 微服务系统的配置微服务系统中的配置需要关注更多其他方面的因素,包括:配置值的安全读写值变更的审计能力配置信息源本身的韧性和可靠性少量的环境变量难以承载大型、复杂的配置信息应用要决定是否支持配置值的在线更新和实时变更,还…

数据结构---简单插入排序

数据结构—简单插入排序 原理&#xff1a;参考趣学数据结构 代码&#xff1a; #include<stdio.h> #include<stdlib.h> void simpleInsertSort(int a[], int length) {//简单插入排序int j;for (int i 2; i < length; i) {//从第二个元素开始比较插入if (a[i]…

[蓝桥杯2018初赛]小朋友崇拜圈

题目描述 班里N个小朋友&#xff0c;每个人都有自己最崇拜的一个小朋友&#xff08;也可以是自己&#xff09;。 在一个游戏中&#xff0c;需要小朋友坐一个圈&#xff0c; 每个小朋友都有自己最崇拜的小朋友在他的右手边。 求满足条件的圈最大多少人&#xff1f; 小朋友编号为…

前端 JS/TS 调用 ASP.NET Core gRPC-Web

前言在上两篇文章中&#xff0c;介绍了ASP.NET Core 中的 gRPC-Web 实现 和 在 Blazor WebAssembly 中使用 gRPC-Web&#xff0c;实现了 Blazor WebAssembly 调用 ASP.NET Core gRPC-Web。虽然 ASP.NET Core 中的 gRPC-Web 实现目前还是试验性项目&#xff0c;但是鉴于它在生态…

数据结构---哈夫曼树

数据结构—哈夫曼树 原理&#xff1a;参考趣学数据结构 代码&#xff1a; #include<stdio.h> #include<stdlib.h> #define N 100 #define INF 2^31-1 typedef struct fNode {//哈夫曼树中每个节点的信息int c;//字符int parent;//父节点&#xff0c;左右孩子&am…

热电偶校验仪_热电偶校验方法_烟台一等热电偶,干湿两用温度校验炉公司

杭州中创为您详细解读hzzc6烟台一等热电偶的相关知识与详情&#xff0c;防爆涡轮流量计的转速通过拆正在机壳外的传感线圈来检测&#xff0e;当涡轮流量计叶片切割由壳体内**磁钢发生的磁力线时&#xff0c;就会引起传感线圈中的磁通变革&#xff0e;传感线圈将检测到的磁通周期…

手把手教你用C#做疫情传播仿真

手把手教你用C#做疫情传播仿真在上篇文章中&#xff0c;我介绍了用 C#做的疫情传播仿真程序的使用和配置&#xff0c;演示了其运行效果&#xff0c;但没有着重讲其中的代码。今天我将抽丝剥茧&#xff0c;手把手分析程序的架构&#xff0c;以及妙趣横生的细节。首先来回顾一下运…

word List 10

word List 10 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

java程序员选择多个offer时需要看重哪些?_对不起,我们公司不要本科以下的大学生,学历对于程序员重不重要...

来自普通大学的学生&#xff0c;总会觉得逆袭如梦似幻&#xff0c;机会在哪里&#xff1f;但放长远来看&#xff0c;更重要的是要看到&#xff1a;环境只能影响&#xff0c;却不能决定我们的人生。人生路漫长&#xff0c;最终会怎样&#xff0c;还不一定呢&#xff01;在某综艺…

中小企业团队敏捷产品开发流程最佳实践

近期因为疫情的影响&#xff0c;不少互联网公司开始尝试远程工作。也出不了少如何做好远程工作的方法&#xff0c;我认为不管是场地办公还是远程办公都依赖于原来的产品开发流程。我曾经遵循CMMI5的流程管理过15人左右的跨国/语言/文化团队&#xff0c;也遵循敏捷Scrum管理过9人…

数据结构---二叉线索树

数据结构—二叉线索树 原理&#xff1a;参考趣学数据结构 代码&#xff1a; #include<stdio.h> #include<stdlib.h> typedef struct bmTree {int data;struct bmTree* lchild, *rchild;int ltag, rtag; }bmTree; bmTree * preNULL;//中序遍历的前驱指针 void cr…

revit如何根据坐标进行画线_铭成教你如何根据同步带的齿形进行选型

1、同步带齿形分类梯型齿同步带分为&#xff1a;最轻型MXL、超轻型XXL、特轻型XL、轻型L、重型H、特重型XH、超重型XXH&#xff0c;共七种&#xff0c;这几种是目前市场用的最广泛的。特殊齿型的同步带又分为&#xff1a;最轻型T2.5、轻型T5、重型T10、最重型T20&#xff0c;现…

在VS Code里逛知乎、发文章?知乎 on VS Code来啦!重新定义内容创作!

本文为 牛岱 的原创文章在2020年2月10日首发于“玩转VS Code”知乎专栏你是否已经厌倦了知乎 Web 端文本编辑器糟糕的使用体验和时而出现的奇怪 Bug&#xff1f;身为程序员的你是否想用你最熟悉的 Markdown 语法写答案&#xff0c;并且获得最佳的代码块语法高亮&#xff1f;攥写…

线性代数---向量问题的求解方法

线性代数—向量问题的求解方法 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

java 定时_Java线上定时任务不定期挂掉问题分析

作者&#xff1a;IKNOW本尊问题背景收到频繁的告警邮件&#xff0c;定时任务调度失败&#xff0c;查看xxl-job的执行器列表是空的&#xff0c;但是服务又显示健康&#xff0c;查看历史任务执行记录发现执行器是依次递减&#xff0c;由于是线上服务&#xff0c;只能先重启&#…

gRPC in ASP.NET Core 3.x -- Protocol Buffer, Go语言的例子(上)

前两篇文章半年前写的&#xff1a;gRPC in ASP.NET Core 3.0 -- Protocol Buffer&#xff08;1&#xff09;&#xff0c;gRPC in ASP.NET Core 3.0 -- Protocol Buffer&#xff08;2&#xff09;之前把protocol buffer的基础知识讲了一遍&#xff0c;今天使用Go语言做一些例子。…