prometheus|prometheus k8s服务发现
Prometheus的服务发现在解决什么问题? 被监控的目标(target)是整个监控体系中重要组成部分,传统监控系统zabbix通过 网络发现
的机制自动创建主机到zabbix-server,进而快速地对目标进行监控。同样在Prometheus监控中存在一个叫服务发现
的机制,在k8s容器环境中由于集群内实例网络地址是动态的,我们不可能每次创建或修改实例都将实例IP写入Prometheus的target中,借助服务发现
我们可以快速的将集群内的资源注册到Prometheus-server中。
Prometheus 中的 scrape_config 是什么? Prometheus通过yml文件来存储配置文件,通过scrape_config(抓取配置)域来配置抓取目标和抓取服务发现方式。
scrape_config
指定了一组target和抓取参数。在一般情况下,一个scrape_config指定一个作业。
如下指定了两个静态服务发现prometheus、kube-state-metrics,
scrape_configs:
- job_name: prometheus
static_configs:
- targets:
- localhost:9090
- job_name: kube-state-metrics
static_configs:
- targets:
- prometheus-kube-state-metrics.monitoring.svc:8080
Prometheus支持的服务发现非常多:
- static_configs: 静态服务发现
- dns_sd_configs: DNS 服务发现
- file_sd_configs: 文件服务发现
- kubernetes_sd_configs: Kubernetes 服务发现
- gce_sd_configs: GCE 服务发现
- ec2_sd_configs: EC2 服务发现
- openstack_sd_configs: OpenStack 服务发现
- azure_sd_configs: Azure 服务发现
什么是 Kubernetes_sd_configs? Prometheus中k8s服务发现的原理是通过 Kubernetes 的REST API 检索抓取目标,并始终与集群状态保持同步。所以我们需要配置Kubernetes_sd_configs来访问K8s API
比如我们要抓取k8s ingress,需要为Prometheus指定用于RBAC认证证书和serviceaccount的token
- job_name: 'kubernetes-ingress'
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
insecure_skip_verify: true
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
kubernetes_sd_configs:
- role: ingress
这里的role为k8s中资源实体如 endpoints、service,、pod,、node或 ingress
当指定ingress时,Prometheus将每个入口地址发现为一个目标。
重载配置文件后可以在Prometheus Service Discovery查看发现的target
文章图片
发现apiserver配置
- job_name: kubernetes-apiservers
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
insecure_skip_verify: true
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
kubernetes_sd_configs:
- role: endpoints
relabel_configs:
- action: keep
regex: default;
kubernetes;
https
source_labels:
- __meta_kubernetes_namespace
- __meta_kubernetes_service_name
- __meta_kubernetes_endpoint_port_name
这里我们用到了
relabel_configs
即重新打标,动作为keep
啥意思呢? 首先我们通过k8s API获取到所有endpoints,将endpoints中的含元数据 namespace、service_name、endpoint_port_name的实例和regex匹配,如果匹配成功就保留。这用来过滤一下不需要的实例时很有用。通过kubectl 查看的kubernetes这个endpoints的信息
# kubectl describe endpoints kubernetes
Name:kubernetes
Namespace:default
Labels:
Annotations:
Subsets:
Addresses:192.168.1.82,192.168.1.83,192.168.1.84
NotReadyAddresses:
Ports:
NamePortProtocol
----------------
https6443TCP
发现出来的target如下
文章图片
这里有一个隐藏点,Prometheus会把元数据中的
__address__
和__metrics_path__
作为endpoint,下面我们来看一个替换元数据的node实例发现node配置
- job_name: kubernetes-nodes
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
insecure_skip_verify: true
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
kubernetes_sd_configs:
- role: node
relabel_configs:
- action: labelmap
regex: __meta_kubernetes_node_label_(.+)
- replacement: kubernetes.default.svc:443
target_label: __address__
- regex: (.+)
replacement: /api/v1/nodes/$1/proxy/metrics
source_labels:
- __meta_kubernetes_node_name
target_label: __metrics_path__
这里的动作为
labelmap
,可用于标签替换。首先获取所有node,对元数据__address__
中的value替换为replacement的值kubernetes.default.svc:443
在replacement的值中可以通过$1,$2,$3...的方式引用source_labels的key-value,所以元数据
__metrics_path__
的值将会被/api/v1/nodes/{node_name}/proxy/metrics替换。发现出的node如下所示,此时target的address和metrics_path已被替换了。
文章图片
以上通过kubernetes-apiservers、kubernetes-nodes的实例简单介绍了Prometheus中如何实现k8s集群资源的服务发现以及相应的配置和操作。亦可参考Prometheus示例配置prometheus-kubernetes
【prometheus|prometheus k8s服务发现】希望小作文对你有些许帮助,如果内容有误请指正。通过博客阅读:iqsing.github.io
推荐阅读
- 分布式文件上传导致服务假死了()
- 前端|RuoYi-Cloud 若依微服务版启动教程(保姆级)
- Zabbix|Zabbix 5.0(服务端进程总结)
- 从菜鸟到高手|从菜鸟到高手, HMS Core图像分割服务教你如何在复杂背景里精细抠图
- 爱耳日|HMS Core手语服务(爱耳护耳,共创精彩人生)
- 在服务器的docker里|在服务器的docker里 装anacond3深度学习环境的全流程超基础
- 淘宝旧镜像源快要停止服务了
- 【北亚数据恢复】企业如何避免服务器数据丢失造成重大损失()
- 一键部署|一键部署 K8S 环境,10分钟玩转,这款开源神器实在太香了!
- 02|02 - 入门 & Nginx 服务 & Docker 概念【合集】