Prometheus+grafana监控 k8s集群

2023-05-16

在k8s集群中使用node-exporter、prometheus、grafana对集群进行监控

node-exporter组件负责收集节点上的metrics监控数据,并将数据推送给prometheus, prometheus负责存储这些数据

grafana将这些数据通过网页以图形的形式展现

prometheus的架构图:

包含组件:

  • prometheus server: 主要负责数据采集和存储,提供promQL查询语言支持。prometheus是一个时序数据库,将采集到的监控数据按照时间序列的方式存储到本地磁盘。

  • Push Gateway: 支持临时性job主动推送指标的中间网关。

  • PromDash: 使用rails开发的dashboard,用于可视化指标数据。

  • Exporters: 负责监控机器运行状态,提供被监控组件信息的 HTTP 接口被叫做 exporter。

  • 直接采集: exporter内置了prometheus支持,直接向prometheus暴露数据端点。

  • 间接采集:原不支持prometheus。通过prometheus提供的clien library编写的目标监控采集程序。

  • Altermanager: 从 Prometheus server 端接收到 alerts 后,会进行去除重复数据,分组,并路由到对收的接受方式,发出报警。常见的接收方式有:电子邮件,企业微信,钉钉 , webhook

  • WebUI: Prometheus内置一个简单的Web控制台,可以查询指标,查看配置信息或者Service Discovery等,实际工作中,查看指标或者创建仪表盘通常使用Grafana,Prometheus作为Grafana的数据源;9090提供图形化界面功能。

promethues 的各个组件基本都是用 golang 编写,对编译和部署十分友好.并且没有特殊依赖.基本都是独立工作。

工作原理:

  • Prometheus server 定期从配置好的 jobs 或者 exporters 中拉 metrics,或者接收来自 Pushgateway 发过来的 metrics,或者从其他的 Prometheus server 中拉 metrics。

  • Prometheus server 在本地存储收集到的 metrics,并运行已定义好的 alert.rules,记录新的时间序列或者向 Alertmanager 推送警报。

  • Alertmanager 根据配置文件,对接收到的警报进行处理,发出告警。

  • 在图形界面中,可视化采集数据。

开始部署工作:

环境准备:K8S集群已部署kube-dns或者coredns

master/node节点环境部署

所有node节点下载监控所需镜像

# docker pull prom/node-exporter

# docker pull prom/prometheus:v2.0.0

# docker pull grafana/grafana:4.2.0

用daemonset方式部署 node-exporter

master操作

node-exporter.yaml

# mkdir k8s-prometheus

# cd k8s-prometheus

# cat node-exporter.yaml

---

apiVersion: apps/v1

kind: DaemonSet

metadata:

name: node-exporter

namespace: kube-system

labels:

k8s-app: node-exporter

spec:

selector:

matchLabels:

k8s-app: node-exporter

template:

metadata:

labels:

k8s-app: node-exporter

spec:

containers:

- image: prom/node-exporter

name: node-exporter

ports:

- containerPort: 9100

protocol: TCP

name: http

---

apiVersion: v1

kind: Service

metadata:

labels:

k8s-app: node-exporter

name: node-exporter

namespace: kube-system

spec:

ports:

- name: http

port: 9100

nodePort: 31672

protocol: TCP

type: NodePort

selector:

k8s-app: node-exporter

# kubectl apply -f node-exporter.yaml

部署prometheus组件

master操作

rbac-setup.yaml

# cat rbac-setup.yaml

apiVersion: rbac.authorization.k8s.io/v1

kind: ClusterRole

metadata:

name: prometheus

rules:

- apiGroups: [""]

resources:

- nodes

- nodes/proxy

- services

- endpoints

- pods

verbs: ["get", "list", "watch"]

- apiGroups:

- extensions

resources:

- ingresses

verbs: ["get", "list", "watch"]

- nonResourceURLs: ["/metrics"]

verbs: ["get"]

---

apiVersion: v1

kind: ServiceAccount

metadata:

name: prometheus

namespace: kube-system

---

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

namespace: kube-system

# kubectl apply -f rbac-setup.yaml

configmap的形式管理prometheus组件的配置文件

configmap.yaml

# cat configmap.yaml

apiVersion: v1

kind: ConfigMap

metadata:

name: prometheus-config

