【云原生 • Prometheus】云原生kubernetes服务发现原理图解 全球今热点
上节分析了Prometheus服务发现核心流程(如下图),Discoverer基于不同协议发现采集点,通过channel通知到updater协程,然后更新到di
云原生kubernetes服务发现原理图解
上节分析了Prometheus
服务发现核心流程(如下图),Discoverer
基于不同协议发现采集点,通过channel
通知到updater
协程,然后更新到discoveryManager
结构体trargets
字段中,最终由sender
协程将discoveryManager
的targets
字段数据发送给scrape
采集模块。
Discoverer
定义的接口类型,不同的服务发现协议基于该接口进行实现:
(相关资料图)
type Discoverer interface { // Run hands a channel to the discovery provider (Consul, DNS, etc.) through which // it can send updated target groups. It must return when the context is canceled. // It should not close the update channel on returning. Run(ctx context.Context, up chan<- []*targetgroup.Group)}
Prometheus
本身就是作为云原生监控出现的,所以对云原生服务发现支持具有天然优势。kubernetes_sd_configs
服务发现协议核心原理就是利用API Server
提供的Rest接口
获取到云原生集群中的POD
、Service
、Node
、Endpoints
、Endpointslice
、Ingress
等对象的元数据,并基于这些信息生成Prometheus
采集点,并且可以随着云原生集群状态变更进行动态实时刷新。
❝
kubernetes
云原生集群的POD
、Service
、Node
、Ingress
等对象元数据信息都被存储到etcd
数据库中,并通过API Server
组件暴露的Rest
接口方式提供访问或操作这些对象数据信息。 ❞
「kubernetes_sd_configs
配置示例:」
- job_name: kubernetes-pod kubernetes_sd_configs: - role: pod namespaces: names: - "test01" api_server: https://apiserver.simon:6443 bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
配置说明:
api_server
指定API Server
地址,出于安全考虑,这些接口是带有安全认证的,bearer_token_file
和ca_file
则指定访问API Server
使用到的认证信息;role
指定基于云原生集群中哪种对象类型做服务发现,支持POD
、Service
、Node
、Endpoints
、Endpointslice
、Ingress
六种类型;namespaces
指定作用于哪个云原生命名空间下的对象,不配置则对所有的云原生命名空间生效;「为什么没有配置api server信息也可以正常进行服务发现?」
很多时候我们并不需要配置api server
相关信息也可以进行服务发现,如我们将上面示例简化如下写法:
- job_name: kubernetes-pod kubernetes_sd_configs: - role: pod namespaces: names: - "test01"
一般Prometheus
部署在监控云原生集群上,从 Pod
使用 Kubernetes API
官方客户端库(client-go
)提供了更为简便的方法:rest.InClusterConfig()
。 API Server
地址是从POD
的环境变量KUBERNETES_SERVICE_HOST
和KUBERNETES_SERVICE_PORT
构建出来, token
以及 ca
信息从POD
固定的文件中获取,因此这种场景下kubernetes_sd_configs
中api_server
和ca_file
是不需要配置的。
❝
client-go
是kubernetes
官方提供的go
语言的客户端库,go
应用使用该库可以访问kubernetes
的API Server
,这样我们就能通过编程来对kubernetes
资源进行增删改查操作。 ❞
从之前分析的服务发现协议接口设计得知,了解k8s
服务发现协议入口在discovery/kubernetes.go
的Run
方法:
Run
方法中switch
罗列出不同role
的处理逻辑,刚好和配置示例中role
支持的六种云原生对象类型对应,只是基于不同的对象进行服务发现,基本原理都是一致的。
云原生服务发现基本原理是访问API Server
获取到云原生集群资源对象,Prometheus
与API Server
进行交互这里使用到的是client-go
官方客户端里的Informer
核心工具包。Informer
底层使用ListWatch
机制,在Informer
首次启动时,会调用List API
获取所有最新版本的资源对象,缓存在内存中,然后再通过Watch API
来监听这些对象的变化,去维护这份缓存,降低API Server
的负载。除了ListWatch
,Informer
还可以注册自定义事件处理逻辑,之后如果监听到事件变化就会调用对应的用户自定义事件处理逻辑,这样就实现了用户业务逻辑扩展。
Informer
机制工作流程如下图:
Informer
机制本身比较复杂,这里先暂时不太具体说明,只需要理解Prometheus
使用Informer
机制获取和监听云原生资源对象,即上图中只有「绿色框部分是自定义业务逻辑」,其它都是client-go
框架informer
工具包提供的功能。
这其中的关键就是注册自定义AddFunc
、DeleteFunc
和UpdateFunc
三种事件处理器,分别对应增、删、改操作,当触发对应操作后,事件处理器就会被回调感知到。比如云原生集群新增一个POD
资源对象,则会触发AddFunc
处理器,该处理器并不做复杂的业务处理,只是将该对象的key
放入到Workqueue
队列中,然后Process Item
组件作为消费端,不停从Workqueue
中提取数据获取到新增POD
的key
,然后交由Handle Object
组件,该组件通过Indexer
组件提供的GetByKey()
查询到该新增POD
的所有元数据信息,然后基于该POD
元数据就可以构建采集点信息,这样就实现kubernetes
服务发现。
「为什么需要Workqueue队列?」
Resource Event Handlers
组件注册自定义事件处理器,获取到事件时只是把对象key
放入到Workerqueue
中这种简单操作,而没有直接调用Handle Object
进行事件处理,这里主要是避免阻塞影响整个informer
框架运行。如果Handle Object
比较耗时放到Resource Event Handlers
组件中直接处理,可能就会影响到④⑤功能,所以这里引入Workqueue
类似于MQ
功能实现解耦。
熟悉了上面Informer机制
,下面以role=POD
为例结合Prometheus
源码梳理下上面流程。
1、创建和API Server
交互底层使用的ListWatch
工具;
2、基于ListWatch
创建Informer
;
3、注册资源事件,分别对应资源创建、资源删除和资源更新事件处理;
❝ 这里的
podAddCount
、podDeleteCount
和podUpdateCount
分别对应下面三个指标序列,指标含义也比较明显:prometheus_sd_kubernetes_events_total(role="pod", event="add")
prometheus_sd_kubernetes_events_total(role="pod", event="delete")
prometheus_sd_kubernetes_events_total(role="pod", event="update")
role
标识资源类型,包括:"endpointslice", "endpoints", "node", "pod", "service", "ingress"
五种类型;event
标识事件类型,包括:"add", "delete", "update"
三种类型。 ❞
4、事件处理,AddFunc
、DeleteFunc
和UpdateFunc
注册的事件处理逻辑一样,处理逻辑也比较简单:就是获取资源对象key
,并将其写入到Workqueue
中;
❝ 对于
POD
资源,这里的key
就是:namespace/pod_name
格式,比如key=test01/nginx-deployment-5ffc5bf56c-n2pl8
。 ❞
5、给Workqueue
注册一个无限循环处理逻辑,就能持续从Workqueue
中取出key
进行处理;
❝ 针对
Pod
里的每个Container
上的每个port
,都会生成一个对应采集点target
,其中__address__
就是PodIP
+port
组合。 ❞
6、最后启动Informer
,让整个流程运转起来;
关键词:
上节分析了Prometheus服务发现核心流程(如下图),Discoverer基于不同协议发现采集点,通过channel通知到updater协程,然后更新到di
欢迎观看本篇文章,小勉来为大家解答以上问题。密集的近义词是什么,密集的意思很多人还不知道,现在让我们一起来看看吧!1、密
解答:1、第一次是为了百达翡,第二次和第三次出云掌是为了救陈和两人。2、赵玉安一直想除掉谢云,但当赵玉安受到童开阳的威胁
3月20日消息,三大指数午后集体下行翻绿,创业板指早间一度涨超1%。板块方面,黄金股集体爆发,游戏、传媒股集体走强,储能等赛道板块有所反弹
1、19日,侨银股份“怒斥员工”事件引起社会热议。2、20日,侨银股份回应:已第一时间调查原因,并且将该名项目管理人员降
东营1166个居民小区实现党支部全覆盖,党建引领提升基层治理效能党建引领聚力同心共商共治幸福家园□本报记者贾瑞君李广寅本报通讯员刘业仕王
银行平台本身可选择的理财产品很多,通常会优先选择此前就已经合作过的机构产品。而单独为某款产品开通合作渠道,对接和服务成本都太高,销量
解答:1、请允许安装目录中的jfcachemgr exe、kmliveupdata exe和pipiplayer exe
沧源佤族自治县气象台发布雷电预警信号黄色预警【Ⅲ级 较重】【2023-03-19】
1、这些孩子绝大多数都非常的有出息,虽然说打拼的特别艰辛,但是前途都是无可限量的。2、我认识的其中一位同学就是这样,家里非常的贫困,上
office2021几乎可从在任何地点访问和共享文档:联机发布文档,然后通过您的计算机或基于WindowsMobile的Smartphone在任何地方访问、查看和编辑
□市九中九年级2036班彭蕙林窗外,在夕阳的余晖下,云霭缥缈,舒卷自如,正如木棉殷红的花丛,浩盛,却不铺天盖地,遍野张扬。柔和细腻的光从
今天小编肥嘟来为大家解答以上的问题。老人晚上睡觉流口水是怎么回事,成人睡觉流口水是怎么回事相信很多小伙伴还不知道,现在让我们一起来看看
1、拜托总裁,温柔点作者:墨染简介:新婚夜,他把她压在身下,冷声警告:“你我之间的婚姻只是各取所需,永远也别指望自己能够
1、广西壮族自治区玉林市北流市大里镇林垌村,地处大里镇东北端,东南连小马村,西邻六马村,北邻高垌村,距镇政府6 9公里,辖区总面积6 93平
3月18日武汉大学举行2023年致敬抗疫医护赏樱专场活动共有约1 6万余名抗疫医护人员及家属来校赏樱3年前武汉大学向援鄂医疗队员以及湖北疫情防治
1、经期喝红糖水不仅能补血,还能活血散寒。2、特别适用于血瘀引起的月经感冒、月经不良痛经、月经暗红、小腹冷痛等症状。3、
过敏性鼻炎可分为季节性过敏性鼻炎和常年性过敏性鼻炎,这与过敏原有关。季节性过敏性鼻炎常见致敏原是花粉等季节性吸入物变应原
03月18日06时贵州遵义疫情数据阳了以后为什么会腰疼?应该怎么办?以下为详情!一、03月18日06时遵义疫情数据概览
1、翻译:忠、万、云、安这些地方有很多老虎。2、有个妇人白天将两个小孩留在沙滩上自己到水里去洗衣服。3、老虎从山上跑来,
ChinaJoy简称CJ,即是:中国国际数码互动娱乐展览会。2015ChinaJoy将于7月30日在上海新国际博览中心
App3月17日消息,据中国船舶集团消息,2023年第一季度,中国船舶集团有限公司旗下上海三大船企——沪东中华造船(集团)有限公司、江南造船(
俄罗斯莫斯科州发生汽车爆炸俄知名社会学家亚历山大·杜金之女身亡当地时间21日凌晨,俄罗斯莫斯科州发生一起汽车爆炸,俄知
1、首先登录手机微信和电脑微信客户端。2、把需要保存的表情图发给文件传输助手3直接在电脑微信客户端把表情拖动到需要保存的
1、晚唐是唐诗逐渐衰落期。2、最初尚有李商隐、杜牧两位著名诗人,时称“小李杜”。3、他们的长篇五古《行次西郊作一百韵》、
Copyright 2015-2023 非洲酒业网 版权所有 备案号:沪ICP备2022005074号-8 联系邮箱:58 55 97 3@qq.com