叶工好容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系统以财务信息、病人信息和物资信息为主线,通过对信息的收集、存储、传递、统计、分析、综合查询、报表输出和信息共享,及时为医院领导及各…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...
关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...