namespace: kube-system

data:

prometheus.yml: |

global:

scrape_interval: 15s

evaluation_interval: 15s

scrape_configs:

- job_name: 'kubernetes-apiservers'

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-nodes'

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

- job_name: 'kubernetes-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-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

- job_name: 'kubernetes-services'

kubernetes_sd_configs:

- role: service

metrics_path: /probe

params:

module: [http_2xx]

relabel_configs:

- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_probe]

action: keep

regex: true

- source_labels: [__address__]

target_label: __param_target

- target_label: __address__

replacement: blackbox-exporter.example.com:9115

- source_labels: [__param_target]

target_label: instance

- action: labelmap

regex: __meta_kubernetes_service_label_(.+)

- source_labels: [__meta_kubernetes_namespace]

target_label: kubernetes_namespace

- source_labels: [__meta_kubernetes_service_name]

target_label: kubernetes_name

- job_name: 'kubernetes-ingresses'

kubernetes_sd_configs:

- role: ingress

relabel_configs:

- source_labels: [__meta_kubernetes_ingress_annotation_prometheus_io_probe]

action: keep

regex: true

- source_labels: [__meta_kubernetes_ingress_scheme,__address__,__meta_kubernetes_ingress_path]

regex: (.+);(.+);(.+)

replacement: ${1}://${2}${3}

target_label: __param_target

- target_label: __address__

replacement: blackbox-exporter.example.com:9115

- source_labels: [__param_target]

target_label: instance

- action: labelmap

regex: __meta_kubernetes_ingress_label_(.+)

- source_labels: [__meta_kubernetes_namespace]

target_label: kubernetes_namespace

- source_labels: [__meta_kubernetes_ingress_name]

target_label: kubernetes_name

- 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

# kubectl apply -f configmap.yaml

Prometheus deployment

prometheus.deploy.yml

# cat prometheus.deploy.yml

---

apiVersion: apps/v1

kind: Deployment

metadata:

labels:

name: prometheus-deployment

name: prometheus

namespace: kube-system

spec:

replicas: 1

selector:

matchLabels:

app: prometheus

template:

metadata:

labels:

app: prometheus

spec:

containers:

- image: prom/prometheus:v2.0.0

name: prometheus

command:

- "/bin/prometheus"

args:

- "--config.file=/etc/prometheus/prometheus.yml"

- "--storage.tsdb.path=/prometheus"

- "--storage.tsdb.retention=24h"

ports:

- containerPort: 9090

protocol: TCP

volumeMounts:

- mountPath: "/prometheus"

name: data

- mountPath: "/etc/prometheus"

name: config-volume

resources:

requests:

cpu: 100m

memory: 100Mi

limits:

cpu: 500m

memory: 2500Mi

serviceAccountName: prometheus

volumes:

- name: data

emptyDir: {}

- name: config-volume

configMap:

name: prometheus-config

# kubectl apply -f prometheus.deploy.yml

Prometheus service

prometheus.svc.yml

# cat prometheus.svc.yml

---

kind: Service

apiVersion: v1

metadata:

labels:

app: prometheus

name: prometheus

namespace: kube-system

spec:

type: NodePort

ports:

- port: 9090

targetPort: 9090

nodePort: 30003

selector:

app: prometheus

#kubectl apply -f prometheus.svc.yml

部署 grafana 组件

grafana deployment

grafana-deploy.yaml

# mkdir ../grafana

# cd ../grafana

# cat grafana-deploy.yaml

apiVersion: apps/v1

kind: Deployment

metadata:

name: grafana-core

namespace: kube-system

labels:

app: grafana

component: core

spec:

replicas: 1

selector:

matchLabels:

app: grafana

template:

metadata:

labels:

app: grafana

component: core

spec:

containers:

- image: grafana/grafana:4.2.0

name: grafana-core

imagePullPolicy: IfNotPresent

# env:

resources:

# keep request = limit to keep this container in guaranteed class

limits:

cpu: 100m

memory: 100Mi

requests:

cpu: 100m

memory: 100Mi

env:

# The following env variables set up basic auth twith the default admin user and admin password.

- name: GF_AUTH_BASIC_ENABLED

value: "true"

- name: GF_AUTH_ANONYMOUS_ENABLED

value: "false"

