[单master节点k8s部署]17.监控系统构建(二)Prometheus安装

prometheus server安装

创建sa账号,对prometheus server进行授权。因为Prometheus是安装在pod里面,以pod的形式去运行的,因此需要创建sa,并对他做rbac授权。

apiVersion: v1
kind: ServiceAccount
metadata:
  name: monitor
  namespace: monitor-sa

然后进行角色绑定 。

kubectl create clusterrolebinding monitor-clusterrolebinding -n monitor-sa --clusterrole=cluster.admin --serviceaccount=monitor-sa:monitor

 再把sa绑定到pod里。这里需要提前设置Prometheus的存储目录。在工作节点上进行操作mkdir /data,然后设置目录权限chmod 777 /data。

Prometheus config

创建一个configMap存储卷来存储Prometheus的配置:

[root@master prometheus]# cat prometheus-cfg.yaml 
---
kind: ConfigMap
apiVersion: v1
metadata:
  labels:
    app: prometheus
  name: prometheus-config
  namespace: monitor-sa
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 
服务发现配置node_exporter

scrape_configs:
    - job_name: 'kubernetes-node'
      kubernetes_sd_configs:
      - role: node 

这一段是使用kubernetes的服务发现,使用node角色,它使用默认的kubelet提供的http端口来发现集群中每个node节点。

然后进行relabel:

relabel_configs:
      - source_labels: [__address__]
        regex: '(.*):10250'
        replacement: '${1}:9100'
        target_label: __address__
        action: replace
      - action: labelmap
        regex: __meta_kubernetes_node_label_(.+)

这个正则将前缀匹配,然后labelmap把前缀去掉,只用后面大家不一样的标签,这样就能进行更细致的数据表示和分类

在 Kubernetes 集群中,Prometheus 通过服务发现获取节点的默认地址和端口(通常是 node-ip:10250,这是 kubelet 的默认 HTTP 端口)。由于 Node Exporter 通常运行在节点的 9100 端口,因此我们使用重标签配置(relabeling)将 node-ip:10250 替换为 node-ip:9100。这样,Prometheus 就能从正确的端口(9100)抓取到 Node Exporter 的监控数据。 

cAdvisor配置 

 - 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

 cAdvisor是用来获取容器内部信息的job,pormetheus通过上面job的服务发现,得到了所有node的cluster IP,但是这里Prometheus想通过kubernetes 的api代理来进行aAdvisor的访问,kubernetes.default.svc:443 是 Kubernetes 集群内部访问 Kubernetes API 服务器的服务地址。这个地址使用 Kubernetes 内部 DNS 解析,并且所有集群内部的 Pod 都可以通过这个地址访问 API 服务器。所以用kubectl的新的url就是 https://kubernetes.default.svc:443/api/v1/nodes/xianchaomaster1/proxy/metrics/cadvisor,这个nodename可以随着不同的node改变。

下面的代码可以看到kubernetes的服务的端口就是443

[root@master prometheus]# kubectl get svc
NAME                TYPE           CLUSTER-IP      EXTERNAL-IP                            PORT(S)        AGE
client-svc          ExternalName   <none>          nginx-svc.nginx-ns.svc.cluster.local   80/TCP         6d8h
kubernetes          ClusterIP      10.96.0.1       <none>                                 443/TCP        18d
my-nginx-nodeport   NodePort       10.99.238.240   <none>                                 80:30380/TCP   7d
nginx               ClusterIP      None            <none>                                 80/TCP         3d
服务抓取 

- 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

如果一个service打上了“prometheus.io/scrape: true” 的标签(source_labels),就是说这个service允许prometheus抓取。如果匹配到就保留,否则就丢弃。

- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme]
        action: replace
        target_label: __scheme__
        regex: (https?)

apiVersion: v1
kind: Service
metadata:
  name: my-service-http
  annotations:
    prometheus.io/scheme: "http"
spec:
  ports:
...

抓取service使用的协议,并放在__scheme__这个标签中保存,要么是http,要么是https。

- source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]
        action: replace
        target_label: __address__
        regex: ([^:]+)(?::\d+)?;(\d+)
        replacement: $1:$2

指定要使用的源标签,分别是 __address____meta_kubernetes_service_annotation_prometheus_io_port。Prometheus 会将这两个标签的值用分号 ; 连接成一个字符串。例如,如果 __address__ 的值是 my-service:8080__meta_kubernetes_service_annotation_prometheus_io_port 的值是 9090,那么组合后的字符串就是 my-service:8080;9090。举例如下:

apiVersion: v1
kind: Service
metadata:
  name: my-service
  annotations:
    prometheus.io/port: "8080"

