叶工好容5-日志与监控
目录
前言
平台维度
docker运行状态
cAdvisor-日志采集者
Heapster-日志收集
metrics-server-出生决定成败
kube-state-metrics-不完美中的完美
应用维度
日志
部署方式
输出方式
工具选择
日志接入
监控
serviceMonitor
Annotation
Prometheus扩展性
Thanos
方案一:thanos sidecar + thanos query
方案二:thanos receive + thanos query
总结
前言
运维体系中的日志和监控是个频率很高的知识点,日志如何采集和收集?监控如何采集和收集?运行在容器云中的监控与云实例中的监控有什么本质区别?本篇将为大家解读这些概念并对当前主流工具进行简单介绍。
首先要强调的一点是,运行在容器云中业务的稳定性是由容器云平台稳定性和应用稳定性两部分决定的,而前者是公有云实例场景中不需要考虑的,也是容器云运维非常核心的一个模块。所以日志与监控也要按平台和应用两个维度来拆分。
平台维度
k8s是个很大的框架,对于它的监控也是个很复杂的问题,让我们从管理一个单独docker的视野开始,感受下平台监控体系是如何生长的。
docker运行状态
docker运行状态怎么知道?docker status命令可以知道容器运行的状态,但它的缺点太多了:只能手工敲命令,不能http协议,不能metric数据,总之不符合自动化管理的理念。
cAdvisor-日志采集者
为了解决docker status的缺陷,于是产生了cAdvisor。用工具替代手动,它可以采集容器状态和CPU等资源指标,核心分为machineInfo和containerInfo两个模块,从模块名称可以看出不仅可以采集容器的指标,还能采集宿主机的指标,在K8S中集成在Kubelet里作为默认启动项,每个node上运行一个cAdvisor。

cAdvisor帮我们解决了从手动到自动的过程,BUT,每个节点的cAdvisor指标需要单独采集,不适合大规模集群。
Heapster-日志收集
cAdvisor虽然能提供有用的平台数据,但其分散在每个node上,Heapster负责把它们收集后统一处理。Heapster的本质就是一个收集者,将每个Node上的cAdvisor的数据进行汇总,然后导到第三方工具。
到此为止我们解决了监控的问题,但还没有解决告警问题,那就是Prometheus的天下了,但Prometheus对监控数据格式有要求,必须按照metric的格式来,很遗憾Heapster不支持!
metrics-server-出生决定成败
为了稳固Prometheus(云原生监控一哥)的地位,Heapster被废弃,metrics-server上位。可以说metrics-server要干的事跟Heapster要干的事基本是一样的,但metrics-server通过 kube-apiserver ( /apis/metrics.k8s.io/)可以将metric数据暴漏出来。
整个调用链是这样的:Prometheus->metrics-server->kubelet->cAdvisor
kube-state-metrics-不完美中的完美
metrics-server并不是完美的,有些k8s特定的场景它的监控指标并不能支持,例如:pod有没有重启过?伸缩有没有成功?所以新的帮手出现了kube-state-metrics
metric-server和kube-state-metrics是共生的关系,它们侧重点不一样。metric-server关注的是k8s的资源监控指标,kube-state-metrics关注于获取 k8s 各种资源的最新状态。
metric-server仅仅是获取、格式化现有数据,写入特定的存储,实质上是一个监控系统。而kube-state-metrics是将k8s的运行状况在内存中做了个快照,并且获取新的指标,但他没有能力导出这些指标
应用维度
日志
部署方式
应用日志采集在设计上分为DaemonSet和SideCar两种方式,前者是运行在node上,后者是运行在pod上,那我们该如何取舍呢?
DaemonSet在稳定性、侵入性、资源占用方面有优势,但隔离性、性能方面SideCar方式更好。我们实践中会优先使用DaemonSet方式采集日志。如果某个服务日志量较大、吞吐量较高,可以考虑为该服务的Pod配置Sidecar方式采集日志。
输出方式
应用日志的输出方式分为stdout和文件两种方式,云原生12要素主推的是stdout,但实际情况是做不到!一方面需要研发团队愿意陪你改造,另一方面确实有按场景输出到不同文件的需求。
工具选择
日志收集从古至今出现了不下于5种主流的角色(loggie、Filebeat、Fluentd、Logstash、Flume),我们该如何取舍呢?
结论1:工具没有好坏,只有是否合适。结论2:我们用的是loggie。出于性能上的考虑,首先淘汰掉Logstash和Flume;处于输出到文件的考虑,又淘汰掉Filebeat和Fluentd,所以留给我们的只有loggie了。

