K8s: Prometheus 服务结构以及基础抓取数据服务部署

Prometheus

  • 发布应用之后,就有持续运维的事情,就是平台监控
  • Prometheus 是一个云原生的日志监控平台,是一个实时标准的一个技术
  • 它是著名的 cncf 里的一个重要的开源项目
  • 上面整个图片是在云原生应用及K8s应用架构下的一个日志监控的一个标准的解决方案
  • 中间火炬图标就是 Prometheus, 从左向右来看
  • Short-lived jobs, 这里有一个job概念,它能执行这种一次性或者是多次的
  • 定时的导入一些触发一些 metrics 收集的任务, 注意,这是k8s里面的job
  • 可以认为是个定时任务, 然后它通过一个Pushgetaway发送一些pull的请求
  • 这个请求去拉什么数据呢?在下面Prometheus 配置文件里,会有一些Jobs, 这里是Prometheus的Jobs
  • 还有这个exporter,也就是我们的日志导出器,也是非常关键的一个组件
  • 它能够在K8s的worker node上去导出一些CPU的这个数据,这个叫Prometheus的一些目标
  • 然后通过这个拉取的方式,这些数据会被拉取到 Prometheus server
  • 这些数据不仅是在 work node 上的数据,也可以是 K8s 应用中的数据
  • 拉取数据库后存储在 TSDB (时序数据库中) 中,所以时序数据库和关系性数据库的区别是什么呢?
    • 关系性数据库,像mysql这样的数据库
    • 它比较适合存这个数据这种有关联关系的这种复杂查询的这种依赖关系的这种数据
    • 像一些监控的数据,它往往是按照一定的时序发生的,所以它叫时序数据库
  • 正因为它是时序时序数据库,所以它的每个K8s集群里面的时序的时间保持一致,需要安装NTP这个server服务器
  • 这个时序数据库存在咱们的这个node上,当然Prometheus本身也是运行在K8s平台上的
  • 收集数据后,它就已经有了K8s集群的一些字段和数据了,或者是应用的一些数据都可以存在这里
  • 有了数据之后,可以做展示,展示的方式呢,它是通过 PromQL 查询语言去从这个数据库里面查询数据
  • 之后展示在 Prometheus 自身的 web UI 里面,同时也可以把这些数据展示到
  • Grafana 这个更专业的做数据可视化的这么一个平台,当然也可以通过接口把数据转到你们自己的web平台里面去
  • 还有push alerts 告警,比如说出现了一些事件之后,通过 Alertmanager 发邮件
  • 这就是一个非常经典的云原生的一个日志监控的一个解决方案
  • 目前业界所有的互联网大公司都会基于这么一套流程去实现日志的收集
  • 我们会从K8s这个node上收取日志,然后展示在Grafana里面
  • 会在K8s上的应用程序,加上一些日志收集的插件,把数据吐到这个Prometheus服务器
  • 这样,在这个监控平台上可以看到这个应用的日志,主要关注:系统集群日志和应用日志
  • Prometheus 比传统监控方案的什么好处
    • 具有由 metric 名称和键/值对标识的时间序列数据的多维数据模型
    • 有一个灵活的查询语言,不用写很复杂的代码即可查询,输入key value
    • 不依赖分布式存储,只和本地磁盘有关
    • 通过 HTTP 的服务拉取时间序列数据
    • 也支持推送的方式来添加时间序列数据
    • 还支持通过服务发现或静态配置发现目标
    • 多种图形和仪表板支持
  • 对比ELK写elastic的语法会比较复杂,但是Prometheus相对来讲更简单

安装时间同步工具

  • 集群都是有很多数据,要实现监控,需要知道监控的指标: 比如,磁盘CPU内存,还有网络的一些异常情况

  • 在这种情况下就需要部署一些能够采集到监控指标的一些服务,我们使用 Node Exporter 来进行集群的任务

  • 我们要实现集群的系统时间同步,这个是非常重要,在每个node节点不管是master还是work node上都要执行

  • 安装

    • 在Centos 8 以下版本执行
      • $ yum -y install ntp
      • $ systemctl enable ntpd
      • $ ntpdate time1.aliyun.com
    • 在 Centos 9 安装
      • $ sudo dnf install chrony
      • $ sudo systemctl start chronyd
      • $ sudo systemctl enable chronyd
      • $ sudo vi /etc/chrony.conf
        server ntp1.aliyun.com iburst
        
      • $ sudo systemctl restart chronyd
      • 之后检查时间和时区
        • $ timedatectl 查看是否是 Time zone: Asia/Shanghai (CST, +0800),如果不是,执行下面
        • $ timedatectl set-timezone Asia/Shanghai
  • 注意,我们用的是时序数据库,时间一定要同步,不同步时间,数据会有问题