然后使用正则来处理  my-service:8080;9090。第一个括号([^:]+)选择冒号之前的部分为$0,这里为my-service,(?::\d+)?匹配冒号之后的数字,(?:)表示这是一个非捕获组,+表示可以有多个数字,?表示这个组合整体是可选的,可以匹配 0 次或 1 次。;匹配一个封号,然后(\d+)匹配封号之后的数字,也就是9090。最后把target_label的地址变为my-service:9090

使用注释和 relabel_configs 来调整端口的目的是为了确保 Prometheus 能够灵活地适应不同服务和环境中暴露指标的端口变化。这种配置方式提高了 Prometheus 配置的灵活性和适应性,确保它能够正确地抓取到所需的指标数据。 

同理,也可以抓取metrics的标签,然后放入标签_metrics_path__中,抓取namespace标签,放入kubernetes_namespace标签中。

配置deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: prometheus-server
  namespace: monitor-sa
  labels:
    app: prometheus

spec:
  replicas: 1
  selector:
    matchLabels:
      app: prometheus
      component: server
  template:
    metadata: 
      labels:
        app: prometheus
        component: server
      annotations:
        prometheus.io/scrape: 'false'
    spec:
      nodeName: node1
      serviceAccountName: monitor
      containers:
      - name: prometheus
        image: prom/prometheus:v2.2.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:
        - name: prometheus-config
          mountPath: /etc/prometheus/prometheus.yml
          subPath: prometheus.yml
        - name: prometheus-storage-volume
          mountPath: /prometheus/
      volumes:
      - name: prometheus-config
        configMap:
          name: prometheus-config
          items:
          - key: prometheus.yml
            path: prometheus.yml
            mode: 0644
      - name: prometheus-storage-volume
        hostPath:
          path: /data
          type: Directory

 command:
        - prometheus
        - --config.file=/etc/prometheus/prometheus.yml
        - --storage.tsdb.path=/prometheus
        - --storage.tsdb.retention=720h
        - --web.enable-lifecycle

这些命令是容器启动时执行的,其中第一行Prometheus并不是一个命令,而是一个可执行文件的名称,首先检查这个文件是否存在在镜像中,然后执行的过程中传递参数。

 volumes:
      - name: prometheus-config
        configMap:
          name: prometheus-config
          items:
          - key: prometheus.yml
            path: prometheus.yml
            mode: 0644

这个代表将prometheus config面的一个配置文件(有可能会包含多个配置文件)挂载起来

权限模式由四个数字组成:

  • 第一个数字(通常省略):设置特殊权限(Setuid、Setgid、Sticky 位)。
  • 第二个数字:所有者权限。
  • 第三个数字:组权限。
  • 第四个数字:其他用户权限。

每个数字代表三个权限位(读、写、执行):

  • 4:读权限(r)
  • 2:写权限(w)
  • 1:执行权限(x)

例如,0644 分解为:

  • 0:没有设置特殊权限。
  • 6:所有者有读写权限(4+2)。
  • 4:组有读取权限。
  • 4:其他用户有读取权限。
/data目录权限错误

目录权限错误:第一次运行的时候,忘记给/data更改权限,导致container尝试在 /prometheus 目录中打开数据库文件时遇到了权限拒绝错误。

[root@master prometheus]# kubectl logs prometheus-server-777db64bdb-cth6b -n monitor-sa
level=info ts=2024-07-04T02:45:46.985182Z caller=main.go:220 msg="Starting Prometheus" version="(version=2.2.1, branch=HEAD, revision=bc6058c81272a8d938c05e75607371284236aadc)"
level=info ts=2024-07-04T02:45:46.985233192Z caller=main.go:221 build_context="(go=go1.10, user=root@149e5b3f0829, date=20180314-14:15:45)"
level=info ts=2024-07-04T02:45:46.985248736Z caller=main.go:222 host_details="(Linux 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64 prometheus-server-777db64bdb-cth6b (none))"
level=info ts=2024-07-04T02:45:46.985260941Z caller=main.go:223 fd_limits="(soft=1048576, hard=1048576)"
level=info ts=2024-07-04T02:45:46.986875199Z caller=main.go:504 msg="Starting TSDB ..."
level=info ts=2024-07-04T02:45:46.98689516Z caller=web.go:382 component=web msg="Start listening for connections" address=0.0.0.0:9090
level=info ts=2024-07-04T02:45:46.986988203Z caller=main.go:398 msg="Stopping scrape discovery manager..."
level=info ts=2024-07-04T02:45:46.987001517Z caller=main.go:411 msg="Stopping notify discovery manager..."
level=info ts=2024-07-04T02:45:46.987008714Z caller=main.go:432 msg="Stopping scrape manager..."
level=info ts=2024-07-04T02:45:46.987018357Z caller=manager.go:460 component="rule manager" msg="Stopping rule manager..."
level=info ts=2024-07-04T02:45:46.987029598Z caller=manager.go:466 component="rule manager" msg="Rule manager stopped"
level=info ts=2024-07-04T02:45:46.987037473Z caller=notifier.go:512 component=notifier msg="Stopping notification manager..."
level=info ts=2024-07-04T02:45:46.987047143Z caller=main.go:573 msg="Notifier manager stopped"
level=info ts=2024-07-04T02:45:46.98703874Z caller=main.go:407 msg="Notify discovery manager stopped"
level=info ts=2024-07-04T02:45:46.98702453Z caller=main.go:394 msg="Scrape discovery manager stopped"
level=info ts=2024-07-04T02:45:46.98703596Z caller=main.go:426 msg="Scrape manager stopped"
level=error ts=2024-07-04T02:45:46.987764472Z caller=main.go:582 err="Opening storage failed open DB in /prometheus: open /prometheus/243953157: permission denied"
level=info ts=2024-07-04T02:45:46.987791139Z caller=main.go:584 msg="See you next time!"
创建service

