当前位置: 代码网 > 服务器>服务器>Linux > 在k8s中部署Prometheus并实现对k8s集群的监控

在k8s中部署Prometheus并实现对k8s集群的监控

2024年07月31日 Linux 我要评论
本文详细介绍了如何在Kubernetes(k8s)集群中部署Prometheus,并实现对整个集群的监控。首先,文章简要概述了Prometheus作为一款开源系统监控和警报工具包的强大功能,以及它在现代云原生架构中的重要性。接着,文章详细阐述了在k8s集群中部署Prometheus的步骤,包括安装必要的组件

🐇明明跟你说过:

🏅个人专栏:《prometheus:监控的神》 🏅

🔖行路有良友,便是天堂🔖

目录

一、引言

1、k8s简介

2、 prometheus概述

二、准备k8s环境

1、k8s集群搭建

2、集群状态检查

三、部署prometheus 

1、创建名称空间

2、安装node-exporter

3、安装prometheus server

4、创建service

四、访问测试


一、引言

1、k8s简介

 有关k8s起源的介绍,请参考《初识k8s之前世今生、架构、组件、前景》这篇文章

​​

kubernetes的优点包括可移植性、可伸缩性和扩展性。它使用轻型的yaml清单文件实现声明性部署方法,对于应用程序更新,无需重新构建基础结构。管理员可以计划和部署容器,根据需要扩展容器并管理其生命周期。借助kubernetes的开放源代码api,用户可以通过首选编程语言、操作系统、库和消息传递总线来构建应用程序,还可以将现有持续集成和持续交付(ci/cd)工具集成。

2、 prometheus概述

以下是 prometheus 的一些关键特点和概述:

  1. 多维数据模型: prometheus 使用多维数据模型来存储时间序列数据,这意味着每个样本可以与任意数量的键/值标签相关联。这种灵活性使得用户可以以灵活的方式对数据进行查询和分析。
  2. 灵活的查询语言: prometheus 提供了 promql(prometheus query language),这是一种强大而灵活的查询语言,可以用于从 prometheus 中提取和处理数据。
  3. 数据采集: prometheus 通过称为 exporters 的插件来采集数据。exporters 可以将各种系统和服务的指标暴露给 prometheus,例如应用程序、操作系统、数据库等。
  4. 警报管理: prometheus 具有内置的警报管理功能,可以通过配置警报规则来触发警报。这些警报可以发送到各种通知渠道,如电子邮件、slack 等。
  5. 可扩展性: prometheus 是一个高度可扩展的系统,可以通过水平扩展来处理大量的时间序列数据。它支持多种存储后端,包括本地磁盘存储和远程存储系统。
  6. 社区支持: 作为 cncf 项目的一部分,prometheus 拥有一个庞大而活跃的社区,不断提供新的功能、改进和支持。

总的来说,prometheus 是一个功能强大且灵活的监控系统,适用于各种规模的环境,并且可以与其他工具集成,以构建强大的监控解决方案。

有关prometheus的详细介绍,请参考《揭秘prometheus:诞生之旅与核心组件全解析》这篇文章

二、准备k8s环境

1、k8s集群搭建

如果还未搭建k8s集群,请参考《深度解析:kubernetes 1.28.2集群安装过程中的关键步骤》这篇文章

2、集群状态检查

[root@master ~]# kubectl get node

三、部署prometheus 

1、创建名称空间

创建一个名为prometheus的名称空间,prometheus所有的组件都在这个名称空间下运行

[root@master ~]# kubectl create ns prometheus
namespace/prometheus created

2、安装node-exporter

node-exporter资源官网地址:download | prometheus

离线镜像资源我已经放到资源列表中了,大家自行下载即可

下载后,在各个节点上导入

准备yaml文件

[root@master ~]# cat node-export.yaml 
# 输入如下内容
apiversion: apps/v1
kind: daemonset
metadata:
  name: node-exporter
  namespace: prometheus
  labels:
    name: node-exporter
spec:
  selector:
    matchlabels:
     name: node-exporter
  template:
    metadata:
      labels:
        name: node-exporter
    spec:
      hostpid: true
      hostipc: true
      hostnetwork: true
      containers:
      - name: node-exporter
        image: docker.io/prom/node-exporter:v1.8.0
        imagepullpolicy: ifnotpresent
        ports:
        - containerport: 9100
        securitycontext:
          privileged: true
        args:
        - --path.procfs
        - /host/proc
        - --path.sysfs
        - /host/sys
        - --collector.filesystem.ignored-mount-points
        - '"^/(sys|proc|dev|host|etc)($|/)"'
        volumemounts:
        - name: dev
          mountpath: /host/dev
        - name: proc
          mountpath: /host/proc
        - name: sys
          mountpath: /host/sys
        - name: rootfs
          mountpath: /rootfs
      tolerations:
      - key: "node-role.kubernetes.io/master"
        operator: "exists"
        effect: "noschedule"
      volumes:
        - name: proc
          hostpath:
            path: /proc
        - name: dev
          hostpath:
            path: /dev
        - name: sys
          hostpath:
            path: /sys
        - name: rootfs
          hostpath:
            path: /
  • apiversion 指定了 kubernetes api 的版本为 apps/v1。
  • kind 指定了资源的类型为 daemonset,即守护进程集。
  • metadata 下的 name 字段指定了 daemonset 的名称为 node-exporter,namespace 字段指定了 daemonset 所属的命名空间为 prometheus。
  • spec 下定义了 daemonset 的规范。
  • selector 指定了选择器,用于选择要控制的 pod。
  • template 定义了要创建的 pod 的模板,其中包含了 pod 的元数据和规范。
  • hostpid: true、hostipc: true、hostnetwork: true:指定了容器可以使用主机的 pid、ipc 和网络命名空间。
  • containers 下定义了要运行的容器,这里定义了一个名为 node-exporter 的容器。
  • image 指定了容器的镜像为 docker.io/prom/node-exporter:v1.8.0。
  • ports 定义了容器暴露的端口,这里将容器的端口 9100 映射到了宿主机上。
  • securitycontext 下的 privileged: true 表示容器具有特权访问。
  • args 下指定了容器启动时的参数,这里配置了 node exporter 的参数。
  • volumemounts 下定义了容器挂载的卷。
  • tolerations 下定义了容忍策略,表示容器可以容忍某些节点上的特定条件。
  • volumes 下定义了宿主机的卷,用于挂载到容器中。

