云原生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个月宝
- 当前快看:第九期!文明交通劝导志愿服务















