在k8s中部署Prometheus并实现对k8s集群的监控

🐇明明跟你说过:个人主页

🏅个人专栏:《Prometheus:监控的神》 🏅

🔖行路有良友,便是天堂🔖

目录

一、引言

1、k8s简介

2、 Prometheus概述

二、准备k8s环境

1、k8s集群搭建

2、集群状态检查

三、部署Prometheus 

1、创建名称空间

2、安装node-exporter

3、安装Prometheus server

4、创建Service

四、访问测试


一、引言

1、k8s简介

Kubernetes单词起源于希腊语, 是“舵手”或者“领航员、飞行员”的意思。

Kubernetes(简称K8s)的前世今生可以追溯到谷歌(Google)内部的一个项目,它起源于2003年,当时谷歌正面临着不断增长的应用程序和服务的管理挑战。这个项目最初被称为"Borg",是一个早期的容器编排系统。Borg 的成功经验成为 Kubernetes 开发的契机。

 有关k8s起源的介绍,请参考《初识K8s之前世今生、架构、组件、前景》这篇文章

​​

Kubernetes的优点包括可移植性、可伸缩性和扩展性。它使用轻型的YAML清单文件实现声明性部署方法,对于应用程序更新,无需重新构建基础结构。管理员可以计划和部署容器,根据需要扩展容器并管理其生命周期。借助Kubernetes的开放源代码API,用户可以通过首选编程语言、操作系统、库和消息传递总线来构建应用程序,还可以将现有持续集成和持续交付(CI/CD)工具集成。

2、 Prometheus概述

Prometheus 是一款开源的监控和警报工具,最初由 SoundCloud 开发,现已成为 Cloud Native Computing Foundation(CNCF)的一部分。它旨在帮助用户监控其应用程序和系统的性能,并能够发现故障、进行警报和分析。

以下是 Prometheus 的一些关键特点和概述:

  1. 多维数据模型: Prometheus 使用多维数据模型来存储时间序列数据,这意味着每个样本可以与任意数量的键/值标签相关联。这种灵活性使得用户可以以灵活的方式对数据进行查询和分析。
  2. 灵活的查询语言: Prometheus 提供了 PromQL(Prometheus Query Language),这是一种强大而灵活的查询语言,可以用于从 Prometheus 中提取和处理数据。
  3. 数据采集: Prometheus 通过称为 Exporters 的插件来采集数据。Exporters 可以将各种系统和服务的指标暴露给 Prometheus,例如应用程序、操作系统、数据库等。
  4. 警报管理: Prometheus 具有内置的警报管理功能,可以通过配置警报规则来触发警报。这些警报可以发送到各种通知渠道,如电子邮件、Slack 等。
  5. 可扩展性: Prometheus 是一个高度可扩展的系统,可以通过水平扩展来处理大量的时间序列数据。它支持多种存储后端,包括本地磁盘存储和远程存储系统。
  6. 社区支持: 作为 CNCF 项目的一部分,Prometheus 拥有一个庞大而活跃的社区,不断提供新的功能、改进和支持。

总的来说,Prometheus 是一个功能强大且灵活的监控系统,适用于各种规模的环境,并且可以与其他工具集成,以构建强大的监控解决方案。

有关Prometheus的详细介绍,请参考《揭秘Prometheus:诞生之旅与核心组件全解析》这篇文章

二、准备k8s环境

1、k8s集群搭建

如果还未搭建k8s集群,请参考《深度解析:Kubernetes 1.28.2集群安装过程中的关键步骤》这篇文章

2、集群状态检查

[root@master ~]# kubectl get node

三、部署Prometheus 

1、创建名称空间

创建一个名为Prometheus的名称空间,Prometheus所有的组件都在这个名称空间下运行

[root@master ~]# kubectl create ns prometheus
namespace/prometheus created

2、安装node-exporter

node-exporter资源官网地址:Download | Prometheus

离线镜像资源我已经放到资源列表中了,大家自行下载即可

下载后,在各个节点上导入

准备YAML文件

[root@master ~]# cat node-export.yaml 
# 输入如下内容
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: node-exporter
  namespace: prometheus
  labels:
    name: node-exporter
