20.1 分析pull模型在k8s中的应用,对比push模型
本节重点介绍 :
- push模型和pull模型监控系统对比
- 为什么在k8s中只能用pull模型的
- k8s中主要组件的暴露地址说明
push模型和pull模型监控系统
- 对比下两种系统采用的不同采集模型,即push型采集和pull型采集。不同的模型在性能的考虑上是截然不同的。下面表格简单的说明了下两种模型的特点:
| 采集模型 | 原理简介 | 代表 |
|---|---|---|
| push | agent定时推送数据到server | 夜莺&open-falcon |
| pull | server定时去agent拉数据 | prometheus |
就采集器是否丰富来说
- 我们需要对比的是这个系统是否有很好的插件扩展机制,因为这直接决定了开源社区对该系统采集器贡献的活跃度
- prometheus采集的pull模型,使用者可以用自定义exporter的模式灵活的接入。
push型的致命缺点 agent和服务端强耦合
- 那就是agent需要配置服务端地址,带来了一定的耦合性,不适合云原生场景。
- 如果采用push型,试想一下你的应用部署在k8s中,在启动的时候需要指定监控上报的服务地址,那是不能接受的。
- 类比pushgateway的例子
pusher = push.New(url, jobName)必须要指定服务端的地址
如果push端的服务地址变化了怎么办
- 一个典型的场景就是在k8s中,pod的扩缩十分频繁,服务端的地址也不固定。
pull型的处理方法
- 对比来说,应用pull模型采集的prometheus,可以对接多种服务发现源,特别适合k8s环境。
- 举个例子,应用的pod一旦发生变化,prometheus就可以通过配置好k8s的服务发现模式监听到资源变化,进行采集的增删,agent侧只需要暴露自己的指标,完全不关心是哪一个server过来获取数据。
k8s中主要组件的暴露地址说明
部署在pod中业务埋点指标
- 是直接通过pod的ip暴露的,我们可以直接通过get pod 获取容器的ip,在node上直接curl访问到
[root@k8s-master01 ink8s-pod-metrics]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
ink8s-pod-metrics-deployment-85d9795d6-95lsp 1/1 Running 0 13h 10.100.85.207 k8s-node01 <none> <none>
[root@k8s-master01 ink8s-pod-metrics]# curl -s 10.100.85.207:8080/metrics |grep ink8s # HELP ink8s_pod_metrics_get_node_detail k8s node detail each
# TYPE ink8s_pod_metrics_get_node_detail gauge
ink8s_pod_metrics_get_node_detail{containerRuntimeVersion="containerd://1.4.4",hostname="k8s-master01",ip="172.20.70.205",kubeletVersion="v1.20.1"} 1
ink8s_pod_metrics_get_node_detail{containerRuntimeVersion="containerd://1.4.4",hostname="k8s-node01",ip="172.20.70.215",kubeletVersion="v1.20.1"} 1
# HELP ink8s_pod_metrics_get_node_last_duration_seconds get node last duration seconds
# TYPE ink8s_pod_metrics_get_node_last_duration_seconds gauge
ink8s_pod_metrics_get_node_last_duration_seconds 0.008506914
# HELP ink8s_pod_metrics_get_pod_control_plane_pod_detail k8s pod detail of control plane
# TYPE ink8s_pod_metrics_get_pod_control_plane_pod_detail gauge
ink8s_pod_metrics_get_pod_control_plane_pod_detail{component="etcd",ip="172.20.70.205",pod_name="etcd-k8s-master01"} 1
ink8s_pod_metrics_get_pod_control_plane_pod_detail{component="kube-apiserver",ip="172.20.70.205",pod_name="kube-apiserver-k8s-master01"} 1
ink8s_pod_metrics_get_pod_control_plane_pod_detail{component="kube-controller-manager",ip="172.20.70.205",pod_name="kube-controller-manager-k8s-master01"} 1
ink8s_pod_metrics_get_pod_control_plane_pod_detail{component="kube-scheduler",ip="172.20.70.205",pod_name="kube-scheduler-k8s-master01"} 1
# HELP ink8s_pod_metrics_get_pod_last_duration_seconds get pod last duration seconds
# TYPE ink8s_pod_metrics_get_pod_last_duration_seconds gauge
ink8s_pod_metrics_get_pod_last_duration_seconds 0.012481561
- target页面举例图片