创建Prometheus的service,从而可以从集群外访问

[root@master prometheus]# cat prometheus-svc.yaml 
apiVersion: v1
kind: Service
metadata:
  name: prometheus
  namespace: monitor-sa
  labels:
    app: prometheus
spec:
  type: NodePort
  ports:
    - port: 9090
      targetPort: 9090
      protocol: TCP
  selector:
    app: prometheus
    component: server

随后查看创建的svc,发现匹配了端口

[root@master prometheus]# kubectl get svc -n monitor-sa
NAME         TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
prometheus   NodePort   10.101.118.2   <none>        9090:32331/TCP   24s

随后在浏览器上打开,访问成功

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

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

相关文章

k8s学习--k8s群集部署zookeeper应用及详细解释

文章目录 zookeeper什么是zookeeper基本概念主要功能工作原理使用场景优点缺点 k8s集群部署zookeeper环境一、zookeeper部署YAML资源清单准备二、zookeeper部署及部署验证三、zookeeper应用验证 zookeeper 什么是zookeeper ZooKeeper 是一个开源的分布式协调服务&#xff0c;…

Windows11 安装MySQL

MySQL下载官网 安装教程参考 选择Windows离线安装 典型安装

优化页面加载时间

注&#xff1a;机翻&#xff0c;未校对。 本文年代久远&#xff0c;除了少部分不合时宜的&#xff0c;其他仍有借鉴意义。 Optimizing Page Load Time 优化页面加载时间 It is widely accepted that fast-loading pages improve the user experience. In recent years, many …

Pharmacy Management System v1.0 文件上传漏洞(CVE-2022-30887)

前言 CVE-2022-30887 是一个存在于 Pharmacy Management System v1.0 中的远程代码执行&#xff08;RCE&#xff09;漏洞。这个漏洞存在于 /php_action/editProductImage.php 组件中。攻击者可以通过上传一个精心制作的图像文件来执行任意代码。 漏洞详细信息 漏洞描述: Pha…

java项目总结2

3.了解Java的内存分配 4.重载 定义&#xff1a;在一个类中&#xff0c;有相同名的&#xff0c;但是却是不同参数&#xff08;返回类型可以不一样&#xff09; 重载的优点&#xff1a; 1.减少定义方法时使用的单词 2.减少调用方法时候的麻烦&#xff08;比如sum的返回两个数的…

5月1日起,《碳排放权交易管理暂行条例》正式施行

2024年5月1日&#xff0c;《碳排放权交易管理暂行条例》&#xff08;以下简称《条例》&#xff09;正式施行&#xff0c;作为我国应对气候变化领域的第一部专门法规&#xff0c;《条例》首次以行政法规的形式明确了碳排放权市场交易制度。 作为碳排放权交易市场的重要补充&…

关于腾讯的哪些事(4月新闻纪要)

科技进步一等奖&#xff01; 这份文件是关于腾讯Angel机器学习平台获得2023年中国电子学会科学技术奖科技进步一等奖的详细介绍。主要内容涵盖了获奖项目《面向大规模数据的Angel机器学习平台关键技术及应用》的技术特点、应用效果以及发展历程。以下是详细总结&#xff1a; 获…

数据结构——树的基础概念

目录 1.树的概念 2.树的相关概念 3.树的表示 &#xff08;1&#xff09;直接表示法 &#xff08;2&#xff09;双亲表示法 (3)左孩子右兄弟表示法 4.树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; 1.树的概念 树是一种非线性的数据结构&#xff0…

