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

news2024/12/24 2:11:47

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用数据说话,还你一个SSD和HDD的真相

【全球存储观察 | 热点关注】在全球数据存储领域,NAND盖楼大赛从来就没有消停过,为什么? 纵观全球NAND主流供应商,三星电子、铠侠、美光科技、SK海力士等,基于自己在闪存技术积累与创新,纷纷热…

nginx--安装

yum安装 官方包链接:nginx: Linux packages 官方yum源链接:nginx: Linux packages 配置yum源 [rootlocalhost ~]# yum install -y nginx [nginx-stable] namenginx stable repo baseurlhttp://nginx.org/packages/centos/$releasever/$basearch/ gp…

【论文阅读】ELAN-Efficient Long-Range Attention Network for Image Super-resolution

ELAN-Efficient Long-Range Attention Network for Image Super-resolution 论文地址简介1 引言2相关工作2.1 基于 CNN 的 SR 方法2.2 基于 Transformer 的 SR 方法 3 方法论3.1 ELAN 的整体流程3.2 Efficient Long-range Attention Block (ELAB) 4实验4.1实验设置4.2 与轻量级…

从注册到订阅,Midjourney使用指南,你想知道的都有

Midjourney简介 Midjourney官网:https://www.midjourney.com/home 是一个独立的研究实验室,专注于探索新的思维方式和扩展人类的想象力。它由一个小型的自筹资金团队组成,该团队专注于设计、人类基础设施和人工智能。Midjourney拥有11名全职…

ipad的文件如何传到手机里 iPad较大文件怎么发送出去 iMazing下载教程

在现代生活中,随着移动设备的普及和多样化,我们经常需要在不同设备之间传输文件,以便在工作、学习或娱乐中更加便捷地使用这些文件。iPad和iPhone是用户广泛使用的设备,我们时常使用它们来存储和访问大量的个人数据。但有时&#…

安装 AngularJS

安装 AngularJS 文章目录 安装 AngularJS1. 使用在线 cdn2. 使用依赖管理工具 npm 1. 使用在线 cdn <!-- 1. 引入在线地址 --> <script src"http://code.angularjs.org/1.2.25/angular.min.js"></script><!-- 2. 下载到本地&#xff0c;引入文…

Apache Seata基于改良版雪花算法的分布式UUID生成器分析2

title: 关于新版雪花算法的答疑 author: selfishlover keywords: [Seata, snowflake, UUID, page split] date: 2021/06/21 本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 关于新版雪花算法的答疑 在上一篇关于新版雪花算法的解析中…

Django框架视图基础

本节主要介绍Django框架视图的基础知识。Django视图层是负责处理请求的核心&#xff0c;是开发Web应用的重要组成部分。Django视图层代码可以放在应用目录下的任何位置&#xff0c;通常写在类似views.py这样的文件中。 在Django框架视图层的概念体系中&#xff0c;视图函数简称…

探索项目管理系统:解析五大功能,洞悉项目成功的关键

项目管理新手往往喜欢埋头苦干&#xff0c;殊不知优秀的项目经理已经熟练运用项目管理系统&#xff0c;让项目规划条理清晰。项目管理系统具备的功能&#xff0c;好用的项目管理系统都有这5大功能。分别是项目WBS分解、项目图表和报表、工时管理、团队协作、任务流程自动化。 一…

react报错:Warning: Each child in a list should have a unique “key“ prop.

我是万万没想到的&#xff0c;使用Popconfirm不添加key属性也会报错&#xff1a; react-refresh:160Warning: Each child in a list should have a unique "key" prop. Check the render method of Cell. Seehttps://reactjs.org/link/warning-keys for more informa…

每日论文推荐:LLaMA3的低比特量化效果详细总结

