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

prometheus server安装

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

apiVersion: v1
kind: ServiceAccount
metadata:name: monitornamespace: 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: prometheusname: prometheus-confignamespace: monitor-sa
data:prometheus.yml: |global:scrape_interval: 15sscrape_timeout: 10sevaluation_interval: 1mscrape_configs:- job_name: 'kubernetes-node'kubernetes_sd_configs:- role: noderelabel_configs:- source_labels: [__address__]regex: '(.*):10250'replacement: '${1}:9100'target_label: __address__action: replace- action: labelmapregex: __meta_kubernetes_node_label_(.+)- job_name: 'kubernetes-node-cadvisor'kubernetes_sd_configs:- role:  nodescheme: httpstls_config:ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crtbearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/tokenrelabel_configs:- action: labelmapregex: __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: endpointsscheme: httpstls_config:ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crtbearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/tokenrelabel_configs:- source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]action: keepregex: default;kubernetes;https- job_name: 'kubernetes-service-endpoints'kubernetes_sd_configs:- role: endpointsrelabel_configs:- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]action: keepregex: true- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme]action: replacetarget_label: __scheme__regex: (https?)- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path]action: replacetarget_label: __metrics_path__regex: (.+)- source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]action: replacetarget_label: __address__regex: ([^:]+)(?::\d+)?;(\d+)replacement: $1:$2- action: labelmapregex: __meta_kubernetes_service_label_(.+)- source_labels: [__meta_kubernetes_namespace]action: replacetarget_label: kubernetes_namespace- source_labels: [__meta_kubernetes_service_name]action: replacetarget_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-httpannotations: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-serviceannotations: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-servernamespace: monitor-salabels:app: prometheusspec:replicas: 1selector:matchLabels:app: prometheuscomponent: servertemplate:metadata: labels:app: prometheuscomponent: serverannotations:prometheus.io/scrape: 'false'spec:nodeName: node1serviceAccountName: monitorcontainers:- name: prometheusimage: prom/prometheus:v2.2.1imagePullPolicy: IfNotPresentcommand:- prometheus- --config.file=/etc/prometheus/prometheus.yml- --storage.tsdb.path=/prometheus- --storage.tsdb.retention=720h- --web.enable-lifecycleports:- containerPort: 9090protocol: TCPvolumeMounts:- name: prometheus-configmountPath: /etc/prometheus/prometheus.ymlsubPath: prometheus.yml- name: prometheus-storage-volumemountPath: /prometheus/volumes:- name: prometheus-configconfigMap:name: prometheus-configitems:- key: prometheus.ymlpath: prometheus.ymlmode: 0644- name: prometheus-storage-volumehostPath:path: /datatype: 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: prometheusnamespace: monitor-salabels:app: prometheus
spec:type: NodePortports:- port: 9090targetPort: 9090protocol: TCPselector:app: prometheuscomponent: 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

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

查看target里面的内容:

 

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

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

相关文章

LeetCode热题100刷题4:76. 最小覆盖子串、239. 滑动窗口最大值、53. 最大子数组和、56. 合并区间

76. 最小覆盖子串 滑动窗口解决字串问题。 labuladong的算法小抄中关于滑动窗口的算法总结&#xff1a; class Solution { public:string minWindow(string s, string t) {unordered_map<char,int> need,window;for(char c : t) {need[c];}int left 0, right 0;int …

2.8亿东亚五国建筑数据分享

数据是GIS的血液&#xff01; 我们现在为你分享东亚5国的2.8亿条建筑轮廓数据&#xff0c;该数据包括中国、日本、朝鲜、韩国和蒙古5个东亚国家完整、高质量的建筑物轮廓数据&#xff0c;你可以在文末查看领取方法。 数据介绍 虽然开源的全球的建筑数据已经有微软的建筑数据…

vxe-table的序号一样

使用vxe-table的时候&#xff0c;有的时候会出现序号相同的现象&#xff0c;这种现象一般出现在我们后面自己添加的行中&#xff0c;就像这种 此时的这三个序号是相同的&#xff0c;我来说一下原因&#xff0c;这是在添加新的一行的时候&#xff0c;有的时候数据很多&#xff0…

Mac 运行 Windows 软件,Parallels Desktop 19和 CrossOver 24全面对比

Parallels Desktop 和 CrossOver 都是能满足你「在 Mac 上运行 Windows 软件」需求的工具。可能很多人都已经知道 Parallels Desktop 是「虚拟机」&#xff0c;但 CrossOver 其实并不是「虚拟机」。这两款软件有相同的作用&#xff0c;但由于实现原理的不同&#xff0c;两者也有…

系统提示我未定义与 ‘double‘ 类型的输入参数相对应的函数 ‘finverse‘,如何解决?

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

TCP粘包解决方法

一. 产生原因及解决方法 产生原因&#xff1a;TCP是面向连接、基于字节流的协议&#xff0c;其无边界标记。当服务端处理速度比不其接收速度时&#xff0c;就很容易产生粘包现象。 解决方法&#xff1a;目前主要有两种解决方法&#xff0c;一个是在内容中添加分割标识&#xf…

人脸识别考勤系统

人脸识别考勤系统是一种利用生物识别技术进行自动身份验证的现代解决方案&#xff0c;它通过分析和比对人脸特征来进行员工的出勤记录。这种系统不仅提升了工作效率&#xff0c;还大大减少了人为错误和欺诈行为的可能性。 一、工作原理 人脸识别考勤系统的核心在于其生物识别…

管道支架安装

