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-exporternamespace: monitoringlabels:app: prometheuscomponent: node-exporter
spec:selector:matchLabels:app: prometheuscomponent: node-exportertemplate:metadata:name: prometheus-node-exporterlabels:app: prometheuscomponent: node-exporterspec:containers:- image: prom/node-exporter:v0.14.0name: prometheus-node-exporterports:- name: prom-node-exp#^ must be an IANA_SVC_NAME (at most 15 characters, ..)containerPort: 9100hostPort: 9100hostNetwork: truehostPID: true
---
apiVersion: v1
kind: Service
metadata:annotations:prometheus.io/scrape: 'true'name: prometheus-node-exporternamespace: monitoringlabels:app: prometheuscomponent: node-exporter
spec:clusterIP: Noneports:- name: prometheus-node-exporterport: 9100protocol: TCPselector:app: prometheuscomponent: node-exportertype: ClusterIP
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: kube-state-metrics
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: kube-state-metrics
subjects:
- kind: ServiceAccountname: kube-state-metricsnamespace: monitoring
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:name: kube-state-metrics
rules:
- apiGroups: [""]resources:- nodes- pods- services- resourcequotas- replicationcontrollers- limitrangesverbs: ["list", "watch"]
- apiGroups: ["apps"]resources:- daemonsets- deployments- replicasetsverbs: ["list", "watch"]
---
apiVersion: v1
kind: ServiceAccount
metadata:name: kube-state-metricsnamespace: monitoring
---
apiVersion: apps/v1
kind: Deployment
metadata:name: kube-state-metricsnamespace: monitoring
spec:replicas: 1selector:matchLabels:app: kube-state-metricstemplate:metadata:labels:app: kube-state-metricsspec:serviceAccountName: kube-state-metricscontainers:- name: kube-state-metrics
#       image: gcr.io/google_containers/kube-state-metrics:v0.5.0image: registry.cn-beijing.aliyuncs.com/qua-io-coreos/kube-state-metrics:v1.3.0ports:- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:annotations:prometheus.io/scrape: 'true'name: kube-state-metricsnamespace: monitoringlabels:app: kube-state-metrics
spec:ports:- name: kube-state-metricsport: 8080protocol: TCPselector:app: kube-state-metrics
---
apiVersion: apps/v1
kind: DaemonSet
metadata:name: node-directory-size-metricsnamespace: monitoringannotations: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-metricstemplate:metadata:labels:app: node-directory-size-metricsannotations: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-duimage: giantswarm/tiny-tools:latestimagePullPolicy: IfNotPresentcommand:- fish- --command- |touch /tmp/metrics-tempwhile truefor directory in (du --bytes --separate-dirs --threshold=100M /mnt)echo $directory | read size pathecho "node_directory_size_bytes{path=\"$path\"} $size" \>> /tmp/metrics-tempendmv /tmp/metrics-temp /tmp/metricssleep 300endvolumeMounts:- name: host-fs-varmountPath: /mnt/varreadOnly: true- name: metricsmountPath: /tmp- name: caddyimage: dockermuenster/caddy:0.9.3command:- "caddy"- "-port=9102"- "-root=/var/www"ports:- containerPort: 9102volumeMounts:- name: metricsmountPath: /var/wwwvolumes:- name: host-fs-varhostPath:path: /var- name: metricsemptyDir:medium: Memory

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

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

相关文章

杰发科技AC7840——SPI通信简介(1)_跑通Demo

0. 简介 一些配置项: CPHA:相序 CPLO:极性 看着demo需要按键,于是去掉按键,去掉打印,直接输出波形看逻辑分析仪的信号。 其实现在做这些demo测试应该都有逻辑分析仪,直接看波形更直观一点。…

【C 数据结构】图的存储结构

文章目录 【 1. 图的顺序存储结构 】1.1 基本原理1.2 顺序存储结构的 C 实现 【 2. 图的链式存储结构 】2.1 图的临接表存储结构2.1.1 临接表的 基本原理2.1.2 临接表的 链表节点2.1.3 邻接表 各结构体的C实现2.1.4 临接表 计算顶点的出度和入度邻接表计算 无向图的出度和入度邻…

一款可视化正则表达式工具

regex-vis是一款在线免费且可视化的正则表达式工具 界面图: 只能输入由26个英文字母组成的字符串 ^[A-Za-z]$ 只能输入数字 ^[0-9]*$测试错误 测试正确 快来感受一下叭 官方网址: Regex VisRegex visualizer & editor, make the regular expr…

小红书聚光里的流量洼地:N个百万级别的捡钱机会

小红书聚光里的流量洼地:N个百万级别的捡钱机会 一、前言 在最近的分享会上,笔者主要围绕小红书聚光投流的经验和对其他行业赛道的调研,与大家探讨了小红书的红利机会。在这个竞争激烈的市场中,如何抓住小红书这一流量洼地&…

回溯法——(1)装载问题(C语言讲解)

目录 一、装载问题 1.问题概括: 2.解决方案(思路): 3.图片讲解(超详细): 4.代码分析: 二、算法改进:引入上界函数 1.问题概念: 2.图片讲解&#xff1a…

【设计模式】工厂方法模式(Factory Method Pattern)