查看pod状态

访问测试,使用curl命令,如果有返回值,则部署成功

3、安装prometheus server

离线镜像资源我已经放到资源列表中了,大家自行下载即可

下载后,在各个节点上导入

然后,在node1节点上,为prometheus server创建一个数据目录

[root@node1 ~]# mkdir /data
[root@node1 ~]# chmod 777 /data/

为prometheus server创建一个sa,并分配权限

[root@master ~]# kubectl create serviceaccount prometheus -n prometheus
serviceaccount/prometheus created
[root@master ~]# kubectl create clusterrolebinding prometheus-clusterrolebinding -n prometheus --clusterrole=cluster-admin  --serviceaccount=prometheus:prometheus
clusterrolebinding.rbac.authorization.k8s.io/prometheus-clusterrolebinding created

 

编写prometheus的config配置文件

[root@master ~]# vim prometheus-config.yaml 
#输入以下内容
---
kind: configmap
apiversion: v1
metadata:
  labels:
    app: prometheus
  name: prometheus-config
  namespace: prometheus
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
  •  global 部分定义了全局的抓取配置,包括抓取间隔 scrape_interval、超时时间 scrape_timeout 和评估间隔 evaluation_interval。
  • scrape_configs 部分定义了要抓取的目标列表,每个 job_name 对应一个抓取目标配置。在这个示例中,有以下几个抓取目标:
  • kubernetes-node:抓取 kubernetes 节点的指标,通过 kubernetes 的服务发现配置 kubernetes_sd_configs,并通过 relabel_configs 将抓取地址从 :10250 替换为 :9100。
  • kubernetes-node-cadvisor:抓取 kubernetes 节点的 cadvisor 指标,通过 kubernetes 的服务发现配置和 tls 配置,以及 relabel_configs 对地址和路径进行替换和重写。
  • kubernetes-apiserver:抓取 kubernetes api server 的指标,通过 kubernetes 的服务发现配置和 tls 配置,以及 relabel_configs 保留相关标签。
  • kubernetes-service-endpoints:抓取 kubernetes 服务的指标,通过 kubernetes 的服务发现配置和 relabel_configs 对地址、路径和标签进行替换和重写。
  • 每个抓取目标配置中都包含了 kubernetes_sd_configs,用于从 kubernetes 中发现相应的目标,以及 relabel_configs,用于对抓取地址、标签等进行转换和处理。

创建configmap

[root@master ~]# kubectl  apply -f prometheus-config.yaml

 编写部署prometheus server的yaml文件

[root@master ~]# vim prometheus-deploy.yaml 
---
apiversion: apps/v1
kind: deployment
metadata:
  name: prometheus-server
  namespace: prometheus
  labels:
    app: prometheus
spec:
  replicas: 1
  selector:
    matchlabels:
      app: prometheus
      component: server
    #matchexpressions:
    #- {key: app, operator: in, values: [prometheus]}
    #- {key: component, operator: in, values: [server]}
  template:
    metadata:
      labels:
        app: prometheus
        component: server
      annotations:
        prometheus.io/scrape: 'false'
    spec:
      nodename: node1
      serviceaccountname: prometheus
      containers:
      - name: prometheus
        image: prom/prometheus:v2.51.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:
        - mountpath: /etc/prometheus
          name: prometheus-config
        - mountpath: /prometheus/
          name: prometheus-storage-volume
      volumes:
        - name: prometheus-config
          configmap:
            name: prometheus-config
        - name: prometheus-storage-volume
          hostpath:
           path: /data
           type: directory

部署prometheus server

[root@master ~]# kubectl apply -f  prometheus-deploy.yaml

查看pod状态

4、创建service

为prometheus server创建一个service,用于我们外部访问

[root@master ~]# vim prometheus-svc.yaml 
#输入如下内容
apiversion: v1
kind: service
metadata:
  name: prometheus
  namespace: prometheus
  labels:
    app: prometheus
spec:
  type: nodeport
  ports:
    - port: 9090
      targetport: 9090
      protocol: tcp
  selector:
    app: prometheus
    component: server

 创建service

[root@master ~]# kubectl apply -f  prometheus-svc.yaml

查看service的nodeport端口

四、访问测试

在浏览器输入node ip + service端口 

点击status并点击targets,如果能显示下面的内容,说明监控数据采集成功 

目前采集的目录并不适合直接阅读,还需要配合grafana进行数据的展示,关于grafana,我们将在后期的章节中介绍

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com