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 ...
随机推荐
- Visual Studio 2012编译的程序无法在XP下运行的解决办法【转】
最近看到一篇<Windows编程革命简史>,想到以前刚开始用VS2012的时候,编译的程序在其他人那无法运行,一查才知道是VS2012本身不支持XP.当然现在微软早已在VS2012 Upd ...
- js上课笔记
Html 结构化CSS 样式JavaScript 行为交互01.JavaScript基础02.JavaScript操作BOM对象03.JavaScript操作DOM对象 *****04.JavaScr ...
- Jumpserver之快速入门
一,系统设置 1.1基本设置 修改 url 的"localhost"为你的实际 url 地址, 否则邮件收到的地址将为"localhost" 也无法创建新用户 ...
- 如何设置 jenkins 任务执行的历史记录在左侧显示的格式?
java -jar I:\CDC\jenkins\jenkins-cli.jar -s http://$ENV:MasterHost.us.oracle.com set-build-display-n ...
- js 模拟超级大LE透中头奖 统计中头奖需要购买的彩票次数以及购买总金额
<!DOCTYPE html> <html> <head> <title>超级大LE透模拟</title> </head> &l ...
- hydra用法
三.Syntax # hydra [[[-l LOGIN|-L FILE] [-p PASS|-P FILE]] | [-C FILE]] [-e ns] [-o FILE] [-t TASKS] [ ...
- python摸爬滚打之day33----线程
1.线程 能够独立运行的基本单位. 进程: 进程是资源分配的最小单位; 每一个进程中至少有一个线程. 线程: 线程是cpu调度的最小单位. 2.创建线程(类似于创建进程) import time f ...
- oracle解决导入高版本dmp报错问题:IMP-00058: ORACLE error 12547 encountered
低版本oracle导入高版本的dmp时,导过的人都应该清楚,直接导入是会报错的,报错信息如下,其实解决这个问题很简单, 只要修改一下dmp内的版本号就可以了. 修改版本不能随便使用文本工具打开,否知会 ...
- 学号20175313 《实现Linux下od -tx -tc XXX的功能》第九周
目录 MyOD 一.题目要求 二.题目理解 三.需求分析 四.设计思路 五.代码链接 六.代码实现过程中遇到的问题 七.运行结果截图 八.参考资料 MyOD 一.题目要求 编写MyOD.java 用j ...
- 循环结构 : while .. for
# ###循环结构 : while .. for ''' while 循环 可以提高代码的效率,减少代码的冗余 while 条件表达式: code1 code2 如果条件表达式成立,返回True , ...