prometheus基于kubernetes监控
1、Prometheus介绍
- Prometheus 是一个开源的服务监控系统和时序数据库,其提供了通用的数据模型和快捷数据采集、存储和查询接口。它的核心组件Prometheus server会定期从静态配置的监控目标或者基于服务发现自动配置的自标中进行拉取数据,当新拉取到的数据大于配置的内存缓存区时,数据就会持久化到存储设备当中。
- 每个被监控的主机都可以通过专用的exporter 程序提供输出监控数据的接口,它会在目标处收集监控数据,并暴露出一个HTTP接口供Prometheus server查询,Prometheus通过基于HTTP的pull的方式来周期性的采集数据。
- 任何被监控的目标都需要事先纳入到监控系统中才能进行时序数据采集、存储、告警和展示,监控目标可以通过配置信息以静态形式指定,也可以让Prometheus通过服务发现的机制进行动态管理。
2、Prometheus特点
- 多维数据模型:由指标名称和键值对标识的时间序列数据
时序数据,是在一段时间内通过重复测量(measurement)而获得的观测值的集合;将这些观测值绘制于图形之上,它会有一个数据轴和一个时间轴;
服务器指标数据、应用程序性能监控数据、网络数据等也都是时序数据;
PromQL一种灵活的查询语言,可以利用多维数据完成复杂查询
内置时间序列数据库Prometheus;外置的远端存储通常会用:InfluxDB、openTsDB等
基于HTTP的pull(拉取)方式采集时间序列数据
同时支持PushGateway组件push(推送)方式收集数据
通过静态配置或服务发现发现目标
支持作为数据源接入Grafana,多种模式的绘图和仪表板支持
架构图
prometheus各类设备常用的监控方法
prometheus对kubernetes的监控
对于Kubernetes而言,我们可以把当中所有的资源分为几类:
- 基础设施层(Node):集群节点,为整个集群和应用提供运行时资源
- 容器基础设施(Container):为应用提供运行时环境
- 用户应用(Pod):Pod中会包含一组容器,它们一起工作,并且对外提供一个(或者一组)功能
- 内部服务负载均衡(Service):在集群内,通过Service在集群暴露应用功能,集群内应用和应用之间访问时提供内部的负载均衡
- 外部访问入口(Ingress):通过Ingress提供集群外的访问入口,从而可以使外部客户端能够访问到部署在Kubernetes集群内的服务
因此,如果要构建一个完整的监控体系,我们应该考虑,以下5个方面:
- 集群节点状态监控:从集群中各节点的kubelet服务获取节点的基本运行状态
- 集群节点资源用量监控:通过Daemonset的形式在集群中各节点部署Node Exporter采集节点的资源使用情况
- 节点中运行的容器监控:通过各个节点中kubelet内置的cAdvisor中获取各节点中所有容器的运行状态和资源使用状态
- 如果在集群中部署的应用程序本身内置了对prometheus的监控支持,那么我们还应该找到相应的pod实例,并从该pod实例中获取其内部运行状态的监控指标
- 对k8s本身的组件做监控:apiserver、scheduler、controller-manager、kubelet、kube-proxy
机器架构
k8s-master节点 | k8s-node节点 | |
数量 | 1 | 2 |
hostname | k8s-master | k8s-node[1/2] |
IP | 192.168.208.10 | 192.168.208.20/30 |
k8s版本 | 1.22.2 | 1.22.2 |
使用kubectl get nodes查看节点数量即可
node_exporter组件安装和配置
node_exporter介绍
node_exporter可以采集机器(物理机、虚拟机、云主机等)的监控指标数据,能够采集到的指标包括CPU、内存、磁盘、网络、文件数等信息
安装node_exporter
[root@k8s-master]#kubectl create ns monitor-sa
[root@k8s-master]#ctr -n k8s.io images import node-exporter.tar.gz
[root@k8s-master]#ctr -n k8s.io images import node-exporter.tar.gz
[root@k8s-master]#ctr -n k8s.io images import node-exporter.tar.gz
[root@k8s-master]#cat node-export.yaml
apiVersion: apps/v1
kind: DaemonSet #可以保证k8s集群的每个节点都运行完全一样的pod
metadata:
name: node-exporter
namespace: monitor-sa
labels:
name: node-exporter
spec:
selector:
matchLabels:
name: node-exporter
template:
metadata:
labels:
name: node-exporter
spec:
hostPID: true
hostIPC: true
hostNetwork: true# hostNetwork、hostIPC、hostPID都为True时,表示这个Pod里的所有容器,会直接使用宿主机的网络,直接与宿主机进行IPC(进程间通信)通信,可以看到宿主机里正在运行的所有进程。加入了hostNetwork:true会直接将我们的宿主机的9100端口映射出来,从而不需要创建service 在我们的宿主机上就会有一个9100的端口
containers:
- name: node-exporter
image: prom/node-exporter:v0.16.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 9100
resources:
requests:
cpu: 0.15
securityContext:
privileged: true #开启特权模式
args:
- --path.procfs#配置挂载宿主机(node节点)的路径
- /host/proc
- --path.sysfs#配置挂载宿主机(node节点)的路径
- /host/sys
- --collector.filesystem.ignored-mount-points
- '"^/(sys|proc|dev|host|etc)($|/)"'#通过正则表达式忽略某些文件系统挂载点的信息收集
volumeMounts:
- name: dev
mountPath: /host/dev
- name: proc
mountPath: /host/proc
- name: sys
mountPath: /host/sys
- name: rootfs
mountPath: /rootfs#将主机/dev、/proc、/sys这些目录挂在到容器中,这是因为我们采集的很多节点数据都是通过这些文件来获取系统信息的。
tolerations:
- key: ""
operator: "Exists"
effect: "NoSchedule" #对污点为NoSchedule的节点定义容忍度
volumes:
- name: proc
hostPath:
path: /proc
- name: dev
hostPath:
path: /dev
- name: sys
hostPath:
path: /sys
- name: rootfs
hostPath:
path: /
[root@k8s-master]#kubectl apply -f node-export.yaml
#通过kubectl apply更新node-exporter.yaml文件
[root@k8s-master]#kubectl get pod -n monitor-sa
#查看node-exporter是否部署成功
#显示如下,看到pod的状态都是running,说明部署成功
[root@k8s-master]# curl http://192.168.208.20:9100/metrics
#通过node-exporter采集数据
#node-export默认的监听端口是9100,可以看到当前主机获取到的所有监控数据
[root@k8s-master]# curl http://192.168.208.20:9100/metrics | grep node_cpu_seconds
#显示192.168.208.20主机cpu的使用情况
结果大概如下:
prometheus server安装和配置
创建serviceaccount账号,对其做RBAC授权
#创建一个sa账号monitor
[root@k8s-master ~]# kubectl create serviceaccount monitor -n monitor-sa
#把sa账号monitor通过clusterrolebing绑定到clusterrole上
[root@wk8s-master ~]# kubectl create clusterrolebinding monitor-clusterrolebinding -n monitor-sa --clusterrole=cluster-admin --serviceaccount=monitor-sa:monitor
[root@k8s-master~]# kubectl create clusterrolebinding monitor-clusterrolebinding-1 -n monitor-sa --clusterrole=cluster-admin --user=system:serviceaccount:monitor:monitor-sa
创建prometheus数据存储目录
#在k8s集群的两个node节点上创建数据存储目录
[root@k8s-master ~]# mkdir /data
[root@k8s-master ~]# chmod 777 /data/
[root@k8s-master ~]# mkdir /data
[root@k8s-master ~]# chmod 777 /data/
安装prometheus server服务
创建一个configmap存储卷,用来存放prometheus配置信息
[root@k8s-master]# cat prometheus-cfg.yaml
---
kind: ConfigMap
apiVersion: v1
metadata:
labels:
app: prometheus
name: prometheus-config
namespace: monitor-sa
data:
prometheus.yml: |
global:
scrape_interval: 15s
scrape_timeout: 10s
evaluation_interval: 1m
scrape_configs:
- job_name: 'kubernetes-node'
kubernetes_sd_configs:
- role: node
relabel_configs:
- source_labels: [__address__]
regex: '(.*):10250'
replacement: '${1}:9100'
target_label: __address__
action: replace
- action: labelmap
regex: __meta_kubernetes_node_label_(.+)
- job_name: 'kubernetes-node-cadvisor'
kubernetes_sd_configs:
- role: node
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
relabel_configs:
- action: labelmap
regex: __meta_kubernetes_node_label_(.+)
- target_label: __address__
replacement: kubernetes.default.svc:443
- source_labels: [__meta_kubernetes_node_name]
regex: (.+)
target_label: __metrics_path__
replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor
- job_name: 'kubernetes-apiserver'
kubernetes_sd_configs:
- role: endpoints
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
relabel_configs:
- source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
action: keep
regex: default;kubernetes;https
- job_name: 'kubernetes-service-endpoints'
kubernetes_sd_configs:
- role: endpoints
relabel_configs:
- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]
action: keep
regex: true
- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme]
action: replace
target_label: __scheme__
regex: (https?)
- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path]
action: replace
target_label: __metrics_path__
regex: (.+)
- source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]
action: replace
target_label: __address__
regex: ([^:]+)(?::\d+)?;(\d+)
replacement: $1:$2
- action: labelmap
regex: __meta_kubernetes_service_label_(.+)
- source_labels: [__meta_kubernetes_namespace]
action: replace
target_label: kubernetes_namespace
- source_labels: [__meta_kubernetes_service_name]
action: replace
target_label: kubernetes_name
执行kubectl apply -f prometheus-cfg.yaml命令即可
结果如上有了这个就说明k8s的prometheus的config资源配置成功了
通过deployment部署prometheus
[root@k8s-master ~]# cat prometheus-deploy.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: prometheus-server
namespace: monitor-sa
labels:
app: prometheus
spec:
replicas: 2
selector:
matchLabels:
app: prometheus
component: server
#matchExpressions:
#- {key: app, operator: In, values: [prometheus]}
#- {key: component, operator: In, values: [server]}
temp