工程结构施工完毕后&#xff0c;系统管道安装完毕后的第一步任务就是管道支架的制作安装&#xff0c;作为对管道固定和承重作用至关重要的支、托、吊架&#xff0c;有些项目部在施工中却往往因为对它们的重要性认识不足&#xff0c;因存在侥幸心里或经验主义&#xff0c;导致支…

技术探索:利用Python库wxauto实现Windows微信客户端的全面自动化管理

项目地址&#xff1a;github-wxauto 点击即可访问 项目官网&#xff1a;wxauto 点击即可访问 &#x1f602;什么是wxauto? wxauto 是作者在2020年开发的一个基于 UIAutomation 的开源 Python 微信自动化库&#xff0c;最初只是一个简单的脚本&#xff0c;只能获取消息和发送…

掌握MySQL基础命令:数据更新操作详细操作(数据的增删改)

MySQL数据修改是指使用SQL语句&#xff08;如UPDATE、INSERT、DELETE&#xff09;对数据库表中的数据进行更改、添加或删除的操作&#xff0c;常见的操作包括更新表中的记录、插入新记录以及删除现有记录 。 一、数据插入 1插入完整的数据记录 2插入非完整的数据记录 3插入多…

macOS使用Karabiner-Elements解决罗技鼠标G304连击、单击变双击的故障

记录一下罗技鼠标G304单击变双击的软件解决过程和方案&#xff08;适用于macOS&#xff0c; 如果是Windows&#xff0c;使用AutoHotKey也有类似解决办法、方案&#xff0c;改日提供&#xff09;&#xff1a; 背景&#xff1a;通过罗技Logitech G HUB软件对罗技的游戏鼠标侧键b…

摄像机反求跟踪软件/插件 Mocha Pro 2024 v11.0.2 CE Win

AE/PR/OFX/达芬奇/AVX插件 | 摄像机反求跟踪软件Mocha Pro 2024 v11.0.2 CE Win-PR模板网 Mocha Pro 软件(插件)&#xff0c;用于平面运动跟踪、3D跟踪、动态观察、对象移除、图像稳定和PowerMesh有机扭曲跟踪等功能。整合了SynthEyes核心的3D跟踪算法&#xff0c;能够快速自动…

k8s-第四节-Service

Service Service 通过 label 关联对应的 PodServcie 生命周期不跟 Pod 绑定&#xff0c;不会因为 Pod 重创改变 IP提供了负载均衡功能&#xff0c;自动转发流量到不同 Pod可对集群外部提供访问端口集群内部可通过服务名字访问 创建 Service kubectl apply -f service.yamlkub…

003-基于Sklearn的机器学习入门:回归分析(上)

本节及后续章节将介绍机器学习中的几种经典回归算法&#xff0c;所选方法都在Sklearn库中聚类模块有具体实现。本节为上篇&#xff0c;将介绍基础的线性回归方法&#xff0c;包括线性回归、逻辑回归、多项式回归和岭回归等。 2.1 回归分析概述 回归&#xff08;Regression&…

11 - matlab m_map地学绘图工具基础函数 - 绘制航迹、椭圆、风向玫瑰图和特定的圆形区域的有关函数及其用法

11 - matlab m_map地学绘图工具基础函数 - 绘制航迹、椭圆、风向玫瑰图和特定的圆形区域的有关函数及其用法 0. 引言1. 关于m_track2. 关于m_range_ring3. 关于m_ellipse4. 关于m_windrose5. 结语 0. 引言 本篇介绍下m_map中绘制航迹图函数&#xff08;m_track&#xff09;、绘…

python 发布应用程序包

文章目录 发布python包toml配置文件构建发布python包 官方文档参考 将自己的python项目发布成源码包或者wheel二进制包,供其他开发者使用。 方式: 使用py工具; distutils,该工具的使用已过时;setuptools,常用方式;wheel,在setuptools的基础上添加了 bdist_wheel, …

【BUUCTF-PWN】4-ciscn_2019_n_1

参考&#xff1a;BUUCTF-ciscn_2019_n_1 - 纸鸢asahi - 博客园 (cnblogs.com) buuctf 刷题记录_PWN ciscn_2019_n_1 - MuRKuo - 博客园 (cnblogs.com) 从题海中入门&#xff08;四&#xff09;ciscn_2019_n_1 - FreeBuf网络安全行业门户 ciscn_2019_n_1 ——两种解法_0x4134800…

Generative Modeling by Estimating Gradients of the Data Distribution

Generative Modeling by Estimating Gradients of the Data Distribution 本文介绍宋飏提出的带噪声扰动的基于得分的生成模型。首先介绍基本的基于得分的生成模型的训练方法&#xff08;得分匹配&#xff09;和采样方法&#xff08;朗之万动力学&#xff09;。然后基于流形假…

信号量——Linux并发之魂

欢迎来到 破晓的历程的 博客 引言 今天&#xff0c;我们继续学习Linux线程本分&#xff0c;在Linux条件变量中&#xff0c;我们对条件变量的做了详细的说明&#xff0c;今天我们要利用条件变量来引出我们的另一个话题——信号量内容的学习。 1.复习条件变量 在上一期博客中&…

天润融通分析AI技术助力客户服务,实现满意度三倍增长

如今&#xff0c;客户体验越来越成为影响客户决策的核心要素。 对于企业来讲&#xff0c;客户在不同触点的每一次互动体验&#xff0c;都成为塑造品牌声誉的“Aha时刻”。但同时&#xff0c;随着社会的发展的加速&#xff0c;客户的需求也在日新月异&#xff0c;给企业带来挑战…