spec:
  selector:
    matchLabels:
     name: node-exporter
  template:
    metadata:
      labels:
        name: node-exporter
    spec:
      hostPID: true
      hostIPC: true
      hostNetwork: true
      containers:
      - name: node-exporter
        image: docker.io/prom/node-exporter:v1.8.0
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 9100
        securityContext:
          privileged: true
        args:
        - --path.procfs
        - /host/proc
        - --path.sysfs
        - /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
      tolerations:
      - key: "node-role.kubernetes.io/master"
        operator: "Exists"
        effect: "NoSchedule"
      volumes:
        - name: proc
          hostPath:
            path: /proc
        - name: dev
          hostPath:
            path: /dev
        - name: sys
          hostPath:
            path: /sys
        - name: rootfs
          hostPath:
            path: /
  • apiVersion 指定了 Kubernetes API 的版本为 apps/v1。
  • kind 指定了资源的类型为 DaemonSet,即守护进程集。
  • metadata 下的 name 字段指定了 DaemonSet 的名称为 node-exporter,namespace 字段指定了 DaemonSet 所属的命名空间为 prometheus。
  • spec 下定义了 DaemonSet 的规范。
  • selector 指定了选择器,用于选择要控制的 Pod。
  • template 定义了要创建的 Pod 的模板,其中包含了 Pod 的元数据和规范。
  • hostPID: true、hostIPC: true、hostNetwork: true:指定了容器可以使用主机的 PID、IPC 和网络命名空间。
  • containers 下定义了要运行的容器,这里定义了一个名为 node-exporter 的容器。
  • image 指定了容器的镜像为 docker.io/prom/node-exporter:v1.8.0。
  • ports 定义了容器暴露的端口,这里将容器的端口 9100 映射到了宿主机上。
  • securityContext 下的 privileged: true 表示容器具有特权访问。
  • args 下指定了容器启动时的参数,这里配置了 Node Exporter 的参数。
  • volumeMounts 下定义了容器挂载的卷。
  • tolerations 下定义了容忍策略,表示容器可以容忍某些节点上的特定条件。
  • volumes 下定义了宿主机的卷,用于挂载到容器中。

查看Pod状态

访问测试,使用curl命令,如果有返回值,则部署成功

3、安装Prometheus server

离线镜像资源我已经放到资源列表中了,大家自行下载即可

下载后,在各个节点上导入

然后,在node1节点上,为Prometheus server创建一个数据目录

[root@node1 ~]# mkdir /data
[root@node1 ~]# chmod 777 /data/

为prometheus server创建一个sa,并分配权限

[root@master ~]# kubectl create serviceaccount prometheus -n prometheus
serviceaccount/prometheus created
[root@master ~]# kubectl create clusterrolebinding prometheus-clusterrolebinding -n prometheus --clusterrole=cluster-admin  --serviceaccount=prometheus:prometheus
clusterrolebinding.rbac.authorization.k8s.io/prometheus-clusterrolebinding created

 

编写Prometheus的config配置文件

[root@master ~]# vim prometheus-config.yaml 
#输入以下内容
---
kind: ConfigMap
apiVersion: v1
metadata:
  labels:
    app: prometheus
  name: prometheus-config
  namespace: prometheus
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
  •  global 部分定义了全局的抓取配置,包括抓取间隔 scrape_interval、超时时间 scrape_timeout 和评估间隔 evaluation_interval。
  • scrape_configs 部分定义了要抓取的目标列表,每个 job_name 对应一个抓取目标配置。在这个示例中,有以下几个抓取目标:
  • kubernetes-node:抓取 Kubernetes 节点的指标,通过 Kubernetes 的服务发现配置 kubernetes_sd_configs,并通过 relabel_configs 将抓取地址从 :10250 替换为 :9100。
  • kubernetes-node-cadvisor:抓取 Kubernetes 节点的 cAdvisor 指标,通过 Kubernetes 的服务发现配置和 TLS 配置,以及 relabel_configs 对地址和路径进行替换和重写。
  • kubernetes-apiserver:抓取 Kubernetes API Server 的指标,通过 Kubernetes 的服务发现配置和 TLS 配置,以及 relabel_configs 保留相关标签。
  • kubernetes-service-endpoints:抓取 Kubernetes 服务的指标,通过 Kubernetes 的服务发现配置和 relabel_configs 对地址、路径和标签进行替换和重写。
  • 每个抓取目标配置中都包含了 kubernetes_sd_configs,用于从 Kubernetes 中发现相应的目标,以及 relabel_configs,用于对抓取地址、标签等进行转换和处理。

创建configMap

[root@master ~]# kubectl  apply -f prometheus-config.yaml

 编写部署Prometheus server的YAML文件

[root@master ~]# vim prometheus-deploy.yaml 
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: prometheus-server
  namespace: prometheus
  labels:
    app: prometheus