容器基础资源指标
- kubelet 内置cadvisor metrics接口暴露的
- 我们可以先获取token,再使用token作为header访问各个节点的cadvisor指标
TOKEN=$(kubectl -n kube-system get secret $(kubectl -n kube-system get serviceaccount prometheus -o jsonpath='{.secrets[0].name}') -o jsonpath='{.data.token}' | base64 --decode )
curl -s https://172.20.70.215:10250/metrics/cadvisor --header "Authorization: Bearer $TOKEN" --insecure |head # HELP cadvisor_version_info A metric with a constant '1' value labeled by kernel version, OS version, docker version, cadvisor version & cadvisor revision.
# TYPE cadvisor_version_info gauge
cadvisor_version_info{cadvisorRevision="",cadvisorVersion="",dockerVersion="1.13.1",kernelVersion="3.10.0-957.1.3.el7.x86_64",osVersion="CentOS Linux 7 (Core)"} 1
# HELP container_cpu_cfs_periods_total Number of elapsed enforcement period intervals.
# TYPE container_cpu_cfs_periods_total counter
container_cpu_cfs_periods_total{container="",id="/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-pod6ab97c68_b0ac_48ce_ba39_6ffa72a2f4c8.slice",image="",name="",namespace="default",pod="ink8s-pod-metrics-deployment-85d9795d6-95lsp"} 46664 1629771810858
container_cpu_cfs_periods_total{container="",id="/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podbf3f353a_92fa_4436_a8ca_6cb632d48ada.slice",image="",name="",namespace="kube-admin",pod="k8s-mon-daemonset-z6sfw"} 762965 1629771819606
container_cpu_cfs_periods_total{container="",id="/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podd9a95d67_a843_4369_8d5c_34a5333f1480.slice",image="",name="",namespace="kube-admin",pod="k8s-mon-deployment-6d7d58bdc8-rxj42"} 458822 1629771809776
container_cpu_cfs_periods_total{container="",id="/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-pode27c9fe7_9d82_4228_86fb_b9c920611c15.slice",image="",name="",namespace="kube-system",pod="prometheus-0"} 941374 1629771809770
container_cpu_cfs_periods_total{container="ink8s-pod-metrics",id="/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-pod6ab97c68_b0ac_48ce_ba39_6ffa72a2f4c8.slice/cri-containerd-2f85fd45a67cc4bb775b99d4676200b412ea18ef7ae4976fc93a8a7cff1c5f34.scope",image="docker.io/library/ink8s-pod-metrics:v1",name="2f85fd45a67cc4bb775b99d4676200b412ea18ef7ae4976fc93a8a7cff1c5f34",namespace="default",pod="ink8s-pod-metrics-deployment-85d9795d6-95lsp"} 46667 1629771818053
- target页面举例图片

k8s对象资源指标
- 这是ksm直接暴露指标,prometheus通过dns解析到域名然后访问的
- 我们可以通过dig获取ksm 的service_ip,然后访问 service_ip:8080
dig +short kube-state-metrics.kube-system.svc.cluster.local @10.96.0.10
10.100.85.200
curl -s 10.100.85.200:8080/metrics |head # HELP kube_certificatesigningrequest_labels Kubernetes labels converted to Prometheus labels.
# TYPE kube_certificatesigningrequest_labels gauge
# HELP kube_certificatesigningrequest_created Unix creation timestamp
# TYPE kube_certificatesigningrequest_created gauge
# HELP kube_certificatesigningrequest_condition The number of each certificatesigningrequest condition
# TYPE kube_certificatesigningrequest_condition gauge
# HELP kube_certificatesigningrequest_cert_length Length of the issued cert
# TYPE kube_certificatesigningrequest_cert_length gauge
# HELP kube_configmap_info Information about configmap.
# TYPE kube_configmap_info gauge
- target页面举例图片

