
分析过云原生监控接入方案,下面开始看下云原生服务发现机制。Prometheus本身就是作为云原生监控出现的,所以对云原生服务发现支持具有天然优
腾讯云 2023-03-24 19:17:21
分析过云原生监控接入方案,下面开始看下云原生服务发现机制。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
标签集合:
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本身就是作为云原生监控出现的,所以对云原生服务发现支持具有天然优
从获得的消息来看,大众ID 7可能会在4月18日开幕的上海车展上全球首发。ID 7定位中大型纯电轿车,预计会在一汽-大众生产,正式上市时间会在今
1、你好。2、很开心为您解答”voice“的英文发音如下voice[英][vɔɪs][美][vɔɪs]如需用中文模
3月24日,美“米利厄斯”号导弹驱逐舰未经中国政府批准,再次非法闯入中国西沙领海,破坏南海地区和平稳定,中国人民解放军南部战区依法进行跟
陈奕迅在《中国好声音》上唱《十年》故意跑调是第20170721期。本期节目中,选手离开舞台后,四位导师感叹台上唱歌真的有压力,在周杰伦老师的
3月26日,京东运动户外超级品类日即将全面开启。活动将聚焦最受消费者喜爱的露营、骑行、徒步、垂钓等四大户外运动场景,并携手挪客、牧高笛、
“赔了夫人又折兵”!?千亿银行系公募刚没了副总,又丢了爱将,罗杰,鑫元,投研,固收,公募,和基金,基金资产净值
3月23日,港股医疗数字化营销龙头医脉通(2192 HK)发布了2022年度业绩。根据公告显示,医脉通平台累计的原创专业医学内容近20万篇;2022年新
3月24日,生意社黄芪基准价为22 60元 公斤,与本月初(22 20元 公斤)相比,上涨了1 80%。黄芪年度统计(2022-03-24--2023-03
LED大灯亮度高,为何老司机只愿意使用卤素车灯,原因很现实,现在的汽车配置越来越丰富,实用的配置还是那几项,没用的配置反而一大堆,羊毛出
1、《凤麟》,作者:沐血夜;2、《逆天狂妃》,作者:冰水仙;3、《至尊狂女》,作者:洛梓潼;4、《凤战天下》,作者:公子羽;5、《驭兽玄女
1、东北大鼓是一种流传于东北地区的传统戏曲艺术形式,深受群众喜爱。2、榆树的东城派东北大鼓,在东北大鼓流派中独树一帜
人生会经历三次成长:第一次是发现自己不是世界中心;第二次是发现即使再怎么努力,终究还是有些事令人无能为力;第三次是在明知道有些事可能
泰和科技:中泰证券股份有限公司关于山东泰和科技股份有限公司2022年度证券与衍生品投资情况的核查意见
1、是男女间的爱情小说~下面是简介:他与她是青梅竹马,在权谋的土壤中由鲜血浇灌,开出妖艳的情花他与她是致命的邂逅,孰是孰