spec:
  replicas: 1
  selector:
    matchLabels:
      app: prometheus
      component: server
    #matchExpressions:
    #- {key: app, operator: In, values: [prometheus]}
    #- {key: component, operator: In, values: [server]}
  template:
    metadata:
      labels:
        app: prometheus
        component: server
      annotations:
        prometheus.io/scrape: 'false'
    spec:
      nodeName: node1
      serviceAccountName: prometheus
      containers:
      - name: prometheus
        image: prom/prometheus:v2.51.1
        imagePullPolicy: IfNotPresent
        command:
          - prometheus
          - --config.file=/etc/prometheus/prometheus.yml
          - --storage.tsdb.path=/prometheus
          - --storage.tsdb.retention=720h
          - --web.enable-lifecycle
        ports:
        - containerPort: 9090
          protocol: TCP
        volumeMounts:
        - mountPath: /etc/prometheus
          name: prometheus-config
        - mountPath: /prometheus/
          name: prometheus-storage-volume
      volumes:
        - name: prometheus-config
          configMap:
            name: prometheus-config
        - name: prometheus-storage-volume
          hostPath:
           path: /data
           type: Directory

部署prometheus server

[root@master ~]# kubectl apply -f  prometheus-deploy.yaml

查看pod状态

4、创建Service

为Prometheus server创建一个service,用于我们外部访问

[root@master ~]# vim prometheus-svc.yaml 
#输入如下内容
apiVersion: v1
kind: Service
metadata:
  name: prometheus
  namespace: prometheus
  labels:
    app: prometheus
spec:
  type: NodePort
  ports:
    - port: 9090
      targetPort: 9090
      protocol: TCP
  selector:
    app: prometheus
    component: server

 创建service

[root@master ~]# kubectl apply -f  prometheus-svc.yaml

查看service的nodeport端口

四、访问测试

在浏览器输入node ip + service端口 

点击Status并点击Targets,如果能显示下面的内容,说明监控数据采集成功 

目前采集的目录并不适合直接阅读,还需要配合Grafana进行数据的展示,关于Grafana,我们将在后期的章节中介绍

💕💕💕每一次的分享都是一次成长的旅程,感谢您的陪伴和关注。希望这些关于Prometheus的文章能陪伴您走过技术的一段旅程,共同见证成长和进步!😺😺😺

🧨🧨🧨让我们一起在技术的海洋中探索前行,共同书写美好的未来!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/610237.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言:__attribute__((packed))

一、简介 在使用结构体的时候,经常要根据结构体的长度来进行相关判断。但是按照C语言的规则,会对不同类型的数据类型进行自动对齐。有时候就会造成一些问题,如果不需要使用自动对齐的功能,就需要使用到本章的关键字。 二、自动对…

fabric搭建生产网络

fabric搭建生产网络 一、生成组织结构与身份证书 解包 hyperledger-fabric-linux-amd64-2.5.0.tar.gz 1.1、crypto-config.yaml配置文件 ./bin/cryptogen showtemplate > crypto-config.yaml 将crypto-config.yaml内容修改为: # -------------------------…

Django 管理员登录安全 OTP双因素认证

目前安全双因素 最基本的,django管理员 默认直接登录的。 本项目环境:Django 2.0.13django-otp 0.9.3 1 安装pip3 install django-otp0.9.3 2 配置文件 vim api_statistics/settings.py INSTALLED_APPS里增加django_otp,django_otp.plugins.otp_totp,MIDDLEWARE…

推荐几款国内的AI写作工具,好用免费还能在线生成AI文案

AI写作简介: 在专业领域中,人工智能技术的进步正以前所未有的速度推动着写作行业的革新。当前,我们见证了生成式人工智能(AI)在文本产生领域的广泛应用,其对提升创作效率和拓展创意边界的贡献是显著的。以…

用 Next.js 和 Supabase 进行“全栈”开发的入门

文章目录 (零)前言(一)创建Next.js应用程序(1.1)新建工程目录(1.2)安装依赖环境(1.3)创建Tailwind配置 (二)创建Supabase项目&#xf…

Leetcode—232. 用栈实现队列【简单】