目录标题 工厂方法设计模式详解1. 介绍2. 结构3. 实现步骤3.1 创建抽象产品接口3.2 创建具体产品类3.3 创建抽象工厂接口3.4 创建具体工厂类3.5 客户端使用 4. 好处与优点5. 坏处与缺点6. 适用场景7. 总结 工厂方法设计模式详解 1. 介绍 工厂方法模式是一种创建型设计模式&am…

SpringCloud学习笔记(一)微服务介绍、服务拆分和RestTemplate远程调用、Eureka注册中心

文章目录 1 认识微服务1.1 单体架构1.2 分布式架构1.3 微服务1.4 SpringCloud1.5 总结 2 服务拆分与远程调用2.1 服务拆分原则2.2 服务拆分示例2.2.1 搭建项目2.2.2 创建数据库和表2.2.3 实现远程调用2.2.3.1 需求描述2.2.3.2 注册RestTemplate2.2.3.3 实现远程调用 2.2.4 提供…

strtok,perror,strerror函数·

strtok函数 strtok函数是C语言中的一个字符串函数,用于将一个字符串根据特定的分隔符拆分成多个子字符串。它的函数原型如下: char *strtok(char *str, const char *delim); 在这个函数中,str表示要进行拆分的字符串,delim表示…

Spark01 —— Spark基础

文章目录 Spark01 —— Spark基础一、为什么选择Spark?1.1 MapReduce编程模型的局限性1.2 Spark与MR的区别1.3 版本1.4 优势1.5 Spark其他知识1、多种运行模式2、技术栈3、spark-shell:Spark自带的交互式工具4、Spark服务 二、Spark的基础配置三、Spark实…

Spring-Mybatis-Xml管理(动态sql语句,sql语句复用)

目录 前置条件 动态SQL语句 动态删除数据 1.集合类型:数组 2.集合类型: List 型 SQL语句重用 说明 🧨前置条件 已经创建了实体类(这边举个例子) 实体类User表 表中的字段名User实体类的属性值id (bigint auto increment) 长整型 自动增长private Long iduser…

day17-day20_项目实战项目部署

万信金融 项目部署 目标: 理解DevOps概念 能够使用Docker Compose部署项目 理解持续集成的作用 会使用Jenkins进行持续集成 1 DevOps介绍 1.1 什么是DevOps DevOps是Development和Operations两个词的缩写,引用百度百科的定义: DevOps…

《C语言深度解剖》(10):数组指针、指针数组和数组指针数组

🤡博客主页:醉竺 🥰本文专栏:《C语言深度解剖》《精通C指针》 😻欢迎关注:感谢大家的点赞评论关注,祝您学有所成! ✨✨💜💛想要学习更多C语言深度解剖点击专栏…

重学java 26.面向对象 内部类⭐

“别担心,你一定能如愿。” —— 24.4.29 1.什么时候使用内部类: 当一个事物的内部,还有一个部分需要完整的结构去描述,而内部的完整结构又只为外部事物提供服务,那么整个内部的完整结构最好使用内部类 比如&#xff1…

人工智能论文:BERT和GPT, GPT-2, GPT-3 的简明对比和主要区别

在BERT的论文里面: 2018.10 BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding,BERT已经解释了BERT,GPT,ELMo的区别。 *ELMo为双向RNN,请忽略。 主要区别: BERT使用的是…

49. 【Android教程】HTTP 使用详解

在你浏览互联网的时候,绝大多数的数据都是通过 HTTP 协议获取到的,也就是说如果你想要实现一个能上网的 App,那么就一定会和 HTTP 打上交道。当然 Android 发展到现在这么多年,已经有很多非常好用,功能非常完善的网络框…

信息系统项目管理师0078:安全系统(5信息系统工程—5.4安全工程—5.4.2安全系统)

点击查看专栏目录 文章目录 5.4.2安全系统1.安全机制2.安全服务3.安全技术5.4.2安全系统 信息安全保障系统一般简称为信息安全系统,它是“信息系统”的一个部分,用于保证“业务应用信息系统”正常运营。现在人们已经明确,要建立一个“信息系统”,就必须要建立一个或多个业务…

hive使用hplsql进行etl或其它数据加工

参照 https://cwiki.apache.org/confluence/pages/viewpage.action?pageId59690156 http://www.hplsql.org/doc Hive HPL/SQL,即Hive Hybrid Procedural SQL一个开源工具,它为hive实现了过程性的SQL功能,类似Oracle的PLSQL。从hive 2.0.0开…

RustGUI学习(iced)之小部件(四):如何使用单选框radio部件?

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

Python量化炒股的获取数据函数—get_concept()

查询股票所属的概念板块函数get_concept(),利用该函数可以查询一只或多只股票所属的概念板块,其语法格式如下: get_concept(security, dateNone)security:标的代码。类型为字符串,形式如‘000001.XSHE’,或…

k8s安装nginx Ingress超详细指南

在本全面的 Ingress 指南中,您将学习如何在 Kubernetes 上设置 Nginx Ingress控制器并使用 DNS 配置 Ingress。 目前有两种 Nginx Ingress 控制器。 kubernetes 社区的 Nginx Ingress 控制器Nginx Inc 开发的 Nginx Ingress 控制器 我们将使用 Kubernetes 社区 N…