Prometheus监控学习笔记之Prometheus的Relabel,SD以及Federation功能
0x00 k8s 的监控设计
k8s 默认以及推荐的监控体系是它自己的一套东西:Heapster + cAdvisor + Influxdb + Grafana,具体可以看 这里 。
包括 k8s 自身的 HPA (Horizontal Pod Autoscaler),默认从 Heapster 中获取数据进行自动伸缩。(顺便提一句,当你部署完 k8s 集群之后,如果从 Dashboard 中看不到监控数据,往往就是因为你没有部署 Heapster,或者网络层有问题, Dashboard 无法访问 Heapster。)
那,这跟我们介绍的 Prometheus 有什么关系?
首先,它们都是一套监控解决方案,而 k8s 没有把 Prometheus 作为默认监控,因此,如果你想直接使用 HPA,你还是需要部署 Heapster。
其次,kubelet 中的 cAdvisor 其实是支持 Prometheus 作为存储的后端的,只是相对于 Prometheus 自己的 SD 解决方案来说,太弱了点。
最后,k8s 1.6 之后,在 annotations 中配置 custom metrics 的方式已经被移除了,而根据
Prometheus 的监控数据来进行自动伸缩还是很有可操作性的。
0x01 Prometheus配置
其实部署很简单,关键是配置,因此这里着重介绍下,如何配置。
1.1 Relabel
首先,先来了解下,什么是 relabel_config。
就如字面意思而言,它的作用是 Prometheus 抓取 metrics 之前,就将对象相关的 labels 重写。下面是它几个重要的 label:
- __address__:默认为 host:port,也是之后抓取之后 instance 的值;
- __scheme__:http or https ?;
- __metrics_path__:就是 metrics path,默认为 /metrics;
- __param_${name}:用来作为 URL parameter,比如 http://…/metrics?name=value;
- __meta_:这个开头的配置都是 SD 相关的配置;
1.2 Kubernetes SD
其次,上次提到,我们可以用到 Service Discovery 这个功能,其中就包含 Kubernetes SD。
它包含四种角色:
- node
- service
- pod
- endpoints
由于篇幅所限,这里只是简单介绍下其中的 node 还有 pod 角色:
- job_name: 'kubernetes-nodes'
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token kubernetes_sd_configs:
- role: node relabel_configs:
# 即从 __meta_kubernetes_node_label_<labelname> 这个配置中取出 labelname 以及 value
- action: labelmap
regex: __meta_kubernetes_node_label_(.+) # 配置 address 为 k8s api 的地址,相关的 ca 证书以及 token 在上面配置
- target_label: __address__
replacement: kubernetes.default.svc:443 # 取出所有的 node,然后设置 /api/v1/nodes/<node_name>/proxy/metrics 为 metrics path
- source_labels:
- __meta_kubernetes_node_name
regex: (.+)
target_label: __metrics_path__
replacement: /api/v1/nodes/${1}/proxy/metrics
接下来的这个 pod 角色挺重要:
- job_name: 'kubernetes-pods' kubernetes_sd_configs:
- role: pod relabel_configs:
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
action: keep
regex: true
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
action: replace
target_label: __metrics_path__
regex: (.+)
- source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]
action: replace
regex: ([^:]+)(?::\d+)?;(\d+)
replacement: $1:$2
target_label: __address__
- action: labelmap
regex: __meta_kubernetes_pod_label_(.+)
- source_labels: [__meta_kubernetes_namespace]
action: replace
target_label: kubernetes_namespace
- source_labels: [__meta_kubernetes_pod_name]
action: replace
target_label: kubernetes_pod_name
在定义了这个角色之后,你只要在你部署的应用 Pod 描述中,加入以下 annotations 就能让 Prometheus 自动发现此 Pod 并采集监控数据了:
annotations:
prometheus.io/scrape: "true"
prometheus.io/port: "<your app port>"
其它详细配置请看 这里。
0x02 Kubernetes Deployment
最后,部署 Prometheus,需要注意的是,我们已经在 k8s 之外单独部署了一套,为了统一处理,在这里是打算作为中转的。
apiVersion: v1
kind: ConfigMap
metadata:
name: prometheus
namespace: kube-system
labels:
app: prometheus
data:
prometheus.yml: |-
# 省略,在这里定义你需要的配置
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: prometheus
namespace: kube-system
spec:
replicas: 1
template:
metadata:
labels:
app: prometheus
spec:
containers:
- name: prometheus
image: prom/prometheus:latest
args:
- '-config.file=/prometheus-data/prometheus.yml'
# 显然,这里没有用 `Stateful Sets`,存储时间不用太长
- '-storage.local.retention=48h0m0s'
ports:
- name: prometheus
containerPort: 9090
volumeMounts:
- name: data-volume
mountPath: /prometheus-data
volumes:
- name: data-volume
configMap:
name: prometheus
---
# 简单处理,直接使用 NodePort 暴露服务,你也可以使用 Ingress
apiVersion: v1
kind: Service
metadata:
name: prometheus
namespace: kube-system
spec:
selector:
app: prometheus
ports:
- name: prometheus
protocol: TCP
port: 9090
nodePort: 30090
type: NodePort
0x03 Prometheus Federate
而在我们外部单独的 Prometheus 中,需要配置 Federate,将 k8s 中 Prometheus 采集的 metrics 全部同步出来。
- job_name: 'federate'
scrape_interval: 15s honor_labels: true
metrics_path: '/federate' params:
'match[]':
- '{job=~".+"}' # 取 k8s 里面部署的 Prometheus 中所有的 job 数据 static_configs:
- targets:
- '<k8s-node1>:30090'
- '<k8s-node2>:30090'
- '<k8s-node3>:30090'
参考
Prometheus监控学习笔记之Prometheus的Relabel,SD以及Federation功能的更多相关文章
- Prometheus监控学习笔记之prometheus的远端存储
0x00 概述 prometheus在容器云的领域实力毋庸置疑,越来越多的云原生组件直接提供prometheus的metrics接口,无需额外的exporter.所以采用prometheus作为整个集 ...
- Prometheus监控学习笔记之Prometheus普罗米修斯监控入门
0x00 概述 视频讲解通过链接网易云课堂·IT技术快速入门学院进入,更多关于Prometheus的文章. Prometheus是最近几年开始流行的一个新兴监控告警工具,特别是kubernetes的流 ...
- Prometheus监控学习笔记之prometheus的federation机制
0x00 概述 有时候对于一个公司,k8s集群或是所谓的caas只是整个技术体系的一部分,往往这个时候监控系统不仅仅要k8s集群以及k8s中部署的应用,而且要监控传统部署的项目.也就是说整个监控系统不 ...
- Prometheus监控学习笔记之Prometheus存储
0x00 概述 Prometheus之于kubernetes(监控领域),如kubernetes之于容器编排.随着heapster不再开发和维护以及influxdb 集群方案不再开源,heapster ...
- Prometheus监控学习笔记之Prometheus不完全避坑指南
0x00 概述 Prometheus 是一个开源监控系统,它本身已经成为了云原生中指标监控的事实标准,几乎所有 k8s 的核心组件以及其它云原生系统都以 Prometheus 的指标格式输出自己的运行 ...
- Prometheus监控学习笔记之Prometheus监控简介
0x00 Prometheus容器监控解决方案 Prometheus(普罗米修斯)是一个开源系统监控和警报工具,最初是在SoundCloud建立的.它是一个独立的开放源码项目,并且独立于任何公司.不同 ...
- Prometheus监控学习笔记之Prometheus查询无数据或者Grafana不显示数据的诡异问题
0x00 概述 Prometheus和Grafana部署完成后,网络正常,配置文件正常,抓取agent运行正常,使用curl命令获取监控端口数据正常,甚至Prometheus内的targets列表内都 ...
- Prometheus监控学习笔记之Prometheus 2.x版本的常用变化
最近用了prometheus 2.0 版本,感觉改变还是有点大,现将改变相关记录如下: 1.prometheus.yml文件配置修改后,要想重新加载,必须在启动的时候添加参数: --web.enabl ...
- Prometheus监控学习笔记之Prometheus的架构及持久化
0x00 Prometheus是什么 Prometheus是一个开源的系统监控和报警工具,特点是 多维数据模型(时序列数据由metric名和一组key/value组成) 在多维度上灵活的查询语言(Pr ...
随机推荐
- CAJ转换成PDF在线方法是什么
做学术性的朋友经常会需要将CAJ文件转换成PDF文件,毕竟CAJ文件只能在CAJ阅读器上显示,但是有很多转换软件并不能很好的完成转换,小编今天就为大家讲解一下CAJ转换成PDF在线方法是什么,大家要认 ...
- css学习_css3伸缩布局 flex布局
1.flex布局 案例一: 案例二: 保证不至于缩放得太小或太大 案例三:flex的值不一定要写成几份,可以写成固定值 案例四: 竖着3等分(父容器按照高度3等分) !!案例 -----用fle ...
- 关于python列表和元组的基本操作
一.列表 列表是python中最常出现的一种数据存储形式,掌握列表的基本操作可以快速而有效的提高我们的代码书写效率.列表中存放的数据有如下基本操作:如增.删.改.查,掌握了这四个操作,就基本掌握了列表 ...
- 获取各种编码(Unicode,UTF8等)的识别符
下面是常用编码的识别符, 在 Delphi(2009) 中如何获取呢?Unicode: FF FE; BigEndianUnicode: FE FF; UTF8: EF BB BF var bs: ...
- go 学习第一个hello world 遇到的问题
mac:Go安装和配置+GoLand安装和使用之完整教程 https://blog.csdn.net/zxy_666/article/details/80182688 前言作为一个go语言程序员,觉得 ...
- AFNetWorking同步请求
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); //创建信号量 AFHTTPSessionManager *manager ...
- vue 点击图片放大
文档:https://www.npmjs.com/package/vue-directive-image-previewer [只能弹框查看 不能关闭和播放下一张,其他功能使用别的插件] 安装: np ...
- Window Server配置Flask
1.安装了Chrome 2.安装git 3.创建SSH key:ssh-keygen -t rsa -C "youremail@example.com" 4.安装notepad++ ...
- Java开发规范总结
Service / DAO 层方法命名规约: 1 ) 获取单个对象的方法用 get 做前缀.2 ) 获取多个对象的方法用 list 做前缀.3 ) 获取统计值的方法用 count 做前缀.4 ) 插 ...
- 2018-2019-2 网络对抗技术 20165321 Exp3 免杀原理与实践
1. 实践内容(4分) 1.1 正确使用msf编码器(0.5分),msfvenom生成如jar之类的其他文件(0.5分),veil-evasion(0.5分),加壳工具(0.5分),使用shellco ...