日志接入
容器云黑科技的接入基本都是通过CRD,loggie也是这样实现的。定义了一种叫LogConfig的资源,在它的manifest中通过spec.selector属性显式的定义了满足什么label的pod需要走什么样的pipeline。
监控
应用的监控就是面向服务的监控,k8s中的服务就是service,怎么能知道哪些service需要被Prometheus监控?监控哪个入口?service中动态的pod如何自动注册到Prometheus中来?这一些列负载并且有关联的信息如何维护和管理?答案还是CRD,定义了一种叫serviceMonitor的资源
serviceMonitor
这里细节比较多,展开来解释下,首先定义一个serviceMonitor,里面描述了满足什么条件的pod会去如何与Prometheus交互
---
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:labels:Service: demo-exportername: demo-exporternamespace: monitoring
spec:endpoints:## 与Prometheus交互的间隔- interval: 60s## 获取metrics数据的端口,匹配的service中定义的端口名称port: demo-exporter-port## 获取metrics数据的pathpath: /metricsrelabelings:## 数据在Prometheus中打什么样的标签- sourceLabels: [__meta_kubernetes_pod_label_Cluster]targetLabel: Cluster- sourceLabels: [__meta_kubernetes_pod_label_Service]targetLabel: ServicenamespaceSelector:## 生效的命名空间列表matchNames:- prod- gray- canaryselector:matchLabels:## 生效pod的条件openMonitor: "on"
service中打开该开关即可
---
apiVersion: v1
kind: Service
metadata:name: foo-web-prodlabels:Cluster: fooService: foo-webopenMonitor: "on"namespace: prod
spec:clusterIP: Noneselector:CPX: prodService: foo-webports:- port: 80name: httptargetPort: 80- port: 8088name: demo-exporter-porttargetPort: 8088
serviceMonitor的方式用起来还是不够爽,有没有更简洁的接入方式呢?有,annotation!
Annotation
设计思路是,我们不去专门为每个service提前定义描述文件,而是让它们自己配置要怎么加入Prometheus,例如
spec:template:metadata:annotations:prometheus.io/path: /stats/prometheus #指定pathprometheus.io/port: "8088" #指定端口prometheus.io/scrape: "true" #启用prometheus.io
这种设计需要改造两个地方,一个是自动发现,配置了annotation的就可以接入;一个是标签,可以保持pod自身的标签注入到Prometheus中。
参考文章:Prometheus Operator高级配置 · 从 Docker 到 Kubernetes 进阶手册
这种设计思路虽然用起来贼爽,但也有缺陷,如果需要监控多个端口还得另想办法,serviceMonitor就不存在这个问题,它是支持多端口的,endpoints配置是个列表。
Prometheus扩展性
从前面内容看得出无论是平台监控还是应用监控都离Prometheus,但是咱这个云原生一哥也有他自身的缺陷,那就是扩展性。Prometheus虽然性能强劲,但是从设计出就是个单机产品,算力、存储、网络吞吐都会成为压死骆驼的最后一根稻草,在互联网级别的监控体系中需要“分布式”Prometheus才能扛得住生产的压力。
Thanos
为了解决Prometheus单机瓶颈,Thanos横空出世。它也有两种落地方案,各有优劣。
方案一:thanos sidecar + thanos query

