云原生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】云
- 【全球时快讯】男星在车站晕倒后猝逝,曾
- 快报:北京故宫介绍红墙_北京故宫介绍
- 全球新动态:“这种零距离的庭审现场,真
- 热门:天天酷跑所有坐骑
- 世界即时:世界最穷的国家排名_世界上最
- 热门看点:补贴有术的拼多多
- 【世界快播报】宏石激光研发费用率低于同
- 环球今热点:电话的发明者是谁呢_电话的
- 天天微资讯!用自发粉怎么做包子_自发粉
- 报道:风=͟͟͞͞沙=͟͟͞͞预=͟͟
- 每日快讯!很污的作文作文_很黄很污的作文
- 今日观点!「嘉实价值基金净值」中电电机
- 要闻:吉林省经贸代表团在印度尼西亚签订
- 全球今头条!展示!推介!签约!西安无人
- 焦点报道:全新电动概念车首秀!起亚发布
- 环球快看点丨普定县气象台发布大风蓝色预
- 观热点:房屋拆迁签订补偿协议怎么写
- 天天热点!胃病看哪个科室_胃病看什么科
- 天天微动态丨八亿时空:目前公司光刻胶树
- 天天热点!卡耐基的书籍大全_卡耐基的书
- 天天看热讯:联盟空砍王出炉:多项数据证
- 环球热头条丨穿井得一人一词多义古今异义
- 环球焦点!景业智能: 景业智能第一届董
- 每日速递:阳原县消防救援大队多举措优化
- 世界微资讯!梦幻西游元宵怎么吃(元宵怎
- 天天看点:医保卡的余额是个人缴费部分吗
- 环球速递!饮水饮汤都会中毒致癌不孕?医
- 精彩看点:浙江:力争全省汽车产业实现规
- 【环球热闻】word打不开解决方法_word打
- 环球报道:斯帕莱蒂谈欧冠抽签:若要我选
- 每日快讯!河北遵化:以花为媒 唱好春季
- 每日头条!如何取消文件夹加密_加密的文件
- 天天亮点!今天,他结婚了,全网祝福!
- 全球热点!热砂之乐园存档_热砂之乐园攻略
- 环球热头条丨滴滴注册车型不符合标准_滴
- 全球最新:火影忍者美女黄禁照片视频_火
- 通讯!储能概念板块微跌3.67%,宁德时代
- 天天新动态:眉县槐芽中学领导班子_眉县
- 环球动态:班荆道故是什么成语(班荆道故
- 天天最资讯丨qq企鹅宠物在哪里打开(qq宠
- 【世界聚看点】报告式讯问法
- 环球资讯:未来中国的农业将发生什么?5
- 世界今日报丨美国消费者对未来一年通胀预
- 世界热点!黄果树旅游区:便民办税春风来
- 每日时讯!今日金融一体机是骗人的吗?
- 前沿资讯!洞房花烛夜,警察赶到婚房勘查
- 每日关注!和讯个股快报:2023年03月17日
- 天天视讯!叙利亚总统:美国是世界安全稳
- 天天微头条丨生成式AI投融资热潮席卷全球
- 环球热推荐:2个字古风意境唯美名字男_2
- 微动态丨康华生物:公司在研项目四价鼻喷
- 环球新资讯:两名嫌疑人落网 萨拉赫被失
- 天天新动态:福耀玻璃:2022年度净利润约
- 每日观察!新泉股份最新公告:全资子公司
- 天天快资讯丨前沿消息报道:北京多家社区
- 环球快资讯丨315 曝光景区高空项目安全
- 世界速讯:注塑机十大品牌排行榜
- 全球热点评!等轴双曲线参数方程怎么求_
- 【世界热闻】花鸟难辨 北京昌平玉兰花含
- 天天热点!卡耐基的书籍大全_卡耐基的书
- 天天看热讯:联盟空砍王出炉:多项数据证
- 环球热头条丨穿井得一人一词多义古今异义
- 环球焦点!景业智能: 景业智能第一届董
- 每日速递:阳原县消防救援大队多举措优化
- 世界微资讯!梦幻西游元宵怎么吃(元宵怎
- 天天看点:医保卡的余额是个人缴费部分吗
- 环球速递!饮水饮汤都会中毒致癌不孕?医
- 精彩看点:浙江:力争全省汽车产业实现规
- 【环球热闻】word打不开解决方法_word打
- 环球报道:斯帕莱蒂谈欧冠抽签:若要我选
- 每日快讯!河北遵化:以花为媒 唱好春季
- 每日头条!如何取消文件夹加密_加密的文件
- 天天亮点!今天,他结婚了,全网祝福!
- 全球热点!热砂之乐园存档_热砂之乐园攻略
- 环球热头条丨滴滴注册车型不符合标准_滴
- 全球最新:火影忍者美女黄禁照片视频_火
- 通讯!储能概念板块微跌3.67%,宁德时代
- 天天新动态:眉县槐芽中学领导班子_眉县
- 环球动态:班荆道故是什么成语(班荆道故
- 天天最资讯丨qq企鹅宠物在哪里打开(qq宠
- 【世界聚看点】报告式讯问法
- 环球资讯:未来中国的农业将发生什么?5
- 世界今日报丨美国消费者对未来一年通胀预
- 世界热点!黄果树旅游区:便民办税春风来
- 每日时讯!今日金融一体机是骗人的吗?
- 前沿资讯!洞房花烛夜,警察赶到婚房勘查
- 每日关注!和讯个股快报:2023年03月17日
- 天天视讯!叙利亚总统:美国是世界安全稳
- 天天微头条丨生成式AI投融资热潮席卷全球
- 环球热推荐:2个字古风意境唯美名字男_2
- 微动态丨康华生物:公司在研项目四价鼻喷
- 环球新资讯:两名嫌疑人落网 萨拉赫被失
- 天天新动态:福耀玻璃:2022年度净利润约
- 每日观察!新泉股份最新公告:全资子公司
- 天天快资讯丨前沿消息报道:北京多家社区
- 环球快资讯丨315 曝光景区高空项目安全
- 世界速讯:注塑机十大品牌排行榜
- 全球热点评!等轴双曲线参数方程怎么求_
- 【世界热闻】花鸟难辨 北京昌平玉兰花含
- 世界今日讯!2023北京市公务员考试笔试合
- 全球微资讯!青平:他们感动中国,更激励
- 天天新资讯:昱西街道昱城公益志愿服务总
- 焦点热文:黑帝斯2好玩吗 黑帝斯2玩法简介
- 世界新资讯:肆虐的意思视频_肆虐的意思
- 【独家】2023沈阳陈楚生演唱会儿童要买门
- 每日看点!苏军良正式出任华福证券董事长
- 天天微头条丨一彬科技盘中异动 股价大幅
- 环球观察:勇士的信仰挂机教程_勇士的信
- 环球简讯:宫腔粘连分离术后多久可以怀孕_
- 世界滚动:湖北开展“3·15”假冒伪劣消防
- 焦点要闻:柳药集团: 广西柳药集团股份
- 天天讯息:法媒:美对银行救助措施难挽投
- 当前讯息:浙江义乌户外用品出口订单激增
- 【世界时快讯】绿山墙的安妮作者简介50字
- 世界看热讯:密室逃脱23迷失俱乐部5_密室
- 世界快看:yy8位频道怎么申请_yy频道申请
- 天天热讯:幽暗城学骑术的地方_幽暗城学骑
- 全球微头条丨4个月宝宝发育指标_4个月宝
- 当前快看:第九期!文明交通劝导志愿服务