【云原生 • Prometheus】云原生kubernetes服务发现原理图解
云原生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服务发现原理图解
- 速读:德佩:科曼在巴萨受到的待遇不太好,他不应该被那样对待
- 天天快讯:久旱逢甘霖!“厄尔尼诺”暖流或于下半年提振美国棉花产量
- 3月24日在岸人民币兑美元16:30收盘报6.8655,较上一交易日下调366个基点
- WTA1000迈阿密站郑钦文晋级第三轮_全球资讯
- 注册yy账号怎么做
- 郭晶晶在合影中被裁掉,把香港名媛圈的势利眼,展现得淋漓尽致。
- 【天天播资讯】日系复古重磅青果领针织外套英文翻译(外套英文翻译)
- 南通强化电动自行车安全监管 排查风险隐患 解决质量问题
- TMT板块总成交竟占了A股40%!公募此前几乎清仓
- 少年的你迅雷下载链接_少年的你下载迅雷
- 置换购车是什么意思-新资讯
- 福晋是什么意思 世界观点
- 网络安全板块3月23日涨1.65%,国芯科技领涨,主力资金净流出5.1亿元_环球关注
- 气质少女夏日穿搭示范,简约、休闲、高级,有种优雅自信的感觉 全球热推荐
- 我的植物朋友作文300字以上_我的植物朋友作文300字-环球快播报
- 全球今热点:强烈推荐的《我有一把无敌仙器》,最反套路的情景,追文动力出现了!
- 焦点快看:【行业资讯】腾讯2022年财报:大力投入科技创新,为经济增长贡献价值
- 环球滚动:硬盘容量计算公式
- 新“喜歌”《桃夭》幸福首唱
- 1西游记第一回赏析简短_西游记第一回赏析|每日资讯
- 2全球热讯:天猫调整维修/换货相关规则 4月20日逐步覆盖各类目生效
- 3乌海市五险一金缴纳多少钱2023|环球热头条
- 4焦点资讯:河南省周口市2023-03-23 09:48发布寒潮蓝色预警
- 5引以为戒!中国科大取消南华大学造黄谣男生推免生录取资格
- 66月16日是什么日子|快报
- 7“券茅”失速,营收下滑4.65%!东方财富这么了?
- 8粤开现金惠货币型集合资产管理计划收益支付公告|环球短讯
- 9广大附属实验学校小学部_广大附属实验学校_动态焦点
- 10英雄联盟截的图在哪找_英雄联盟截图保存在哪里的
- 1巴金的资料简介-当前独家
- 2克瓦拉茨赫利亚的座驾亮相:梅赛德斯-AMG GT Coupe_世界视点
- 3当前时讯:目前辽宁队已经稳稳锁定前三了吗
- 4CF工业控股收购Incitec Pivot Ltd.路易斯安那州氨生产设施
- 5全球球精选!腾讯微博怎么关掉,怎样关闭或注销腾讯微博
- 6dnf仓库锁解除网址_dnf仓库锁怎么解除
- 72023广东事业单位集中招聘报名热门问答汇总 当前通讯
- 8华中农业大学:以“精读精讲”推动党的二十大精神落地生根_全球独家
- 9可采储量103.65万吨,冀中股份段王煤业段王矿一主力工作面即将试生产! 即时焦点
- 10【环球聚看点】十二校联合《教育学基础》考研真题题库及答案资料!
广告
- 七档双离合是什么意思是手动挡还是自动挡_七档双离合是什么意思 天天视点
- 天天头条:尿道发炎
- 2023年3月21日邻苯二甲酸二丁酯(DBP)价格最新行情预测
- 生育保险缴费基数和生育津贴关系是什么 详细情况如下
- 飞机票生成器在线制作_飞机票生成器|每日快看
- 世界快看:键凯科技:盘锦投产由于疫情的影响稍有延误,部分设备、材料到的都比之前预计的晚
- 英雄联盟手游:藏品系统来袭,未来科技风满分!
- 江西兴国县考察团考察预制菜产业发展
- 崔永熙面对面打爆林葳,CBA第一天才被打回原形?乔帅郭士强赢了
- 回声报:迪亚斯下周恢复跟队训练,乔-戈麦斯腿筋伤势已康复
- 努力英语缩写_努力英语
- 天天报道:电视剧《人生之路》今晚央视首播 高加林、刘巧珍的故事为何在上海延续?
- 每日热门:2022北京全国导游资格考试科目五违纪情况处理规定
- 宝刀不老!36岁苏亚雷斯又双叒破门,近12场已贡献10球4助 环球快报
- 天天热议:水平仪使用方法图解视频教程_水平仪使用方法图解
- i cant stop me歌词_i cant breathe
- 今日观点!嘉实基金苏文杰:经济复苏下看好上游板块,碳中和关注两大方向
- 红双喜防伪查询系统_红双喜乒乓球拍官网防伪查询
- 当前热讯:大学生P图侮辱女性被开除,是自食其果
- 兵团社保查询个人账户查询系统_兵团社保查询个人账户