方案二:thanos receive + thanos query
sidecar方案优点:落地简单,只需要引入sidecar就好;
sidecar方案缺点:查询时Query效率不会太快,Prometheus如果挂了可能会丢失近期数据。
receive方案优点:结构清晰,Prometheus无状态,挂了不会丢数据,Query效率比sidecar方案高且可扩展。
receive方案缺点:需要新增和维护一套分布式存储,Prometheus远程写带来的延时对使用有多大影响也需要评估。
总结
学习技术并不只是学会一个工具怎么用,而是要学会一个工具是怎么来的,它的前世今生和这个领域从古至今的历史。一个工具势必是为了解决某个问题而被发明的,但它很可能又会在解决旧问题时引入新的缺陷。工具没有银弹,方案设计就是根据自己场景选择优点忍受缺点的过程。
相关文章:
叶工好容5-日志与监控
目录 前言 平台维度 docker运行状态 cAdvisor-日志采集者 Heapster-日志收集 metrics-server-出生决定成败 kube-state-metrics-不完美中的完美 应用维度 日志 部署方式 输出方式 工具选择 日志接入 监控 serviceMonitor Annotation Prometheus扩展性 Thanos …...
Dubbo 指定调用固定ip+port dubbo调用指定服务 dubbo调用不随机 dubbo自定义调用服务 dubbo点对点通信 dubbo指定ip
1. 在写分布式im时nami-im: 分布式im, 集群 zookeeper netty kafka nacos rpc主要为gate(长连接服务) logic (业务) lsb (负载均衡)store(存储) - Gitee.com,需要指定某一…...
BCNet论文精读
Title—标题 Boundary Constraint Network(边界约束网络) With Cross Layer Feature Integration(跨层特征融合) for Polyp Segmentation(息肉分割) 结构分析 标题结构由三部分组成,分别是本文…...
PHP8的注释-PHP8知识详解
欢迎你来到PHP服务网,学习《PHP8知识详解》系列教程,本文学习的是《PHP8的注释》。 什么是注释? 注释是在程序代码中添加的文本,用于解释和说明代码的功能、逻辑或其他相关信息。注释通常不会被编译器或解释器处理,而…...
优化企业集成架构:iPaaS集成平台助力数字化转型
前言 在数字化时代全面来临之际,企业正面临着前所未有的挑战与机遇。技术的迅猛发展与数字化转型正在彻底颠覆各行各业的格局,不断推动着企业迈向新的前程。然而,这一数字化时代亦衍生出一系列复杂而深奥的难题:各异系统之间数据…...
前端存储之sessionStorage和localStorage
sessionStorage sessionStorage是一种用于web浏览器中临时保存数据的客户端存储机制。它允许在同一个浏览器窗口的会话期间,保存和访问临时数据,而这些数据在用户关闭窗口或者标签页会被清除。每个sessionStorage对象都与当前的浏览器会话相关联&#x…...
上海亚商投顾:沪指放量大涨1.84% 证券股掀涨停潮
上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 市场情绪 三大指数今日低开高走,沪指午后放量涨近2%,上证50盘中大涨超3%。大金融板块全线爆发&#…...
微服务划分的原则
微服务的划分 微服务的划分要保证的原则 单一职责原则 1、耦合性也称块间联系。指软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块的独立性则越差。模块间耦合高低取决于模块间接口的复杂性、调用的方式及…...
作业 - 3
[ 作业 - 3 ] Industrial Melanism: The Case of the Peppered Moth melanism n. 黑化;黑变病;黑色素沉着症 peppered adj. 用胡椒调味的;加胡椒的,撒胡椒粉的 pepper的过去分词和过去式 moth n. 蛾;飞蛾 Paragraph 2 Over a …...
MTK联发科安卓核心板MT8385(Genio 500)规格参数资料_性能介绍
简介 MT8385安卓核心板 是一个高度集成且功能强大的物联网平台,具有以下主要特性: l 四核 Arm Cortex-A73 处理器 l 四核Arm Cortex-A53处理器 l Arm Mali™-G72 MP3 3D 图形加速器 (GPU),带有 Vulkan 1.0、OpenGL ES 3.2 和 OpenCL™ 2.x …...
ChatGPT付费创作系统小程序端开发工具提示打开显示无法打开页面解决办法
很多会员在上传小程序前端时经常出现首页无法打开的情况,错误提示无法打开该页面,不支持打开,这种问题其实就是权限问题,页面是通过调用web-view访问,说明业务域名有问题,很多都是合法域名加了,…...
CVPR2023新作:pix2pix3D
Title: 3D-Aware Conditional Image SynthesisAffiliation: Carnegie Mellon University (卡内基梅隆大学)Authors: Kangle Deng, Gengshan Yang, Deva Ramanan, Jun-Yan ZhuKeywords: Image Synthesis, 3D-aware, Neural Radiance Fields, Interactive Editing, Conditional G…...
Django自定义用户错误记录
django.db.migrations.exceptions.InconsistentMigrationHistory: Migration admin.0001_initial is applied before its dependency mysit.0001_initial on database default.执行: 1 setttings.py: 先注释掉 django.contrib.admin 2 注释掉urls.py path(“admin/…...
Abaqus 导出单元刚度矩阵和全局刚度矩阵
Abaqus 导出单元刚度矩阵和全局刚度矩阵 首次创建:2023.7.29 最后更新:2023.7.29 如有什么改进的地方,欢迎大家讨论! 详细情况请查阅:Abaqus Analysis User’s Guide 一、Abaqus 导出单元刚度矩阵 1.生成单元刚度矩阵…...
Pytorch(一)
目录 一、基本操作 二、自动求导机制 三、线性回归DEMO 3.1模型的读取与保存 3.2利用GPU训练时 四、常见的Tensor形式 五、Hub模块 一、基本操作 操作代码如下: import torch import numpy as np#创建一个矩阵 x1 torch.empty(5,3)# 随机值 x2 torch.rand(5,3)# 初始化…...
图数据库Neo4j学习三——cypher语法总结
1MATCH 1.1作用 MATCH是Cypher查询语言中用于从图数据库中检索数据的关键字。它的作用是在图中查找满足指定条件的节点和边,并返回这些节点和边的属性信息。 在MATCH语句中,通过节点标签和边类型来限定查找范围,然后通过WHERE语句来筛选符合…...
2023杭电多校第一场部分题解
还有些没补的题以后回来补。 索引 1001100210031005100910101012 1001 感觉是大暴力题,数据范围给的很小所以每次可以暴力求出两人的路径。枚举路径的交集里的点然后看看两个人在这个点相遇需要的最短时间就可以了。确定了具体的点之后求 4 4 4 次exgcd即可知道答…...
算法38:反转链表【O(n)方案】
一、需求 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1] 示例 2: 输入:head [1,2] 输出:[2,1] 示例3ÿ…...
redis基本架构:一个键值数据库包含什么?(这篇文章主要是一个引导的作用)
我们设计一个简单的smpliekv数据库,来体验简直数据库包含什么 体来说,一个键值数据库包括了访问框架、索引模块、操作模块和存储模块四部分(见 下图)。接下来,我们就从这四个部分入手,继续构建我们的 Simpl…...
HIS信息管理系统 HIS源码
HIS(Hospital Information System)是覆盖医院所有业务和业务全过程的信息管理系统。 HIS系统以财务信息、病人信息和物资信息为主线,通过对信息的收集、存储、传递、统计、分析、综合查询、报表输出和信息共享,及时为医院领导及各…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
