云原生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,让整个流程运转起来;
标签:
精彩推荐
金融界12月30日消息据交通运输部,30日,交通运输新业态协同监管部际联席会议办公室对滴滴出行、T3出行...
12月29日,沪指报收3073 7,较前一交易日下跌0 44%。特斯拉板块整体表现一般,较前一交易日下跌0 27%...
昨天大盘最后一小时放量上涨,外围股市普遍上涨,消息面偏向平静。今天大盘应该高开,上攻时关注3086点...
作文给同学的礼物第一篇有一次,我参加了“阅读交流”会,当小老师。ppt已经做完了,就差给同学们分的小...
格隆汇12月29日丨科伦药业公布,四川科伦博泰生物医药股份有限公司(简称“科伦博泰”)是公司的控股子公...
格隆汇12月29日丨紫元元公告,于2022年12月29日,卖方叶特与买方深圳市美佳尔健康管理有限公司(公司间接...
开尔新材(300234)12月29日在投资者关系平台上答复了投资者关心的问题。投资者:董秘您好,公司卖掉旧厂...
网贷逾期一般会上征信,有些借贷机构在用户逾期后一天后就会上报给征信机构,而有些借贷机构则是会在几天...
东吴证券国际经纪有限公司陈睿彬近期对比亚迪进行研究并发布了研究报告《2022年三季报点评:业绩符合市...
中新社北京12月28日电(记者阮煜琳)中国生态环境部近日发布了《企业温室气体排放核算与报告指南发电设施...
作为一个设计行业的社畜,除了发际线往后走,还有那稀疏几乎不见头发的三角区域…一直是我的痛!要想富...
《证券日报》记者经过梳理发现,2022年商业银行二级资本债发行的井喷,与发债银行数量大幅增加有着直接关系
海口第二批发热就医服务站海口市于12月25日开设了8个“一站式”发热就医服务站,有效缓解了医疗机构的接...
1、车辆行驶证原件或复印件;2、车辆驾驶人驾驶证原件;3、车辆驾驶人身份证原件;4、现金和银行卡。交通事...
合肥邮政储蓄银行2023贺岁纪念币预约时间+兑换时间:(一)预约期:2022年12月27日22:30-12月29日24:00...
珠海横琴新区抗原检测试剂零售药店区域供应商连锁门店名称地址联系电话横琴新区大参林医药集团股份有限...
同花顺数据中心显示,国安达12月26日获融资买入81 71万元,占当日买入金额的7 22%,当前融资余额1 33...
中证网讯(记者武卫红)12月26日晚,海航控股披露定增结果公告,海航控股股东方大集团通过瀚巍投资向上...
编号:DSH-06-77 时代出版会议文件 日期:2022...
2023年的春晚将会在一个多月后开始,可是节目组已经基本确认了节目表演的节目和名单。
资讯News
03-21
03-20
03-20
03-20
03-20
03-20
03-20
03-20
03-20
03-19
03-19
03-19
03-19
03-19
03-19
03-19
03-18
03-18
03-18
03-18
聚焦Policy
当好农民工的“护薪人” 近日,罗某等7名农民工在收到被拖欠的工资后,纷纷打电话向江西省南昌市...
“通讯录里所有人都知道我欠钱了” □ 本报记者 韩丹东 □ 本报见习记者 张守坤 ...
大连宝马车撞人案肇事司机被判死刑 本报讯 记者韩宇 10月29日,辽宁省大连市中级人民法院一审...
医院财务迷上网络赌博输光5000万元公款 □ 本报记者 马维博 □ 本报通讯员 汪宇堂 曹...
辊环车削 雕琢毫厘(工匠绝活) 【绝活看点】 23年来,雷虎始终扎根一线,改进钢材轧制工艺...
交警严查超标电动自行车挪用“白牌” 截至昨晚6时,处罚电动自行车违法行为共计6585笔;下一步将...
明起寒潮来袭 北方气温普降10℃以上 中央气象台预计,本周日北京平原地区最低气温降至-4℃左右...
多种蔬菜价格降幅达五成 包括菠菜、蒿子秆等 预计本月中旬蔬菜恢复供需平衡 本报讯(记者...
北京周日最低气温或达-4℃ 本报讯(记者 赵婷婷)北京青年报记者昨天从中央气象台获悉,新一股...
昌平一家四口确诊新冠肺炎 天通北苑第二社区升级为中风险地区 朝阳两涉疫校区及16所学校停课 ...
图集Picture