关于一些数据资源入表事项

一、入表条件&#xff1a; 2024年1月1日《企业数据资源相关会计处理暂行规定》开始执行&#xff0c;以上简称《企业会计准则》&#xff0c;它将资产定义为“企业过去的交易或者事项形成的、由企业拥有或者控制的、预期会给企业带来经济利益的资源”。需要说明的是&#xff0c;…

github 设置中文,亲测有效

点进去 安装 选上面第二个&#xff0c;不行再选第一个 GitHub - maboloshi/github-chinese: GitHub 汉化插件&#xff0c;GitHub 中文化界面。 (GitHub Translation To Chinese)

Java学习十二—Java8特性之Optional类

一、简介 Java 8 引入了 Optional​ 类作为一种容器&#xff0c;可以用来显式地表示一个值存在或不存在。它解决了传统上可能会遇到的空指针异常问题&#xff0c;同时提供了一种更优雅的方式来处理可能为null的情况。 Java 8 中引入 Optional​ 类的背景可以从以下几个方面来理…

Ubuntu查看opencv版本c++

✗命令行中直接输入&#xff1a; pkg-config --modversion opencv✔命令行中直接输入&#xff1a; pkg-config --modversion opencv4注解&#xff1a;附上在markdown中打勾&#xff0c;对号和打叉。使用时将&和#之间的空格去掉&#xff0c;这里只是为了不让CSDN自动转换才…

内容监管与自由表达:Facebook的平衡之道

在当今数字化信息社会中&#xff0c;社交媒体平台不仅是人们交流和获取信息的主要渠道&#xff0c;也是自由表达的重要舞台。Facebook&#xff0c;作为全球最大的社交网络平台&#xff0c;连接了数十亿用户&#xff0c;形成了一个丰富多样的信息生态。然而&#xff0c;如何在维…

怎么加密CAD图纸丨企业级图纸加密软件排行榜

我们为什么需要一款好用的图纸加密软件&#xff1f; CAD图纸包含企业的核心设计和技术&#xff0c;是宝贵的知识产权。加密软件可以防止未经授权的人员获取和复制这些设计。 通过加密&#xff0c;可以有效防止CAD图纸在传输或存储过程中被窃取或泄露&#xff0c;特别是在互联…

软考的报名详细流程

2024年软考的考试时间已经公布&#xff0c;分别为5月25日至28日和11月9日至12日。准备参加2024年软考的朋友们&#xff0c;一定要提前关注官方发布的考试安排。 本文将详细介绍软考报考的整个流程。准备报考的朋友们&#xff0c;阅读本文就足够啦&#xff01;软考的报考流程大致…

面向高精度导航定位领域的UM980RTK定位模块

UM980 是和芯星通自主研发的新一代 BDS/GPS/GLONASS/Galileo/QZSS 全系统全频高精度 RTK 定位模块&#xff0c;基于和芯星通自主研发的新一代射频基带及高精度算法一体化GNSS SoC 芯片—NebulasIV 设计。可同时跟踪 BDS, GPS, GLONASS, Galileo, QZSS, NavIC, SBAS, L-Band* 等…

docker容器间网络仿真工具-pumba

docker-tc&pumba docker-tc:docker-tc项目仓库 pumba:pumba项目仓库 这两个项目理论上都可以实现对容器间的网络环境进行各种模拟干预&#xff0c;包括延迟&#xff0c;丢包&#xff0c;带宽限制等。 但是我在实际使用时&#xff0c;发现docker-tc这个工具在进行网络进行模…

大屏开发系列——Echarts的基础使用

本文为个人近期学习总结&#xff0c;若有错误之处&#xff0c;欢迎指出&#xff01; Echarts在vue2中的基础使用 一、简单介绍二、基本使用&#xff08;vue2中&#xff09;1.npm安装2.main.js引入3.使用步骤(1)准备带有宽高的DOM容器&#xff1b;(2)初始化echarts实例&#xff…

React+TS前台项目实战(二十五)-- 全局常用排序组件SortButton封装

文章目录 前言SortButton组件1. 功能分析2. 代码详细注释3. 使用到的全局hook代码4. 使用方式5. 效果展示 总结 前言 今天要封装的SortButton 组件&#xff0c;主要用在表格列排序上&#xff0c;运用于更新路由并跳转更新&#xff0c;起到刷新页面仍然处于当前排序数据。 Sor…

2024最新PyCharm安装教程(附激活码)

今天讲解的是PyCharm安装教程 一、软件简介 PyCharm是一款Python IDE&#xff0c;其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具&#xff0c;比如&#xff0c; 调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制等等。此外…