Prometheus服务发现机制之Kubernetes
概述
分析过云原生监控接入方案,下面开始看下云原生服务发现机制。Prometheus本身就是作为云原生监控出现的,所以对云原生服务发现支持具有天然优势。Kubernetes
服务发现协议允许使用Kubernetes Rest API
检索出Prometheus
需要监控的targets
,并且跟着集群状态进行同步变更。
(资料图片仅供参考)
kubernetes_sd_configs
表示基于Kubernetes
进行服务发现,服务发现目标类型使用role
表示,比如:role=service
,表示针对Kubernetes
中的service
资源对象,进行具体的服务发现操作。kubernetes_sd_configs
支持的role
包括:node、service、pod、endpoints、ingress
。
原理
基于Kubernetes
进行服务发现,主要针对Kubernetes
中的service、pod、node
等资源对象进行服务发现,Prometheus
使用client-go
对role
中指定的资源对象进行监听。一般Prometheus
部署在Kubernetes
集群中的话,Prometheus
可以直接利用指定的Service Account
对Kubernetes API
进行访问。若Prometheus
在Kubernetes
集群之外,则kubernetes_sd_configs
还需指定监控集群的API Server
的URL
以及相关的认证信息,从而能够创建对应集群的Client
。
“client-go是kubernetes官方提供的go语言的客户端库,go应用使用该库可以访问kubernetes的API Server,这样我们就能通过编程来对kubernetes资源进行增删改查操作。
配置示例:
- job_name: kubernetes-pod metrics_path: /metrics kubernetes_sd_configs: - role: pod namespaces: names: - "test01" api_server: https://apiserver.simon:6443 bearer_token_file: d:/token.k8s tls_config: insecure_skip_verify: true bearer_token_file: d:/token.k8s tls_config: insecure_skip_verify: true
协议分析
Kubernetes
服务发现大致原理如下图:
1、通过clientset
访问API Server
,根据role
配置获取不同的集群资源对象;
2、通过List & Watch
机制,注册监听事件:
p.informer.AddEventHandler(cache.ResourceEventHandlerFuncs{ AddFunc: func(o interface{}) { podAddCount.Inc() p.enqueue(o) }, DeleteFunc: func(o interface{}) { podDeleteCount.Inc() p.enqueue(o) }, UpdateFunc: func(_, o interface{}) { podUpdateCount.Inc() p.enqueue(o) },})
通过informer.AddEventHandler
函数可以为集群资源添加资源事件回调方法,支持3种资源事件回调方法:AddFunc、DeleteFunc、UpdateFunc
,分别对应新增资源、修改资源和删除资源时事件触发。
3、资源变更注册回调方法中,将目标资源对象转成key
放入到队列queue
中,如下pod
资源:
func (p *Pod) enqueue(obj interface{}) { //obj是pod资源对象,通过DeletionHandlingMetaNamespaceKeyFunc将其转换成key //比如key=test01/nginx-deployment-5ffc5bf56c-n2pl8,即namespace/pod_name格式 key, err := cache.DeletionHandlingMetaNamespaceKeyFunc(obj) if err != nil { return } p.queue.Add(key)}
4、后台goroutines
无限循环执行process
逻辑,process
逻辑中就是不停从queue
中提取数据进行处理,比如pod.go
对应逻辑如下:
func (p *Pod) process(ctx context.Context, ch chan<- []*targetgroup.Group) bool { keyObj, quit := p.queue.Get() if quit { return false } defer p.queue.Done(keyObj) key := keyObj.(string) //与 MetaNamespaceKeyFunc() 功能相反的是 SplitMetaNamespaceKey() 函数,它将传入的 Key 分解,返回对象所在的命名空间和对象名称。 namespace, name, err := cache.SplitMetaNamespaceKey(key) if err != nil { return true } //根据key获取资源对象obj o, exists, err := p.store.GetByKey(key) if err != nil { return true } if !exists { //pod被删除时,exists=false // 然后发送targets为空的tg,即移除 send(ctx, ch, &targetgroup.Group{Source: podSourceFromNamespaceAndName(namespace, name)}) return true } pod, err := convertToPod(o) if err != nil { level.Error(p.logger).Log("msg", "converting to Pod object failed", "err", err) return true } //p.buildPod(pod):将资源对象信息转成target groups send(ctx, ch, p.buildPod(pod)) return true}
大致逻辑:
a、根据从queue
中提取的key
,使用p.store.GetByKey(key)
获取对应的资源对象,比如pod、service
等对象;
b、如果对象不存在,则表示资源对象被删除,则创建一个targets
集合为空的target groups
,这样Scrape Manager
就会移除targets
;
c、使用buildXXX(obj)
将资源对象解析成target groups
,如buildNode()、buildPod()
等;
d、最后使用send()
方法将解析的target groups
通过通道channel
传递出去,最终传递给Scrape Manager
,这样target groups
中targets
将被Prometheus
抓取监控数据。
pod
资源的target groups
结构如下示例,每个pod对象都会被解析成target groups
,其中包含targets
集合、labels
标签集合:
Discovery创建
1、假如我们定义如下抓取作业:
- job_name: kubernetes-nodes-cadvisor metrics_path: /metrics scheme: https kubernetes_sd_configs: - role: node api_server: https://apiserver.simon:6443 bearer_token_file: d:/token.k8s tls_config: insecure_skip_verify: true bearer_token_file: d:/token.k8s tls_config: insecure_skip_verify: true relabel_configs: # 将标签(.*)作为新标签名,原有值不变 - action: labelmap regex: __meta_kubernetes_node_label_(.*) # 修改NodeIP:10250为APIServerIP:6443 - action: replace regex: (.*) source_labels: ["__address__"] target_label: __address__ replacement: 192.168.52.151:6443 - action: replace source_labels: [__meta_kubernetes_node_name] target_label: __metrics_path__ regex: (.*) replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor
会被解析成kubernetes.SDConfig
如下:
kubernetes.SDConfig
定义如下:
type SDConfig struct { APIServer config.URL `yaml:"api_server,omitempty"` Role Role `yaml:"role"` HTTPClientConfig config.HTTPClientConfig `yaml:",inline"` NamespaceDiscovery NamespaceDiscovery `yaml:"namespaces,omitempty"` Selectors []SelectorConfig `yaml:"selectors,omitempty"`}
2、Discovery
创建
//创建Clientset,可看成操作Kubernetes API的客户端c, err := kubernetes.NewForConfig(kcfg) if err != nil { return nil, err }return &Discovery{ client: c, logger: l, role: conf.Role, namespaceDiscovery: &conf.NamespaceDiscovery, discoverers: make([]discovery.Discoverer, 0), selectors: mapSelector(conf.Selectors),}, nil
3、Discovery
创建完成,最后会调用Discovery.Run()
启动服务发现:
func (d *Discovery) Run(ctx context.Context, ch chan<- []*targetgroup.Group) { d.Lock() namespaces := d.getNamespaces() switch d.role { case RoleEndpointSlice: role=endpointslice逻辑 case RoleEndpoint: role=endpoints逻辑 case RolePod: role=pod逻辑 case RoleService: role=service逻辑 case RoleIngress: role=ingress逻辑 case RoleNode: role=node逻辑 default: level.Error(d.logger).Log("msg", "unknown Kubernetes discovery kind", "role", d.role) } var wg sync.WaitGroup for _, dd := range d.discoverers { wg.Add(1) go func(d discovery.Discoverer) { defer wg.Done() d.Run(ctx, ch) }(dd) } d.Unlock() wg.Wait() <-ctx.Done()}
4、注册集群资源对象监听事件回调逻辑:
for _, namespace := range namespaces { p := d.client.CoreV1().Pods(namespace) plw := &cache.ListWatch{ ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { options.FieldSelector = d.selectors.pod.field options.LabelSelector = d.selectors.pod.label return p.List(ctx, options) }, WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { options.FieldSelector = d.selectors.pod.field options.LabelSelector = d.selectors.pod.label return p.Watch(ctx, options) }, } pod := NewPod( log.With(d.logger, "role", "pod"), cache.NewSharedInformer(plw, &apiv1.Pod{}, resyncPeriod), ) d.discoverers = append(d.discoverers, pod) go pod.informer.Run(ctx.Done())}
标签:
-
每日简讯:【prometheus】-08 图解云原生服务发现机制
分析过云原生监控接入方案,下面开始看下云原生服务发现机制。Prometheus本身就是作为云原生监控出现的,所以对云原生服务发现支持具有天然优
-
当前聚焦:如何使用个人热点功能
个人热点即为把手机弄成一个无线热点,其他设备可以通过寻找无线网络的方法使用这个热点实现上网。有三个方法实现其他设备用此网络进行上网:1
-
当前快报:水浒传91回概括_水浒传90回概括
1、宋江等一行人至五台山拜见鲁智深的师傅智真长老,长老给几人都留下了话,这几句话就是几人日后的归宿。2、之后一行人去朝觐
-
天天最新:上海清算所副总经理戴德毅:为融资租赁企业提供安全高效的基础设施保障
3月24日,在首届租赁业投融资高峰论坛(2023)暨金泉奖颁奖典礼上,上海清算所副总经理戴德毅表示,上海清算所将立足债券登记托管职能,通过发行
-
【世界新要闻】华安添祥6个月持有期混合型证券投资基金基金经理变更公告
1公告基本信息基金名称华安添祥6个月持有期混合型证券投资基金基金简称华安添祥6个月持有混合基金主代码011390基金管理人名称华安基金管理有限
-
天天播报:你开心就好这句话是什么意思
不同情境下有不同意思。1、情境一:当自己挚爱的人任性时,拗不过时会顺从地说:“你开心就好。”2、情境二:当人们对于别人表示无奈时又不...
-
天天热推荐:Redmi Note 12 Turbo月底发布:能用1.33天续航
Redmi官方日前公布了旗下最新款手机RedmiNote12Turbo的外观和参数。这款手机采用了无边框镜头模组,背面纹理设计独特,整体美观度更高。小米Re
-
当前焦点!他们用ChatGPT方式搞自动驾驶,论文入选了ICRA 2023
来源:量子位这是首个基于Transformer的驾驶行为描述框架,可以感知和预测驾驶行为。也就是说,输入车辆视频后,这个算法可以判断车辆行为并告
-
焦点资讯:3月24日中煤能源跌6.13%,景顺长城景颐双利债券A基金重仓该股
3月24日中煤能源跌6 13%,景顺长城景颐双利债券A基金重仓该股,景颐,景顺长城,公募基金,中煤能源,双利债券a,中国能源公司,香港能源公司,中国煤
-
全球观焦点:耐克发布最新《影响力报告》,持续彰显环保和公益领域领导力
3月24日,耐克发布2022财年(2021年6月至2022年5月)《影响力报告》,全景回顾上一财年公司在减少环境足迹、激励下一代动起来,以及打造多元与
-
精彩看点:四川首个马术模拟仿真实验室投用 学生可随时“云”骑马
四川首个马术模拟仿真实验室投用学生可随时“云”骑马---四川首个马术模拟仿真实验室投用,学生正在练习马术。中新网成都3月24日电24日,在...
-
天天微资讯!酿酒的方法步骤
1、首先需要做的是蒸料:我们先将自己挑选好的优质糯米淘干净,然后将其放在白开水中润湿五个小时左右。2、然后我们将糯米放入蒸锅中蒸熟,这
-
全球今头条!企业关闭职工如何安置
一、企业关闭职工如何安置企业关闭职工的安置方法如下:对职工的安置和补偿应以破产财产给予职工经济补偿金,其补偿标准按劳动者
-
精选!1号线全新盘山东健康·宝钰澜庭预计将于4月中旬开放示范区&样板间
【山东健康·宝钰澜庭】预计将于4月15日开放示范区&样板间,项目预计将推出339套建面约89-115㎡3房,房地联动价4 93万 ㎡。
-
世界视点!首列“武汉白俄罗斯若季诺”中欧班列发车
中新网武汉3月24日电(梁婷徐晨)首列采用“快速通关”模式的“武汉—白俄罗斯若季诺”中欧班列24日发车。这是继201
-
当前讯息:天津退休金领取计算公式
计算公式:每月到手的养老金=月基础养老金+月个人账户养老金(1)基础养老金=(养老金计发基数+本人指数化月平均缴费工资)÷2×缴费年限×1%(2)
-
百事通!生活中需要注重的两个方面,都做好了!痛风就不会来“打扰”了
以现在人们的生活方式,不管是行为上还是饮食上,大部分人都患有高尿酸血症。如果平时经常大吃大喝,最好去医院检查一下自己的尿酸值,毕竟糖
-
【全球新要闻】ps喷枪工具在哪
ps喷枪工具的位置是:1、点击打开ps,打开一张图片。2、点击右侧“画笔工具”。3、点击画笔旁边的下拉框,再点击下拉框右边的齿轮。4、点击...
-
焦点速读:as well as就近原则造句_as well as就近原则
1、aswellas是就前原则。2、如Yourwifeaswellasyouisfriendlyt
-
全球要闻:云南农业大学是一本还是二本_云南农业大学怎么样
1、首先学生素质普片地下,教师水平也是一般的。2、如果有得选择建议别来,没得选择了来了也可以将就着上的,毕竟还是个大学,
-
环球热头条丨中国四大运动鞋服品牌 去年营收实现逆势增长
3月22日,随着特步国际发布2022年度财报,中国四大运动鞋服品牌财报正式收官。2022年,在全国服装、鞋帽、针纺织品类商品零售额同比减少6 5%的
-
【天天热闻】总编辑圈点|细胞疗法+生物电子疗法动物实验显示:“生物融合”装置恢复瘫痪肢体功能
科技日报记者 张佳欣英国剑桥大学研究人员开发出一种新型神经植入物。在对实验鼠进行的研究中,科学家使用该生物融合装置改善了其大脑和瘫痪
-
每日精选:行驶中发动机坏了能赔付吗
车若是投保了的话(有赔付险种)保险杠撞坏了能够赔付,投保人能够拨打投保保险公司报案电话、根据提示依次说明情况并按要求操作;(1)提供保险
-
即时:芬兰总统尼尼斯托签署批准该国加入北约的法案
据央视新闻,当地时间3月23日上午,芬兰总统绍利 尼尼斯托在首都赫尔辛基签署了批准芬兰加入北约的法案。瑞典和芬兰2022
-
当前消息!南京长江隧道是在长江底下吗
南京长江隧道,是江苏省南京市城市总体规划确定的“五桥一隧”过江通道中的隧道工程,是中国长江流域已建和正在建设的超大型盾构隧道中所经...
-
天天速读:西湖断桥变“人桥” 这是什么名场面【图】
今天来回顾关于西湖断桥变“人桥” 这是什么名场面【图】的文章,希望对各位小伙伴们有所帮助。【西湖断桥变“人桥” 这是什么
-
每日播报!肝内钙化灶是怎么回事_肝钙化灶怎么治疗
1、大部分肝内钙化是由于局部钙沉积引起的,属于良性疾病。2、一般没有临床症状或肝功能异常,只在体检时发现。3、这种情况下
-
【全球热闻】支付宝查医保卡余额的方法(支付宝查医保卡余额怎么查)
1、查询医保卡余额的方法有很多,可以电话查询,也可以自助查询。2、我们可以用以下方式查询:社保中心自助查询;2、登陆当地社保局官网查询;
-
全球即时:聚焦高质量发展 成都今年力争新增国家级专精特新“小巨人”企业50家以上
3月22日,成都市制造强市建设领导小组办公室召开全市专精特新中小企业高质量发展工作推进会。会议召集了250余家专精特新企业参会,专题解读国
-
微速讯:uibot是什么软件
UiBot是奥森科技旗下一款应用于RPA的机器人流程自动化工具,一款针对公司和个人提供工作流程自动化解决方案,可以代替人工进行电脑上枯燥、繁