Prometheus是什么?
简介
Prometheus初是 SoundCloud 构建的开源系统监控和报警工具,是一个独立的开源项目,于2016年加入了 CNCF 基金会,作为继 Kubernetes 之后的第二个托管项目。
其特征如下:
- 具有由 metric 名称和键/值对标识的时间序列数据的多维数据模型
- 有一个灵活的查询语言
- 不依赖分布式存储,只和本地磁盘有关
- 通过 HTTP 的服务拉取时间序列数据
- 也支持推送的方式来添加时间序列数据
- 还支持通过服务发现或静态配置发现目标
- 多种图形和仪表板支持
它有以下几个组件组成:
- Prometheus Server:用于抓取指标、存储时间序列数据
- exporter:暴露指标让任务来抓
- pushgateway:push 的方式将指标数据推送到该网关
- alertmanager:处理报警的报警组件
- adhoc:用于数据查询
架构如下:
其流程很简单,Prometheus server端可以直接接收或者通过pushgateway获取到数据,存储到TSDB中,然后对数据进行规则整理,通过Altermanager进行报警或者通过Grafana等工具进行展示。
搭建
在容器外搭建
Prometheus在容器外搭建非常简单,只需要下载对应的release,启动二进制文件即可。 下载地址:https://prometheus.io/download/ 然后可以直接用下面命令启动:
./prometheus --config.file=prometheus.yml
其中prometheus.yaml是主要的配置文件,主要配置信息如下:
global:
scrape_interval: 15s
evaluation_interval: 15s
rule_files:
# - "first.rules"
# - "second.rules"
scrape_configs:
- job_name: prometheus
static_configs:
- targets: ['localhost:9090']
上面配置信息主要包括三个模块:global,rule_files,scrape_configs。 (1)、global定义Prometheus server全局配置。
- scrape_interval,定义采集频率
- evaluation_interval,定义评估规则的频率,Prometheus使用规则产生的时间序列数据或者产生的警报
(2)、rule_file,用于指定规则,Prometheus使用规则产生的时间序列数据或者产生的警报 (3)、scrape_configs,用于控制监控的资源
Prometheus默认会通过/metrics路径采集metrics,比如:curl http://localhost:9090/metrics 就可以看到相应的资源对象了。
在容器内搭建
1、创建namespace:
# kubectl create ns kube-ops
2、创建configmap,保存我们的主配置文件prometheus.yaml,这样我们要更新配置文件的话就只需要更新这个configmap即可。 prom-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: prometheus-config
namespace: kube-ops
data:
prometheus.yaml: |
global:
scrape_interval: 15s
scrape_timeout: 15s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
创建资源:
# kubectl apply -f prom-configmap.yaml
configmap/prometheus-config created
# kubectl get configmap -n kube-ops
NAME DATA AGE
prometheus-config 1 16s
(3)、创建prometheus的Pod prom-deploy.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: prometheus-deploy
namespace: kube-ops
labels:
app: prometheus
spec:
selector:
matchLabels:
app: prometheus
replicas: 1
template:
metadata:
labels:
app: prometheus
spec:
serviceAccountName: prometheus-sa
containers:
- name: prometheus
image: prom/prometheus:v2.14.0
imagePullPolicy: IfNotPresent
command:
- "/bin/prometheus"
args:
- "--config.file=/etc/prometheus/prometheus.yaml"
- "--storage.tsdb.path=/data/prometheus"
- "--storage.tsdb.retention=24h"
- "--web.enable-admin-api"
- "--web.enable-lifecycle"
ports:
- name: http
protocol: TCP
containerPort: 9090
volumeMounts:
- name: data
mountPath: "/data/prometheus"
subPath: prometheus
- name: prometheus-config
mountPath: "/etc/prometheus"
resources:
requests:
cpu: 100m
memory: 500Mi
limits:
cpu: 100m
memory: 500Mi
securityContext:
runAsUser: 0
volumes:
- name: data
persistentVolumeClaim:
claimName: prometheus
- name: prometheus-config
configMap:
name: prometheus-config
我们把上面定义的configMap通过挂载的形式挂载到容器中,然后我们还要定义一个持久化PVC。 (4)、创建PV,PVC prom-pvc.yaml
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: prometheus-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
nfs:
server: xx.xx.xx.xx
path: /data/k8s/prometheus
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: prometheus
namespace: kube-ops
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
(5)、配置RBAC认证 我们在deploy的模板中定义了serviceAccount,我们就需要定义一个serviceAccount的RBAC。 prom-rbac.yaml
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: prometheus-sa
namespace: kube-ops
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: prometheus
rules:
- apiGroups:
- ""
resources:
- nodes
- services
- endpoints
- pods
- nodes/proxy
verbs:
- get
- list
- watch
- apiGroups:
- ""
resources:
- configmaps
- nodes/metrics
verbs:
- get
- nonResourceURLs:
- /metrics
verbs:
- get
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: prometheus
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: prometheus
subjects:
- kind: ServiceAccount
name: prometheus-sa
namespace: kube-ops
(6)、创建Service,用来暴露promethes服务 prom-service.yaml
apiVersion: v1
kind: Service
metadata:
name: prometheus-svc
namespace: kube-ops
spec:
type: NodePort
selector:
app: prometheus
ports:
- name: prometheus-web
port: 9090
targetPort: http
(7)、创建配置清单 创建PVC
# kubectl apply -f prom-pvc.yaml
persistentvolume/prometheus-pv created
persistentvolumeclaim/prometheus created
# kubectl get pv -n kube-ops
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
prometheus-pv 10Gi RWO Recycle Bound kube-ops/prometheus 7s
# kubectl get pvc -n kube-ops
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
prometheus Bound prometheus-pv 10Gi RWO 13s
创建RBAC
# kubectl apply -f prom-rbac.yaml
serviceaccount/prometheus-sa created
clusterrole.rbac.authorization.k8s.io/prometheus created
clusterrolebinding.rbac.authorization.k8s.io/prometheus created
# kubectl get clusterrole -n kube-ops | grep prometheus
prometheus 35s
# kubectl get clusterrolebinding -n kube-ops | grep prometheus
prometheus 46s
创建Pod
# kubectl apply -f prom-deploy.yaml
deployment.extensions/prometheus-deploy created
# kubectl get deploy -n kube-ops
NAME READY UP-TO-DATE AVAILABLE AGE
prometheus-deploy 1/1 1 0 10s
# kubectl get pod -n kube-ops
NAME READY STATUS RESTARTS AGE
prometheus-deploy-694446b7cb-ssdqm 1/1 Running 0 18s
创建Service
# kubectl apply -f prom-service.yaml
service/prometheus-svc created
# kubectl get svc -n kube-ops
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
prometheus-svc NodePort 10.68.254.74 <none> 9090:23050/TCP 6
然后就可以通过浏览器访问WEB界面了
完
- Django 1.10中文文档-第一个应用Part5-测试
- 设计模式(5)-己所不欲,施之于人(代理模式)
- Python标准库笔记(4) — collections模块
- 使用captcha模块生成图形验证码
- 设计模式(6)-装饰器(认识程序中的装饰器)
- Selenium Webdriver常用方法
- 设计模式(7)-模板(从事务处理应用的模板)
- Python NLP入门教程
- 设计模式(8)-状态模式(关注状态之间的变化)
- Python标准库笔记(6) — struct模块
- Golang中image/jpeg包和image/png包用法
- Python Webdriver 重新使用已经打开的浏览器实例
- Golang-实现图片缩放
- jbpm5.1介绍(2)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【DB笔试面试849】在Oracle中,在没有配置ORACLE_HOME环境变量的情况下,如何获取ORACLE_HOME目录?
- 算法和数据结构: 九 平衡查找树之红黑树
- 算法和数据结构: 七 二叉查找树
- Python 面向对象编程(下篇)
- 算法和数据结构: 符号表及其基本实现
- 算法和数据结构:堆排序
- mysql 优化海量数据插入和查询性能
- 聊聊dubbo-go的DubboPackage
- mysql行转列,列转行
- js异步编程
- C# SpinWait
- R:STRINGdb包用于string蛋白互作分析
- ManualResetEvent
- 非阻塞式的原子性操作-CAS应用及原理
- MySQL索引原理以及查询优化