2024每日刷题(131) Leetcode—232. 用栈实现队列 实现代码 class MyQueue { public:MyQueue() {}void push(int x) {st.push(x);}int pop() {if(show.empty()) {if(empty()) {return -1;} else {int ans show.top();show.pop();return ans;}} else {i…

管道液位传感器怎么接线

管道光电液位传感器是用来检测水管缺水的一种液位传感器,有水无水输出不同电压信号,在洗地机领域有着广泛的应用,那么管道液位传感器怎么接线? 管道液位传感器通常有三根线,电源线、地线和信号线,电源线接…

window golang 升级版本

执行go tidy,发现执行不了,得升级一下版本了 进入官网,并选择合适的系统以及版本。https://go.dev/dl/ 这台电脑是windows,我本人比较喜欢下载zip自己解压。 解压,这里我选择直接覆盖原文件,需要保留原版…

2024智能电网与能源系统国际学术会议(ICSGES2024)

2024智能电网与能源系统国际学术会议(ICSGES2024) 会议简介 我们诚挚邀请您参加将在南京隆重举行的2024年智能电网与能源系统国际学术会议(ICSGES2024)。南京,一座历史与现代交织的城市,将为这场盛会提供独特的学术…

AVL树的原理及其实现

文章目录 前言了解AVL树AVL树的特点AVL树的节点调整方案右单旋为什么要右单旋呢?右单旋代码 左单旋为什么要左单旋?左单旋代码 左右双旋左右双旋之后平衡因子的情况左右双旋代码实现 右左双旋右左双旋代码: 简单测试 前言 回顾我们对于二叉搜…

HarmonyOS开发案例:【生活健康app之实现打卡功能】(2)

实现打卡功能 首页会展示当前用户已经开启的任务列表,每条任务会显示对应的任务名称以及任务目标、当前任务完成情况。用户只可对当天任务进行打卡操作,用户可以根据需要对任务列表中相应的任务进行点击打卡。如果任务列表中的每个任务都在当天完成则为…

基于 AI 的 Python 爬虫

✦ 支持 OPENAI、Gemini、Groq、本地 Ollama、Azure 等 LLM ✦ 只需传递 Prompt 和链接 注意: 调用 Ollama 模型,需要运行下方指令,拉取 embedding 模型: ollama pull nomic-embed-text 问题: 似乎不能换成兼容 Ope…

进程间通信 管道

前言 ubuntu系统的默认用户名不为root的解决方案(但是不建议):轻量应用服务器 常见问题-文档中心-腾讯云 (tencent.com) 进程间通信的基本概念 进程间通信目的:进程间也是需要协同的,比如数据传输、资源共享、通知事件…

人脸图像生成(DCGAN)

一、理论基础 1.什么是深度卷积对抗网络(Deep Convolutional Generative Adversarial Network,) 深度卷积对抗网络(Deep Convolutional Generative Adversarial Network,DCGAN)是一种生成对抗网络&#xf…

计算机通信SCI期刊推荐,JCR1区,IF=6+,审稿快,无版面费!

一、期刊名称 Computer Communications 二、期刊简介概况 期刊类型:SCI 学科领域:计算机科学 影响因子:6 中科院分区:3区 出版方式:订阅模式/开放出版 版面费:选择开放出版需支付$2300 三、期刊征稿…

STM32中的ICACHE是什么有什么用?如何使用?

什么是ICACHE? icache是一种用于缓存指令的存储器,其目的是提高CPU执行指令的效率。 在计算机系统中,icache(指令缓存)是处理器核心内部的一个关键组件,它专门用来存储最近使用过的指令。当CPU需要执行一个…

Bean的作用域

Bean的作用域 Bean的作用域是指在Spring整个框架中的某种行为模式,比如singleton单例作用域,就表示Bean在整个spring中只有一份,它是全局共享的,那么当其他人修改了这个值时,那么另一个人读取到的就是被修改的值 Bea…

每日OJ题_记忆化搜索②_力扣62. 不同路径(三种解法)

目录 力扣62. 不同路径 解析代码1_暴搜递归(超时) 解析代码2_记忆化搜索 解析代码3_动态规划 力扣62. 不同路径 62. 不同路径 难度 中等 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器…

element-ui skeleton 组件源码分享

今日简单分享 skeleton 骨架屏组件源码,主要从以下四个方面来讲解: 1、skeleton 组件的页面结构 2、skeleton 组件的属性 3、skeleton item 组件的属性 4、skeleton 组件的 slot 一、skeleton 组件的页面结构 二、skeleton 组件的属性 2.1 animate…

BS架构 数据权限--字段级权限 设计与实现

一、需求场景 1. 销售发货场景 销售出库单上 有 商品名称、发货数量、单价、总金额 等信息。 销售人员 关注 上述所有信息,但 仓管人员 不需要知道 单价、总金额 信息。 2. 配方、工艺保密 场景 配方研发人员 掌握核心配方, 但 交给车间打样、生产时…