云原生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)}
k8s协议配置
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
资源进行增删改查操作。 ❞
Informer机制
从之前分析的服务发现协议接口设计得知,了解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】云原生kubernetes服务发现原理图解上节分析了Prometheus服务发现核心流程(如下图),Discoverer基于不同协议发现采集点,通过channel通知到updater协程,然后更新到di
-
天天观速讯丨广联航空: 广联航空工业股份有限公司向不特定对象发行可转换公司债券募集说明书提示性公告广联航空:广联航空工业股份有限公司向不特定对象发行可转换公司债券募集说明书提示性公告
-
高级职称退休待遇调整_高级职称退休待遇 全球快看点1、你问的是事业单位的高级职称还是教育单位的高级职称还是国企的高级职称还是在社会上评的高级职称
-
国安2023赛季5人离队浮出水面,多名功勋核心在列,朴成意外领衔|全球速读日前,随着国安在转会市场上引进多名新援,球队阵容瘦身已经势在必行。国安首先在本土引援中,敲定了方昊、杨立瑜、林良铭、李磊等四名球员加
-
海外版全新丰田锐志官方图设计更激进 天天最资讯根据官方地图,新的锐志在外观上更加激进。蜂窝格栅与大灯组连接,大灯组内部采用LED光源。此外,新车的前保险杠采用了夸张的
-
林允_说一说林允的简介夏弥来为大家解答以下的问题,林允,说一说林允的简介,现在让我们一起来看看吧!1、林允(JellyLin),本名费霞,1
-
难耐“水深火热” 澳大利亚一条河惊现数百万条死鱼当地时间3月17日早晨,澳大利亚新南威尔士州西部偏远小镇梅宁迪的居民目睹令人惊吓的一幕:流经本镇的达令-巴卡河中,密密麻麻的死鱼竟“铺...
-
为什么选择教师职业_选择教师职业的原因-环球关注1、具体回答如下:一是高度匹配的职业兴趣。2、受家人影响对教师职业的热爱及敬业态度深深地感染着我,让我对教师职业产生了热
-
广期所副总经理冷冰:将加快推动碳酸锂、多晶硅、铂、钯以及商品指数期货等品种的研发和上市 全球微速讯广州期货交易所副总经理冷冰在第七届中国资管精英大会上表示,下一步,广期所将加快品种研发,加快推动更多的新能源金属品种上市,持续丰富新
-
微头条丨交房一年多,这个豪宅项目的园林还是工地……交房一年多,这个豪宅项目的园林还是工地……,豪宅,交房,园林,开发商
-
形容读了很多书的成语_形容书多的成语1、形容书多的成语有浩如烟海、左图右史、汗牛充栋、拥书南面、坐拥百城。2、浩如烟海是一个汉语成语,形容文献、资料、书籍等
-
雪鳞锋x和雪鳞锋v区别_雪鳞锋1、在设置中更改的自定义操作方案保存后将自动为您储存在云端。以上就是【雪鳞锋x和雪鳞锋v区别,雪鳞锋】相关内容。
-
小朋友一起玩交火影版2 4下载小朋友一起玩交火影版24下载这个很多人还不知道,现在让我们一起来看看吧!1、解开人物锁就行了隐藏人物的开启方式:要先进入NTSD2 4_t4datadata
-
神州高铁: 关于公司董事长减持计划实施完成的公告神州高铁:关于公司董事长减持计划实施完成的公告
-
2023年度西安临潼公租房年审步骤(一)正在享受廉租住房租金补贴及租赁型保障房实物配租保障家庭的审查工作,由各街办根据入户调查情况,指导符合保障条件的家庭如实填写《临
-
[线程池]Springboot如何使用线程池在SpringBoot应用中,经常会遇到在一个接口中,同时做事情1,事情2,事情3,如果同步执行的话,则本次接口时间取决于事情123执行时间之和;如果三
-
世界热讯:脓胸1、脓胸是由病菌侵入胸膜腔,产生脓性渗出液积聚于胸膜腔内的化脓性感染。2、脓胸多发于青壮年。3、脓胸可分为急性和慢性。4
-
每日聚焦:发热膜是什么东西_发热膜1、electricradiantheatingfilm工作时将电能转化为热能。2、并将热能主要以辐射的形式向外传
-
形位公差的标注方法有_形位公差的标注方法1、形位公差的标注应注意以下问题:(1)形位公差内容用框格表示,框格内容自左向右第一格总是形位公差项目符号,第二格为公差
-
滚动:信用卡 怎么取现_信用卡取现技巧1、可以通过ATM机取现。2、用卡取现分为两种情况:情况一:信用卡透支取现,也就是说我们取出来的钱是通过透支取现的方式进
-
今日圣诞老人的做法 纸折_DIY折纸教程之圣诞老人1、首先准备一张正方形纸,然后分别沿对角线折叠出两条痕迹,如图所示。2、打开白色这一面,选择正方形的一个顶点朝中心折叠,
-
蜀道难是什么时候学的_sdn是什么 世界热头条今天小编肥嘟来为大家解答以上的问题。蜀道难是什么时候学的,sdn是什么相信很多小伙伴还不知道,现在让我们一起来看看吧!1、SDN最简单的意思
-
“硅谷银行”不是第一张骨牌-天天快看近期美国金融业负面新闻频发,上周管理资产规模高达9510亿美元的全球最大另类资产管理公司、私募股权巨头黑石集团违约一只5 31亿欧元的芬兰商
-
神宇股份:公司产品有海外出口 海外业务占比不大 天天新视野每经AI快讯,有投资者在投资者互动平台提问:请问董秘,公司产品是否出口到海外,海外业务占比是多少神宇股份(300563 SZ)3月16日在投资者互动
-
斑竹又名_ldquo 斑竹 rdquo 是什么典故1、传说,舜帝的二个妃子娥皇女英千里寻追舜帝。2、到君山后,闻舜帝已崩,抱竹痛哭,流泪成血,落在竹子形成斑点,故又名“泪
-
深化“林长+警长”协作机制 福建省首个野生动物救助保护基地揭牌深化“林长+警长”协作机制福建省首个野生动物救助保护基地揭牌
-
乐享研学之旅|世界最资讯本报讯(YMG全媒体记者何晓波通讯员林君摄影报道)春暖花开,来一场植物园“研学之旅”。3月11日下午,烟台金心公益团队志愿者们来到烟台植...
-
全球观热点:合肥轨道三号线站点名称_合肥轨道交通3号线站点1、如下:合肥轨道交通3号线(HefeiMetroLine3),是中国安徽省合肥市一条正在建设的地铁线路,预计一
-
哑口无言的反义词_哑口无言 天天即时1、释义:哑口:像哑巴一样。2、像哑巴一样说不出话。3、形容理屈词穷一时语塞或紧张。4、哑口无言:汉语成语。5、拼音:y
-
【播资讯】图片报:哈维-阿隆索是皇马主帅候选人之一德国《图片报》报道,哈维-阿隆索是皇马新帅候选。虽然安切洛蒂上赛季带皇马赢得欧冠和西甲,但本赛季球队在西甲表现不佳,导致他处于压力之下