部署基础服务抓取数据


1 )概述

  • node-exporter用于提供*NIX内核的硬件以及系统指标
  • 采集服务器层面的运行指标,包括机器的 loadavg、filesystem、meminfo等

2 )说明

  • 此次部署大概分为几个部分
    • namespace 命名空间
      • 所有服务都会安装在这个命名空间之内
      • 保证集群在运行时不会占用其他命名空间的资源
    • node-exporter
      • daemonset 它是一个后台服务 :9100/metrics 部署在9100端口 能够采集到很多数据
      • service 创建了一个 service
    • kube-state-metrics
      • serviceAccount 这里有 clusterrole, serviceaccount, clusterrolebinding
        • clusterrole 通过定义一个集群的角色告诉大家能访问K8s中的什么资源
        • serviceaccount 就是账户名称
        • clusterrolebinding 就是把角色和账户绑定在一起,也就是这个账户具备这个角色的所有权限
      • deploy 这是专门收集日志的组件
      • service 部署服务,暴露端口
      • 备注
        • K8s本质是跑在node节点上的一堆容器组成的服务,本身也要被监控
    • node disk monitor
      • 监视Node的磁盘占用情况
      • 镜像:
        • giantswarm/tiny-tools:latest 工具类,从 work node 抓取变量
        • dockermuenster/caddy:0.9.3
      • 类型是daemonset,每个node上都会部署一份

3 )一键部署

apiVersion: v1
kind: Namespace
metadata:
  name: monitoring
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: prometheus-node-exporter
  namespace: monitoring
  labels:
    app: prometheus
    component: node-exporter
spec:
  selector:
    matchLabels:
      app: prometheus
      component: node-exporter
  template:
    metadata:
      name: prometheus-node-exporter
      labels:
        app: prometheus
        component: node-exporter
    spec:
      containers:
      - image: prom/node-exporter:v0.14.0
        name: prometheus-node-exporter
        ports:
        - name: prom-node-exp
          #^ must be an IANA_SVC_NAME (at most 15 characters, ..)
          containerPort: 9100
          hostPort: 9100
      hostNetwork: true
      hostPID: true
---
apiVersion: v1
kind: Service
metadata:
  annotations:
    prometheus.io/scrape: 'true'
  name: prometheus-node-exporter
  namespace: monitoring
  labels:
    app: prometheus
    component: node-exporter
spec:
  clusterIP: None
  ports:
    - name: prometheus-node-exporter
      port: 9100
      protocol: TCP
  selector:
    app: prometheus
    component: node-exporter
  type: ClusterIP
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: kube-state-metrics
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: kube-state-metrics
subjects:
- kind: ServiceAccount
  name: kube-state-metrics
  namespace: monitoring
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: kube-state-metrics
rules:
- apiGroups: [""]
  resources:
  - nodes
  - pods
  - services
  - resourcequotas
  - replicationcontrollers
  - limitranges
  verbs: ["list", "watch"]
- apiGroups: ["apps"]
  resources:
  - daemonsets
  - deployments
  - replicasets
  verbs: ["list", "watch"]
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: kube-state-metrics
  namespace: monitoring
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kube-state-metrics
  namespace: monitoring
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kube-state-metrics
  template:
    metadata:
      labels:
        app: kube-state-metrics
    spec:
      serviceAccountName: kube-state-metrics
      containers:
      - name: kube-state-metrics
#       image: gcr.io/google_containers/kube-state-metrics:v0.5.0
        image: registry.cn-beijing.aliyuncs.com/qua-io-coreos/kube-state-metrics:v1.3.0
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  annotations:
    prometheus.io/scrape: 'true'
  name: kube-state-metrics
  namespace: monitoring
  labels:
    app: kube-state-metrics
spec:
  ports:
  - name: kube-state-metrics
    port: 8080
    protocol: TCP
  selector:
    app: kube-state-metrics
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: node-directory-size-metrics
  namespace: monitoring
  annotations:
    description: |
      This `DaemonSet` provides metrics in Prometheus format about disk usage on the nodes.
      The container `read-du` reads in sizes of all directories below /mnt and writes that to `/tmp/metrics`. It only reports directories larger then `100M` for now.
      The other container `caddy` just hands out the contents of that file on request via `http` on `/metrics` at port `9102` which are the defaults for Prometheus.
      These are scheduled on every node in the Kubernetes cluster.
      To choose directories from the node to check, just mount them on the `read-du` container below `/mnt`.