k8s服务组件指标
- 是由服务组件自身直接暴露的,我们也可以通过带token直接访问
TOKEN=$(kubectl -n kube-system get secret $(kubectl -n kube-system get serviceaccount prometheus -o jsonpath='{.secrets[0].name}') -o jsonpath='{.data.token}' | base64 --decode )
curl -s https://localhost:6443/metrics --header "Authorization: Bearer $TOKEN" --insecure |head # HELP aggregator_openapi_v2_regeneration_count [ALPHA] Counter of OpenAPI v2 spec regeneration count broken down by causing APIService name and reason.
# TYPE aggregator_openapi_v2_regeneration_count counter
aggregator_openapi_v2_regeneration_count{apiservice="*",reason="startup"} 0
aggregator_openapi_v2_regeneration_count{apiservice="k8s_internal_local_delegation_chain_0000000002",reason="update"} 0
# HELP aggregator_openapi_v2_regeneration_duration [ALPHA] Gauge of OpenAPI v2 spec regeneration duration in seconds.
# TYPE aggregator_openapi_v2_regeneration_duration gauge
aggregator_openapi_v2_regeneration_duration{reason="startup"} 0.812717406
aggregator_openapi_v2_regeneration_duration{reason="update"} 0.848521427
# HELP aggregator_unavailable_apiservice [ALPHA] Gauge of APIServices which are marked as unavailable broken down by APIService name.
# TYPE aggregator_unavailable_apiservice gauge
[root@k8s-master01 ink8s-pod-metrics]#
- target页面举例图片