# - name: GF_AUTH_ANONYMOUS_ORG_ROLE

# value: Admin

# does not really work, because of template variables in exported dashboards:

# - name: GF_DASHBOARDS_JSON_ENABLED

# value: "true"

readinessProbe:

httpGet:

path: /login

port: 3000

# initialDelaySeconds: 30

# timeoutSeconds: 1

volumeMounts:

- name: grafana-persistent-storage

mountPath: /var

volumes:

- name: grafana-persistent-storage

emptyDir: {}

# kubectl apply -f grafana-deploy.yaml

grafana service

grafana-svc.yaml

# cat grafana-svc.yaml

apiVersion: v1

kind: Service

metadata:

name: grafana

namespace: kube-system

labels:

app: grafana

component: core

spec:

type: NodePort

ports:

- port: 3000

selector:

app: grafana

component: core

# kubectl apply -f grafana-svc.yaml

grafana ingress

grafana-ing.yaml

# cat grafana-ing.yaml

apiVersion: extensions/v1beta1

kind: Ingress

metadata:

name: grafana

namespace: kube-system

spec:

rules:

- host: k8s.grafana

http:

paths:

- path: /

backend:

serviceName: grafana

servicePort: 3000

# kubectl apply -f grafana-ing.yaml

WEB界面:

查看node-exporte

http://任一节点iP:31672/metrics

prometheus对应的nodeport端口为30003

通过访问 节点任一IP:30003/targets

可以看到prometheus已经成功连接上了k8s的apiserver(状态全部为UP)

通过端口进行granfa访问

先通过kubectl get svc -n kube-system 查看grafana 3000端口对应分到的nodeport

浏览器访问 节点任一IP:nodeport 如下我分到的是nodeport是32539

默认用户名密码均为admin

#kubectl get svc -n kube-system

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE

grafana NodePort 10.96.240.149 <none> 3000:32539/TCP 4h25m

kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 2d22h

metrics-server ClusterIP 10.96.138.32 <none> 443/TCP 44h

node-exporter NodePort 10.96.144.176 <none> 9100:31672/TCP 4h56m

prometheus NodePort 10.96.235.128 <none> 9090:30003/TCP 4h48m

https://grafana.com/grafana/dashboards/

可获取模板id来创建监控模板,推荐个315先。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Prometheus+grafana监控 k8s集群 的相关文章