spec:
  selector:
    matchLabels:
      app: node-directory-size-metrics
  template:
    metadata:
      labels:
        app: node-directory-size-metrics
      annotations:
        prometheus.io/scrape: 'true'
        prometheus.io/port: '9102'
        description: |
          This `Pod` provides metrics in Prometheus format about disk usage on the node.
          The container `read-du` reads in sizes of all directories below /mnt and writes that to `/tmp/metrics`. It only reports directories larger then `100M` for now.
          The other container `caddy` just hands out the contents of that file on request on `/metrics` at port `9102` which are the defaults for Prometheus.
          This `Pod` is scheduled on every node in the Kubernetes cluster.
          To choose directories from the node to check just mount them on `read-du` below `/mnt`.
    spec:
      containers:
      - name: read-du
        image: giantswarm/tiny-tools:latest
        imagePullPolicy: IfNotPresent
        command:
        - fish
        - --command
        - |
          touch /tmp/metrics-temp
          while true
            for directory in (du --bytes --separate-dirs --threshold=100M /mnt)
              echo $directory | read size path
              echo "node_directory_size_bytes{path=\"$path\"} $size" \
                >> /tmp/metrics-temp
            end
            mv /tmp/metrics-temp /tmp/metrics
            sleep 300
          end
        volumeMounts:
        - name: host-fs-var
          mountPath: /mnt/var
          readOnly: true
        - name: metrics
          mountPath: /tmp
      - name: caddy
        image: dockermuenster/caddy:0.9.3
        command:
        - "caddy"
        - "-port=9102"
        - "-root=/var/www"
        ports:
        - containerPort: 9102
        volumeMounts:
        - name: metrics
          mountPath: /var/www
      volumes:
      - name: host-fs-var
        hostPath:
          path: /var
      - name: metrics
        emptyDir:
          medium: Memory

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

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

相关文章

ezplot--Matlab学习

目录 一、代码 二、效果 ​编辑 三、ezplot讲解 四、如何自定义一个函数 一、代码 clc; clear; t0:32; x4(t) cos(2*pi*t/4).*sin(2*pi*t/4); x8(t) cos(2*pi*t/8).*sin(2*pi*t/8); x16(t) cos(2*pi*t/16).*sin(2*pi*t/16); subplot(3,1,1) ezplot(x4,[0,32]); subplot…

《软件设计师教程:数据库系统基础知识大总结》

​ 个人主页:李仙桎 🔥 个人专栏: 《软件设计师》 ⛺️生活的理想,就是为了理想的生活! ​ ⛺️前言:各位铁汁们好啊!!!今天继续正式学习中级软件设计师考试相关的内容,后续不断更新…

python学习笔记B-11:序列结构之列表--二维列表的遍历和生成式