k8s中关注四大块指标总结
- 之前在k8s中关注4块指标有过总结
| 指标类型 | 采集源 | 应用举例 | 发现类型 |
|---|---|---|---|
| 容器基础资源指标 | kubelet 内置cadvisor metrics接口 | 查看容器cpu、mem利用率等 | k8s_sd node级别直接访问node_ip |
| k8s对象资源指标 | kube-stats-metrics (简称ksm) | 具体可以看 <br> 看pod状态如pod waiting状态的原因 <br> 数个数如:查看node pod按namespace分布情况 | 通过coredns访问域名 |
| k8s服务组件指标 | 服务组件 metrics接口 | 查看apiserver 、scheduler、etc、coredns请求延迟等 | k8s_sd endpoint级别 |
| 部署在pod中业务埋点指标 | pod 的metrics接口 | 依据业务指标场景 | k8s_sd pod级别,访问pod ip的metricspath |
本节重点总结 :
- push模型和pull模型监控系统对比
- 为什么在k8s中只能用pull模型的
- k8s中主要组件的暴露地址说明
相关文章:
20.1 分析pull模型在k8s中的应用,对比push模型
本节重点介绍 : push模型和pull模型监控系统对比为什么在k8s中只能用pull模型的k8s中主要组件的暴露地址说明 push模型和pull模型监控系统 对比下两种系统采用的不同采集模型,即push型采集和pull型采集。不同的模型在性能的考虑上是截然不同的。下面表格简单的说…...
Ubuntu 镜像替换为阿里云镜像:简化你的下载体验
Ubuntu,作为一款广受欢迎的Linux发行版,以其稳定性和易用性著称。但你是否曾因为下载速度慢而感到沮丧?现在,你可以通过将Ubuntu的默认下载源替换为阿里云镜像来解决这个问题。本文将指导你如何完成这一过程。 为什么选择阿里云镜…...
The Sandbox 游戏制作教程第 6 章|如何使用装备制作出色的游戏 —— 避免环境危险
欢迎回到我们的系列,我们将记录 The Sandbox Game Maker 的 “On-Equip”(装备)功能的多种用途。 如果你刚加入 The Sandbox,装备功能是 “可收集组件”(Collectable Component)中的一个多功能工具…...
JavaScript中的输出方式
1. console.log() console.log() 是开发者在调试代码时最常用的方法。它将信息打印到浏览器的控制台,使开发者能够查看变量的值、程序的执行状态以及其他有用的信息。 用途:用于调试和记录程序运行时的信息。优点:简单易用,适合…...
力扣9.25
2306. 公司命名 给你一个字符串数组 ideas 表示在公司命名过程中使用的名字列表。公司命名流程如下: 从 ideas 中选择 2 个 不同 名字,称为 ideaA 和 ideaB 。 交换 ideaA 和 ideaB 的首字母。 如果得到的两个新名字 都 不在ideas 中,那么 …...
从零开始之AI面试小程序
从零开始之AI面试小程序 文章目录 从零开始之AI面试小程序前言一、工具列表二、开发部署流程1. VMWare安装2. Centos安装3. Centos环境配置3.1. 更改子网IP3.2. 配置静态IP地址 4. Docker和Docker Compose安装5. Docker镜像加速源配置6. 部署中间件6.1. MySQL部署6.2. Redis部署…...
Html2OpenXml:HTML转化为OpenXml的.Net库,轻松实现Html转为Word。
推荐一个开源库,轻松实现HTML转化为OpenXml。 01 项目简介 Html2OpenXml 是一个开源.Net库,旨在将简单或复杂的HTML内容转换为OpenXml组件。 该项目始于2009年,最初是为了将用户评论转换为Word文档而设计的 随着时间的推移,Ht…...
HumanNeRF:Free-viewpoint Rendering of Moving People from Monocular Video 精读
1. 姿态估计和骨架变换模块 人体姿态估计:HumanNeRF 通过已知的单目视频对视频中人物的姿态进行估计。常见的方法是通过人体姿态估计器(如 OpenPose 或 SMPL 模型)提取人物的骨架信息,获取 3D 关节的位置信息。这些关节信息可以帮…...
Springboot中基于注解实现公共字段自动填充
1.使用场景 当我们有大量的表需要管理公共字段,并且希望提高开发效率和确保数据一致性时,使用这种自动填充方式是很有必要的。它可以达到一下作用 统一管理数据库表中的公共字段:如创建时间、修改时间、创建人ID、修改人ID等,这些…...
Android 已经过时的方法用什么新方法替代?
过时修正举例 (Kotlin): getColor(): resources.getColor(R.color.white) //已过时// 修正后:ContextCompat.getColor(this, R.color.white) getDrawable(): resources.getDrawable(R.mipmap.test) //已过时//修正后:ContextCompat.getDrawable(this, R.mipmap.test) //…...
【RocketMQ】MQ与RocketMQ介绍
🎯 导读:本文介绍了消息队列(MQ)的基本概念及其在分布式系统中的作用,包括实现异步通信、削峰限流和应用解耦等方面的优势,并对ActiveMQ、RabbitMQ、RocketMQ及Kafka四种MQ产品进行了对比分析,涵…...
【笔记】自动驾驶预测与决策规划_Part4_时空联合规划
文章目录 0. 前言1. 时空联合规划的基本概念1.1 时空分离方法1.2 时空联合方法 2.基于搜索的时空联合规划 (Hybrid A* )2.1 基于Hybrid A* 的时空联合规划建模2.2 构建三维时空联合地图2.3 基于Hybrid A*的时空节点扩展2.4 Hybrid A* :时空节…...
Linux指令收集
文件和目录操作 ls: 列出目录内容。 -l 显示详细信息。-a 显示隐藏文件(以.开头的文件)。cd: 改变当前工作目录。 cd ~ 返回主目录。cd .. 上移一级目录。pwd: 显示当前工作目录。mkdir: 创建目录。 mkdir -p path/to/directory 创建多级目录。rmdir: 删…...
《C++并发编程实战》笔记(五)
五、内存模型和原子操作 5.1 C中的标准原子类型 原子操作是不可分割的操作,它或者完全做好,或者完全没做。 标准原子类型的定义在头文件<atomic>中,类模板std::atomic<T>接受各种类型的模板实参,从而创建该类型对应…...
在Python中实现多目标优化问题(5)
在Python中实现多目标优化问题 在Python中实现多目标优化,除了传统的进化算法(如NSGA-II、MOEA/D)和机器学习辅助的方法之外,还有一些新的方法和技术。以下是一些较新的或较少被提及的方法: 1. 基于梯度的多目标优化…...
【Linux:共享内存】
共享内存的概念: 操作系统通过页表将共享内存的起始虚拟地址映射到当前进程的地址空间中共享内存是由需要通信的双方进程之一来创建但该资源并不属于创建它的进程,而属于操作系统 共享内存可以在系统中存在多份,供不同个数,不同进…...
今年Java回暖了吗
今年回暖了吗 仅结合师兄和同学的情况 BG 大多双非本 少部分211本 985硕 去年十月一之前 基本转正都失败 十月一之前0 offer 只有很少的人拿到美团 今年十月一之前 有HC的基本都转正了(美团、字节等),目前没有HC的说也有机会(…...
a = Sw,其中a和w是向量,S是矩阵,求w等于什么?w可以写成关于a和S的什么样子的公式
给定公式: a S w a S w aSw 其中: a a a 是已知向量, S S S 是已知矩阵, w w w 是未知向量。 我们的目标是求解 w w w,即将 w w w 表示为 a a a 和 S S S 的函数。 情况 1:矩阵 S S S 可逆 如果矩…...
多线程事务管理:Spring Boot 实现全局事务回滚
多线程事务管理:Spring Boot 实现全局事务回滚 在日常开发中,我们常常会遇到需要在多线程环境下进行数据库操作的场景。这类操作的挑战在于如何保证多个线程中的数据库操作要么一起成功,要么一起失败,即 事务的原子性。尤其是在多个线程并发执行的情况下,确保事务的一致性…...
Vue3 中集成海康 H5 监控视频播放功能
🌈个人主页:前端青山 🔥系列专栏:Vue篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来Vuet篇专栏内容:Vue-集成海康 H5 监控视频播放功能 目录 一、引言 二、环境搭建 三、代码解析 子组件部分 1.…...
【LeArm】从零玩转机械臂(一):开箱、配网与基础控制实战
1. LeArm机械臂开箱初体验 第一次拿到LeArm机械臂的包装箱时,明显能感受到厂家在包装上的用心。打开外层纸箱后,内部还有一层泡沫保护层,所有部件都被固定在定制泡沫槽位里,这种包装方式让我想起了高端电子产品的开箱体验。取出所…...
一体机-显控终端 国产化嵌入式处理板卡 产品规格说明书
一、产品概述MB-FT24A02是一款专为工业嵌入式、车载人机交互、国产化终端替代等场景设计的全国产化高性能处理板卡,采用紧凑型PCB设计,核心搭载飞腾FT-2000/4国产处理器,搭配飞腾X100专用国产桥片,构建全链路自主可控硬件平台&…...
别再只跑Demo了!手把手教你用vLLM部署微调后的Qwen2.5-3B-Instruct模型,实现高效批量推理
从微调到生产:Qwen2.5-3B-Instruct模型的高效推理部署实战 当开发者完成LoRA微调后,往往会面临一个现实问题:如何将训练好的模型真正用起来?原生Transformers推理在吞吐量和延迟上的表现,很难满足生产环境的需求。本文…...
【C++ 多线程实战精讲】std::thread 线程创建 / 传参 / 同步 / 智能指针 / 生命周期管理
前言C11 正式推出了标准多线程库 <thread>,让跨平台多线程开发变得简单高效。但多线程的坑非常多:线程传参、对象生命周期、数据竞争、锁使用、指针悬空、析构崩溃……本文基于完整可运行工程代码,带你彻底掌握:线程创建、j…...
从码农到冥府CTO:重建六道轮回系统的质量保障实践
第一章 职业跃迁:技术人的冥府晋升之路1.1 技术职级体系重构冥府技术团队沿用硅谷职级模型,但增设业力评估维度:L1 鬼卒程序员:执行生死簿数据录入(日均处理10万条因果记录)L3 无常高级工程师:负…...
Qwen3-VL-8B-Instruct-GGUF模型安全部署最佳实践
Qwen3-VL-8B-Instruct-GGUF模型安全部署最佳实践 1. 引言 在企业环境中部署AI模型时,安全性往往是首要考虑的因素。Qwen3-VL-8B-Instruct-GGUF作为一款强大的多模态视觉语言模型,能够处理图像和文本的复杂任务,但如果部署不当,可…...
鸿蒙 HarmonyOS 6 | 网络请求超时重试与弱网适配深度解析
文章目录前言一、网络请求的底层机制与超时配置二、超时重试的核心原理与代码实现三、架构优化策略总结前言 弱网环境下的网络波动极易导致应用与服务端断开连接。这不仅影响软件可用性,更是底层技术架构必须解决的核心问题。鸿蒙 6 在网络请求模块进行了底层架构强…...
大模型Prompt实战指南:从基础到高阶的提问艺术
1. 为什么Prompt提问技巧如此重要? 第一次用ChatGPT时,我直接问"怎么写工作总结",结果得到一篇泛泛而谈的模板。后来学会在问题里加上"我是一名互联网产品经理,需要向CTO汇报季度工作",回答立刻精…...
上海本凡科技引领小程序开发行业,凭实力成为最受欢迎的公司
上海本凡科技在小程序开发行业中取得的成就,可以归结为对客户需求的深刻理解和快速响应。公司致力于构建灵活易用的小程序,满足不同客户的商业目标。通过持续关注市场变化和用户反馈,本凡科技快速调整开发策略,以确保其产品始终符…...
【广度优先搜索】FloodFill算法: 图像渲染,岛屿数量,岛屿的最大面积,被围绕的区域
文章目录1. 图像渲染(LC733)题目描述解题思路代码实现2. 岛屿数量(LC200)题目描述代码实现3. 岛屿的最大面积(LC695)题目描述代码实现4. 被围绕的区域(LC130)题目描述解题思路代码实…...