随机推荐

  • 上传本地项目代码到GitHub的方法

    预备知识 xff1a 有一个GitHub账号 xff0c 然后知道怎么进GitHub网页 之前往GitHub上传代码都是现场百度找指令操作的 xff0c 从来不记 xff0c 这次干脆做个记录当个笔记吧 Git是一个版本控制软件 xff0c
  • 单片机之蜂鸣器

    蜂鸣器简介 无源蜂鸣器 xff1a 有绿色电路板的一种 有源蜂鸣器 xff1a 没有电路板用黑胶封闭的一种 其实蜂鸣器的种类有很多 例如 xff1a 电磁式蜂鸣器 xff1a 由振荡器 电磁线圈 磁铁 振动膜片及外壳组成 同时电磁式蜂鸣器也
  • Centos Stream 9 安装 Docker 23.0.2 社区版 官方安装教程

    目录 一 内核的版本必须大于3 10使用下面的命令来检查是否满足docker的要求 xff0c 进行依赖性检查 二 安装docker容器引擎 xff0c 需要一个具有sudo权限的账户登录进行操作 1 更新现有yum包 2 遇到提示请输入y
  • AttributeError: module numpy has no attribute int .报错解决方案

    在训练YOLO模型时突然发现这个报错 xff0c 后来发现是numpy版本问题 xff0c yolo官方给的是大于等于1 18 5 xff0c 当你执行pip install r requirements txt命令时 xff0c 他默认安
  • 单片机(嵌入式)程序分层架构

    目录 前言 嵌入式3层软件架构 嵌入式4层软件架构 1 驱动层 操作系统层 中间件层 应用层 嵌入式4层软件架构 2 硬件层 嵌入式微处理芯片 嵌入式存储器系统 嵌入式I O接口 中间层 系统软件层 RTOS 文件系统 GUI 应用层 嵌入
  • FreeRTOS笔记—第一章 FreeRTOS概述

    1 1 认识FreeRTOS 1 1 1 什么是操作系统 操作系统 xff08 Operating System xff0c 简称OS xff09 是管理计算机硬件与软件资源的计算机程序 简单说就是一种管理计算机资源的软件 目的是为了高效
  • 嵌入式工程师 面试题 集-C语言

    预编译 1 什么是预编译 xff0c 何时需要预编译 答 xff1a 预编译又称预处理 就是做些代码文本的替换工作 开头的指令 xff0c 比如拷贝 include 包含的文件代码 xff0c define 宏定义的替换 xff0c 条件编
  • 嵌入式工程师面试题集-MCU_STM32

    一 选择题 1 Cortex M处理器采用的架构是 xff08 D xff09 xff08 A xff09 v4T xff08 B xff09 v5TE xff08 C xff09 v6 xff08 D xff09 v7 2 NVIC可用来
  • 嵌入式工程师面试题集汇总

    主观问题 主观问题 介绍类 请自我介绍 xff1f 为什么不留在xx公司 xff08 为啥离职 xff09 xff1f 你5 10年职业规划是怎样的 xff1f 你还写代码吗 xff1f 从工程师到管理再到工程师你是怎样想的或能承受吗 把你
  • C++解决实际问题 ——a的三次方(accode)

    hello大家好 xff0c 在下 小侠雨落 xff0c 几天不见 xff0c 甚是想念啊 xff01 不说了 xff0c 上标题 a的三次方 咳咳 xff0c 题目描述输入一个整数 a xff0c 输出 a 的三次方 输入格式 一行 xf
  • [CVPR2018]Bottom-Up and Top-Down Attention for Image Captioning and Visual Question Answering

    Bottom Up and Top Down Attention 附 xff1a 论文下载地址 主要贡献 提出了一个新的LSTM组合模型 xff0c 包括了attention LSTM和language LSTM 两个组件 在这个组合模型的
  • python matplotlib绘图总结

    目录 1 画线 a 常规画线 xff1a matplotlib pyplot plot 1 xff09 线的颜色 风格 标记点形状 2 xff09 一图多线 xff0c 并加图例 b 非均匀画线 semilogy c 给特定的点打标签 2
  • mysql now的时间问题

    mysql now 函数调用系统时间不对修正方法 进入mysql命令行 查看时区设置 xff1a show variables like 39 zone 39 select 64 64 time zone 两者保持与系统时间一致 xff0c
  • 【谷粒学院】微信扫码支付(224~238)

    224 项目第十五天内容介绍 225 课程评论实现过程分析 226 课程支付功能需求分析 1 课程支付说明 xff08 1 xff09 课程分为免费课程和付费课程 xff0c 如果是免费课程可以直接观看 xff0c 如果是付费观看的课程 x
  • 故障转移集群搭建高可用文件共享服务器

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 前言 一 故障转移集群是什么 xff1f 二 什么是仲裁盘 xff1f 三 添加故障转移集群功能 四 故障转移集群的建立 五 配
  • HTTP的报文(详解)

    摘要 我们对于http的了解 xff0c 应该在于 xff0c 我们如果想请求一个资源或者访问一个页面 xff0c 客户端 xff08 我们 xff09 应该向服务器发送一个http请求 xff0c 然后得到响应 xff0c 才能出现我们想
  • Kubernetes部署

    文章目录 1 Kubernetes快速部署1 1 Kubernetes安装要求1 2 安装步骤1 3 准备环境1 4 所有节点安装Docker kubeadm kubelet1 4 1 安装Docker1 4 2 添加kubernetes阿
  • 如何从GitHub克隆带有子模块的仓库,比如FreeRTOS

    情形一 xff1a 首次克隆 git clone recurse submodules git 64 github com FreeRTOS FreeRTOS git 该命令会递归克隆该仓库及所有的子模块 工程目录下的 gitmodules
  • grpc生成go文件命令

    标题 xff1a grpc生成go文件命令 类型 xff1a Golang 内容 xff1a 一 生成tag bp go文件命令 1 protoc go out 61 plugins 61 grpc modules course info
  • Prometheus+grafana监控 k8s集群

    在k8s集群中使用node exporter prometheus grafana对集群进行监控 node exporter组件负责收集节点上的metrics监控数据 xff0c 并将数据推送给prometheus prometheus负责