二维列表的遍历方式,使用双层for循环,遍历索引号。 二维列表的生成式,也是使用类似双层循环的形式生成。 print("##初始化二维列表,每个元素就是1个列表") lst [["东方延续","太空军自然选择号舰长&qu…

【AI心理咨询应用】继Woebot之后,国内诞生的“LLM+CBT”应用:白小喵

导言 AI认知行为疗法(Cognitive Behavioral Therapy,CBT)早在2017年便有了首例,即美国知名CBT治疗机器人Woebot。 然而,Woebot在CBT的完整落地上仍有缺陷问题,LLM的出现促进了对该问题的解决,…

typeScript 安装

1、安装typescript 安装npm i -g typescript 查看是否安装成功 tsc -v 2、使用ts // 浏览器不支持ts 需要编译成 es5 let str: string ts 在终端输入 tsc index.ts 会将其生成一个对应的index.js文件 在电脑上首次使用TS的时候,执行TS 的命令的时候报错 打开PowerS…

RustGUI学习(iced)之小部件(三):如何使用下拉列表pick_list?

前言 本专栏是学习Rust的GUI库iced的合集,将介绍iced涉及的各个小部件分别介绍,最后会汇总为一个总的程序。 iced是RustGUI中比较强大的一个,目前处于发展中(即版本可能会改变),本专栏基于版本0.12.1. 概述…

2024年,新手做抖音小店想要赚钱,必须明白三件事!

大家好,我是电商糖果 有不少小店的商家都说过,现在的抖音小店比三四年前复杂了。 三四年前抖音小店刚刚出现,平台规则还没有那么多,很多机制也不太成熟。 那个时期的抖店说是捡钱的,一点儿都不假。 但是如果说你现…

Linux详解:进程等待

文章目录 进程等待等待的必要性进程等待的方法waitwaitpid获取子进程status阻塞等待 与 非阻塞等待 进程等待 等待的必要性 子进程退出,父进程不进行回收的话,就可能造成僵尸进程,进而造成内存泄露 如果进程进入了僵尸状态,kill…

机器学习:驱动现代交通运输革命的AI智慧引擎

🧑 作者简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…

玄子Share-引导过程与服务控制

玄子Share-引导过程与服务控制 Linux操作系统引导过程 系统初始化进程 init 进程 由 Linux 内核加载运行 /sbin/init 程序init 进程是系统中第一个进程init 进程的 PID(进程标记)号永远为 1 Systemd Systemd是Linux操作系统的一种init软件CentOS7中采用…

【Linux开发 第十二篇】搭建JavaEE环境

搭建开发环境 搭建javaEE环境 搭建javaEE环境 在Linux下开发JavaEE需要安装软件包: 安装jdk 安装步骤: 在opt目录下创建jdk目录通过xftp上床到jdk目录中进入到jdk目录中,解压jdk压缩包在/usr/local下创建java目录将解压完成的jdk文件移动…

SpringBoot框架学习笔记(一):依赖管理和自动配置

本文为个人笔记,仅供学习参考之用,如有不当之处请指出。 本文基于springboot2.5.3版本,开发环境需要是 jdk 8 或以上,maven 在 3.5 1 SpringBoot 基本介绍 1.1 官方文档 (1) 官网 : https://spring.io/pr…

张朝阳对话华为Fellow陈海波:万物智联时代,鸿蒙如何实现“换道超车”?

随着智能终端设备的普及和万物智联时代的加速到来,鸿蒙生态的高速发展正引发全行业的关注。 搜狐创始人、董事局主席兼CEO、物理学博士张朝阳与华为Fellow、基础软件首席科学家陈海波带来了一场关于鸿蒙生态的公开课。鸿蒙技术架构有哪些领先性?HarmonyOS发布5年来…

compose调用系统分享功能分享图片文件

compose调用系统分享功能图片文件 简介UI界面提供给外部程序的文件访问权限创建FileProvider设置共享文件夹 通用分享工具虚拟机验证结果参考 本系列用于新人安卓基础入门学习笔记,有任何不同的见解欢迎留言 运行环境 jdk17 andriod 34 compose material3 简介 本案…

Hadoop3:集群搭建及常用命令与shell脚本整理(入门篇,从零开始搭建)

一、集群环境说明 1、用VMware安装3台Centos7.9虚拟机 2、虚拟机配置:2C,2G内存,50G存储 3、集群架构 从表格中,可以看出,Hadoop集群,主要有2部分,一个是HDFS服务,一个是YARN服务 …

[系统安全] 六十.威胁狩猎 (1)APT攻击检测及防御与常见APT组织的攻击案例分析

您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列。因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全、逆向分析和恶意代码检测,“系统安全”系列文章会更加聚焦,更加系…

四、管道与重定向

四、管道与重定向 1 重定向 0,标准输入(键盘) 1,标准输出 2,标准错误, 3,进程在执行过程中打开的其他文件。 &:表示正确错误混合输出1.1 输出重定向 (覆盖,追加) > ----覆盖 >> ----追加 正确输出: 1> 1>> 等价…

Git 仓库内容操作

Git 仓库内容操作 | CoderMast编程桅杆Git 仓库内容操作 添加文件到暂存区 使用如下指令将工作区的文件添加到暂存区,告诉 Git 在下次 commit 时哪些文件做出了修改。 commit 指令详看后续 添加一个或多个文件到暂存区: 添加指定目录到暂存区 添加当前目…

ffmpeg与sdl的个人笔记

说明 这里的ffmpeg基础知识和sdl基础知识仅提及与示例代码相关的知识点, 进阶可学习雷神的博客。 https://blog.csdn.net/leixiaohua1020 当然,如代码写的有问题或有更好的见解,欢迎指正! 音视频基础知识 在学习音视频理论知识时&#xff…

CSS中设置透明度的2个属性:opacity,RGBA以及它们的区别

你好,我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃-大专生,一枚程序媛,感谢关注。回复 “前端基础题”,可免费获得前端基础 100 题汇总,回复 “前端工具”,可获取 Web 开发工具合…