&#x1f4cc; 元数据概览&#xff1a; 标题&#xff1a;这篇论文的标题是“How Good Are Low-bit Quantized LLAMA3 Models? An Empirical Study”&#xff0c;它可能探讨的是低比特权量化技术在LLAMA3模型上的应用效果和性能。作者&#xff1a;论文的作者包括来自香港大学、…

接字符串注入攻击简介

连接字符串注入攻击简介 什么是连接字符串注入攻击&#xff1f; 连接字符串注入攻击是一种安全攻击类型&#xff0c;攻击者通过修改应用程序使用的数据库连接字符串来注入恶意内容。连接字符串是包含数据库连接所需数据&#xff08;如服务器地址、数据库名、用户名和密码等&a…

升级价值主张 用友帮企业找到乘风破浪的“密码”

近期&#xff0c;用友发布了其战略级产品用友BIP的全新价值主张&#xff0c;将其从原来的“企业数智化 用友BIP”升级为“用友BIP 成就数智企业”。用友这次价值主张升级看似变动不大&#xff0c;实则大有深意。 顺势而为的主动升级 从当前数智化发展的形势来看&#xff0c;各…

c语言从入门到函数速成(1)

温馨提醒&#xff1a;本篇文章适合人群&#xff1a;刚学c又感觉那个地方不怎么懂的同学以及以及学了一些因为自身原因停学一段时间后又继续学c的同学 好&#xff0c;正片开始。 主函数 学c时最先学的是我们c语言程序的主体函数&#xff0c;c的主函数有两种写法&#xff0c;这…

Leetcode | 以二叉树,多叉树为主题的理论,真题以及图解【更新中】

1.理论 1.1.二叉树 1.1.1.二叉树的遍历 前序(preorder traversal)&#xff1a;从根节点开始&#xff0c;先访问当前节点&#xff0c;然后递归地遍历左子树&#xff0c;最后递归地遍历右子树。即“根-左-右”的顺序。 中序遍历(inorder traversal)&#xff1a;从根节点开始&…

mysql面试题九(SQL优化)

目录 1.一条 SQL 是如何执行的 2.索引失效的几种情况 3.EXPLAIN 4.Where 子句如何优化 5.超大分页或深度分页如何处理 6.大表查询如何优化 7.分库分表 基本概念 分库分表方法 水平拆分 垂直拆分 分库分表后的注意事项 1.一条 SQL 是如何执行的 在MySQL中&#xff0…

C++|STL简介-string-vector基础运用

目录 什么是STL STL里面有什么 容器 string 序列式容器 vector deque list 关联式容器 set multiset map multimap 算法 非可变序列算法 可变序列算法 排序算法 数值算法 什么是STL STL(标准模板库)&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一…

不完全微分PD控制器(CODESYS源代码+算法详细介绍)

完全微分计算公式为Kp*Td/Ts(e(k)-e(k-1))。有关位置式PID和增量式PID更多相关内容,大家可以参考下面的文章链接: 1、CODESYS位置式PID CODESYS位置式PID(完整ST源代码)_codesys pid功能块-CSDN博客文章浏览阅读1.1k次,点赞2次,收藏2次。CODESYS增量式PID完整源代码请参看…

红极一时的VB,输给时代,新型开发工具,或成未来

若要称VB为非专业人员改造自身行业的得力工具&#xff0c;这绝不夸张。 对于众多编程语言而言&#xff0c;单纯学习语言本身往往应用有限&#xff0c;比如C和Qt虽有关联却各自独立&#xff0c;但VB却独树一帜&#xff0c;它的实用性远超常规编程语言。 在软件开发的历史长河中…

【go零基础】go-zero从零基础学习到实战教程 - 1项目表设计

既然是0基础&#xff0c;现在来写下设计思路&#xff0c;因为go-zero是个微服务架构&#xff0c;所以&#xff0c;哪怕是0基础&#xff0c;也从两个服务模块开始写起。 我们的目标是&#xff1a;最小可用微服务架构最佳实践&#xff01; 好了&#xff0c;饼画完了。 第0部分写到…