全球快资讯:【prometheus】-08 图解云原生服务发现机制
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())}
标签:
相关阅读
-
03-24
-
03-24
-
03-24
推荐阅读
-
全球快资讯:【prometheus】-08 图解云原生服务
分析过云原生监控接入方案,下面开始看下云原生服务发现机制。Prometheus本身就是作为云原生监控出现的,所以对云原生服务发现支持具有天然优更多
2023-03-24 20:23:25
-
快报:盟科药业:2022年归母净利润为-2.2亿元,连
盟科药业于2023年3月25日披露年报,公司2022年实现营业总收入4821万元,同比增长529 3%;实现归母净利润-2 2亿元,同比增长2 6%。更多
2023-03-24 18:39:38
-
【环球新要闻】国行和港行有什么区别
1、保修上的差异:所有的港行手机在大陆是没有官方保修服务的,一般店铺提供的保修都是自己维修而没有专业的人员与稳定的配件供货渠道的。2、更多
2023-03-24 18:43:51
-
国际油价跌逾1%,美国能源部此举或加剧供应过剩
国际油价跌逾1%,美国能源部此举或加剧供应过剩更多
2023-03-24 17:46:38
-
强强联合 共赢发展 湖南建投集团与腾讯云签署战
湖南建投集团与腾讯云签署战略合作协议。蔡典维一行参观了腾讯公司企业展厅。红网时刻新闻3月24日讯(通讯员董萌萌)3月2更多
2023-03-24 17:31:36
-
当前消息!Linux安装elasticsearch-head
elasticsearch-head是一款专门针对于elasticsearch的客户端工具,用来展示数据。更多
2023-03-24 16:19:45
-
焦点资讯:美原油交易策略:需求面利多,供给面利
美原油交易策略:需求面利多,供给面利空,多空博弈加剧更多
2023-03-24 15:35:57
-
世界热推荐:国际金价短线料回落至1977美元
国际金价短线料回落至1977美元更多
2023-03-24 15:41:56
时尚热图
热门标签
精彩放送
-
03-24
-
03-24
-
03-24
-
03-24
-
03-24
-
03-24
-
03-24
-
03-24
-
03-24
-
03-24
-
03-24
-
03-24
-
03-24
-
03-24
-
03-24
-
03-24
-
03-24
-
03-24
-
今日必看
-
精彩话题
-
今日推送
- 世界即时看!张兰家族信托被“击穿”启示:警惕海外“假信托”
- 奕东电子:公司的动力电池管理系统FPC根据设计和要求可与各类电池进行适配
- 当前短讯!多纳鲁马:下半场的反应非常好,我们看到了真正的意大利
- 当前信息:银河证券:加息停止已然不远 但降息不会很快到来
- “别想投资赚大钱”!曾1个月涨价200万 如今1m2跌去2万 大厂搬家致房价下跌?
- 世界今日报丨比亚迪官宣:即将发布全新重磅技术!
- 今热点:3月24日重点数据和大事件前瞻
- 天天最资讯丨广州今年首次土地出让,两大要点需要关注
- 当前视点!历史罕见!TMT板块总成交竟占了A股40% 公募此前几乎清仓!什么信号?
- 电视剧火凤凰女子特战队全集视频_电视剧火凤凰女子特战队
- 刚刚,A股再现“卖公司式”减持!
- 简讯:宝馨科技:3月23日召开业绩说明会,投资者参与
- 3月23日汤姆猫发布公告,其股东减持4235.15万股
- 每日关注!“一两万优惠很多消费者不买账了”!车企价格战一卷到底 多家A股企业回应影响!
- 天天头条:金明精机:3月23日召开业绩说明会,投资者参与
- 3月23日佳缘科技发布公告,其股东减持271.03万股
- 万丰奥威:公司铝轮加工工艺技术领先,金属利用率高,优势明显
- 世界时讯:“三抓三促”行动进行时|崇信县:创新求变 担当作为 奋力推动党员干部人才教育培训赋能增效
- 山东路桥最新公告:中标25.43亿元荣乌高速烟威改扩建项目
- 百亿级私募最新持仓曝光!高毅、景林、淡水泉重仓股浮出水面
- 全球简讯:悦心健康:3月23日召开业绩说明会,投资者参与
- 古鳌科技(300551)股东陈崇军质押832万股,占总股本2.45%
- 即时:大烨智能(300670)股东陈杰质押1950万股,占总股本6.15%
- 天天观焦点:梦幻好听的游戏名字
- 力生制药最新公告:2022年度净利润同比下降23.34% 拟10股派3元
- 天天百事通!中微公司:3月22日MAK STEVE SZE-YEE减持公司股份合计5000股
- 广立微最新公告:2022年度净利润同比增长91.97% 拟10股派4元
- 新黄金赛道!合成生物被誉为“第三次生物技术革命”的产业 资本扎堆涌入!
- 天天简讯:桂东电力最新公告:2022年度净利润亏损2.23亿元 同比转亏
- 热消息:迪哲医药(688192)7953.49万股限售股将于3月24日解禁上市,占总股本19.49%
- 全球热文:英银如期加息25个基点并预计通胀走低,英镑波动近40点
- 全球快资讯:立方数科:公司依照整体战略发展规划需要,与行业合作伙伴开展相关工作
- 世界速讯:广州荔湾区驷马涌流域获评广州市海绵城市建设A等示范片区
- 当前观察:“致命真菌”爆发!50%感染者90天内死亡!世卫组织紧急发声:风险非常高!
- 图解中信银行年报:第四季度单季净利润同比增8.03%
- 全球热资讯!冠石科技最新公告:股东拟减持不超过4.835%股份
- 3月23日诚达药业发布公告,其股东减持112.05万股
- 环球观天下!皇氏集团最新公告:拟合作投建智慧化乳制品中央工厂和生态智慧化牧场项目
- 报道:工信部:着力稳住汽车、消费电子等大宗消费 巩固新能源汽车、光伏等优势产业领先地位
- 要闻:杭州一博物馆疑有古董被盗,官方:丢失物品为灯罩装饰物
- 全球播报:中辉期货原油日报20230323:原油价格企稳,可轻仓试多
- 首都机场3号航站楼D区3月26日恢复使用
- 天天看热讯:3月23日鼎通科技(688668)龙虎榜数据:机构净买入1.66亿元
- 天天通讯!广西宁明县:巧打以旅兴农特色牌
- 环球视讯!楼市又有大消息!多地密集出手
- 播报:业界怎么看ChatGPT“智力革命”?希望从商业回归技术理性
- 世界关注:飞亚达:3月22日至3月23日公司高管陆万军、唐海元减持公司股份合计7.84万股
- 3月23日洁特生物发布公告,其股东减持190万股
- 视点!国机汽车:公司没有应披未披事项
- 水晶光电最新公告:拟在越南设立全资生产型公司COT