2-Prometheus安装

熊 0 阅读 监控平台

Prometheus监控可以通过不同的方式安装部署 , 但是实际生产环境只需要根据实际需求选择其中一种方式部署即可 , 无论使用哪一种方式安装部署的prometheus server , 使用方式都是一样的 , 这里以二进制安装环境为例 ,

部署方式包括以下几种 :

  1. 官方二进制下载及安装 , prometheus server的监听端口为9090 链接:https://prometheus.io/download/

  2. docker镜像直接启动 链接:https://prometheus.io/docs/prometheus/latest/installation/

  3. operator部署 链接:https://github.com/coreos/kube-prometheus

  4. 使用apt或者yum安装

    apt install prometheus

1. 容器部署

1.1 Docker部署prometheus

参考文档 :

Installation | Prometheus

安装 | prometheus 中文文档 (gitbook.io)

  1. 准备一台机器, 并安装对应的容器环境

  2. 这个镜像在国外, 需要先提前下载好对应镜像并运行以下命令

    docker run -p 9090:9090 prom/prometheus
    ​
    root@k8s-master01:/opt/k8s-data/yaml/cbear/wordpress# nerdctl run -p 9090:9090 harbor.cbear.top/cbear/promethues:v2.53.0
    image-20240621141836765
  3. 容器拉起以后,访问prometheus:192.168.71.29:9090

    image-20240621142039679
  4. 查看目标主机数据

    image-20240621142223326
  5. 由于没有配置 , 只能看到本机

    image-20240621142322019

1.2 Operator 部署prometheus

这种部署方式要求在k8s集群内部进行部署 , 并且对k8s版本有要求 , 因此在部署之前要查看版本兼容性。

github链接 : https://github.com/prometheus-operator/kube-prometheus

版本兼容性

image-20240621142919013

1.2.1 安装步骤

  1. 从github clone代码到本地

    git clone https://github.com/prometheus-operator/kube-prometheus.git
  2. 进入目录执行命令部署prometheus

    cd kube-prometheus/
    kubectl apply --server-side -f manifests/setup
    kubectl apply -f manifests/ 

    该目录下部分yaml文件中镜像为谷歌镜像仓库 , 在国外 , 需要先下载到本地仓库。主要涉及到以下镜像

    需要修改kubeStateMetrics-deployment.yaml中镜像image: registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.12.0

    ./prometheusAdapter-deployment.yaml中的镜像image: registry.k8s.io/prometheus-adapter/prometheus-adapter:v0.12.0

    ./grafana-deployment.yaml中的镜像: grafana/grafana:11.0.0

1.2.2 验证pod状态

查看pod状态

root@k8s-master01:~# kubectl get pods -n monitoring
NAME                                   READY   STATUS    RESTARTS   AGE
alertmanager-main-0                    2/2     Running   0          20m
alertmanager-main-1                    2/2     Running   0          20m
alertmanager-main-2                    2/2     Running   0          20m
blackbox-exporter-6f7486b9bc-wj9m8     3/3     Running   0          20m
grafana-689bdff9bd-5twcx               1/1     Running   0          20m
kube-state-metrics-db78c658b-pvhvx     3/3     Running   0          20m
node-exporter-7tj5h                    2/2     Running   0          20m
node-exporter-b2s5w                    2/2     Running   0          20m
node-exporter-mhxxz                    2/2     Running   0          20m
node-exporter-nbqsb                    2/2     Running   0          20m
node-exporter-rjp2v                    2/2     Running   0          20m
node-exporter-vz6tn                    2/2     Running   0          20m
prometheus-adapter-565d47b78-72nxm     1/1     Running   0          20m
prometheus-adapter-565d47b78-qzb2h     1/1     Running   0          20m
prometheus-k8s-0                       2/2     Running   0          20m
prometheus-k8s-1                       2/2     Running   0          20m
prometheus-operator-8454b55656-7j9xc   2/2     Running   0          20m
​

1.2.3 通过nodeport访问prometheus

prometheus的service部署时都是clusterIP , 如果想要从集群外部访问 , 就需要修改prometheus的service为nodeport , 把端口暴露出去

  1. 这里需要修改目录下的文件prometheus-service.yaml

    root@k8s-master01:/opt/k8s-data/yaml/cbear/promethues/kube-prometheus-main/manifests# cat prometheus-service.yaml 
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app.kubernetes.io/component: prometheus
        app.kubernetes.io/instance: k8s
        app.kubernetes.io/name: prometheus
        app.kubernetes.io/part-of: kube-prometheus
        app.kubernetes.io/version: 2.52.0
      name: prometheus-k8s
      namespace: monitoring
    spec:
      type: NodePort                                   #添加NodePort类型 , 主动暴露端口
      ports:
      - name: web
        port: 9090
        targetPort: web
        nodePort: 30090                                #指定暴露的端口号 , 主要范围要在30000-65000之间
      - name: reloader-web
        port: 8080
        targetPort: reloader-web
      selector:
        app.kubernetes.io/component: prometheus
        app.kubernetes.io/instance: k8s
        app.kubernetes.io/name: prometheus
        app.kubernetes.io/part-of: kube-prometheus
      sessionAffinity: ClientIP
    ​

  2. 重新启用该资源文件

    kubectl apply -f prometheus-service.yaml 
  3. 查看service , 可以看到service类型变为NodePort , 而且会在宿主机随机监听30090端口

    image-20240622210846909

1.2.4 通过nodeport访问grafana

grafana的service部署时clusterIP类型 , 如果想要从集群外部访问 , 就需要修改grafana的service为nodeport , 把端口暴露出去。通过指定端口把grafana的端口暴露到集群外部。

  1. 编写yaml文件

    root@k8s-master01:/opt/k8s-data/yaml/cbear/promethues/kube-prometheus-main/manifests# cat grafana-service.yaml 
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app.kubernetes.io/component: grafana
        app.kubernetes.io/name: grafana
        app.kubernetes.io/part-of: kube-prometheus
        app.kubernetes.io/version: 11.0.0
      name: grafana
      namespace: monitoring
    spec:
      type: NodePort                                          #指定NodePort类型 , 主动暴露端口
      ports:
      - name: http
        port: 3000
        nodePort: 30030                                      #指定暴露的端口号 , 主要范围要在30000-65000之间
        targetPort: http
      selector:
        app.kubernetes.io/component: grafana
        app.kubernetes.io/name: grafana
        app.kubernetes.io/part-of: kube-prometheus
  2. 启用对应资源文件

    kubectl apply -f grafana-service.yaml
  3. 查看对应service, 可以看到service类型变为NodePort ,而且会在宿主机随机监听30030端口

    image-20240622212641308

1.2.5 调成网络策略

这里需要注意, 如果网络插件配置为calico ,这里安装的网络策略会生效。之后即使调整了service的访问类型, 也无法直接从外部访问端口时访问对应的容器。因此需要修改网络策略, 以方便外部访问对应服务

  • 修改prometheus-networkPolicy.yaml

    root@k8s-master01:/opt/k8s-data/yaml/cbear/promethues/kube-prometheus-main/manifests# cat prometheus-networkPolicy.yaml 
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      labels:
        app.kubernetes.io/component: prometheus
        app.kubernetes.io/instance: k8s
        app.kubernetes.io/name: prometheus
        app.kubernetes.io/part-of: kube-prometheus
        app.kubernetes.io/version: 2.52.0
      name: prometheus-k8s
      namespace: monitoring
    spec:
      egress:
      - {}
      ingress:
      - from:
        - podSelector:
            matchLabels:
              app.kubernetes.io/name: prometheus
        ports:
        - port: 9090
          protocol: TCP
        - port: 8080
          protocol: TCP
      - from:
        - podSelector:
            matchLabels:
              app.kubernetes.io/name: prometheus-adapter
        ports:
        - port: 9090
          protocol: TCP
      - from:
        - podSelector:
            matchLabels:
              app.kubernetes.io/name: grafana
        ports:
        - port: 9090
          protocol: TCP
      - from:                               #这里是单独增加的IP地址和端口, 
        - ipBlock:                          # 这几行均为单独增加内容
            cidr: 172.20.0.0/16             #
        - ipBlock:                          #
            cidr: 192.168.71.0/24           #
        ports:                              #
        - port: 9090                        #
          protocol: TCP                     #  
      podSelector:
        matchLabels:
          app.kubernetes.io/component: prometheus
          app.kubernetes.io/instance: k8s
          app.kubernetes.io/name: prometheus
          app.kubernetes.io/part-of: kube-prometheus
      policyTypes:
      - Egress
      - Ingress
  • 修改grafana-networkPolicy.yaml文件

    root@k8s-master01:/opt/k8s-data/yaml/cbear/promethues/kube-prometheus-main/manifests# cat grafana-networkPolicy.yaml 
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      labels:
        app.kubernetes.io/component: grafana
        app.kubernetes.io/name: grafana
        app.kubernetes.io/part-of: kube-prometheus
        app.kubernetes.io/version: 11.0.0
      name: grafana
      namespace: monitoring
    spec:
      egress:
      - {}
      ingress:
      - from:
        - podSelector:
            matchLabels:
              app.kubernetes.io/name: prometheus
        ports:
        - port: 3000
          protocol: TCP
      - from:                                       #这里是单独增加的IP地址段和端口
        - ipBlock:                                  # 以下为新增内容
            cidr: 192.168.71.0/24                   #
        - ipBlock:                                  #
            cidr: 172.20.0.0/16                     #      
        ports:                                      #
        - port: 3000                                #
          protocol: TCP                             #
      podSelector:
        matchLabels:
          app.kubernetes.io/component: grafana
          app.kubernetes.io/name: grafana
          app.kubernetes.io/part-of: kube-prometheus
      policyTypes:
      - Egress
      - Ingress

这里有个点需要注意就是这里IP段的设置。其中192.168.71.0/24这个网段是客户端地址段。172.20.0.0/16为pod分配的地址IP段。这里有之所以设置两个IP地址段是因为kubernetes的pod访问的两种方式。一种是外部访问的IP:port对应的pod 就在IP所在的服务器上面。此例中, 如果访问192.168.71.35:30030这个对应的grafana容器。如果这个grafana容器本身在192.168.71.35这个节点中,这里生效的网络策略的地址段为192.168.71.0/24这个段。如果这里的pod在其他节点上面, 这里生效的便是172.20.0.0/16这个段网络策略。

192.168.71.0/24这个段的网络策略很容易理解。之所以存在172.20.0.0/16这个段。是因为calico在跨节点访问的时候 , 使用的是隧道模式进行的网络通信。

隧道模式本身会有一层封装。同时这里192.168.71.35节点收到对应请求时,由于pod不在node01节点上面, 因此节点1会通过service服务知道了后端pod的IP , 会发送请求到pod 所在的 node02上面。 这个过程会通过封装的方式从node01发送到node02上面。因此这个过程的源IP为172.20.0.0这个网段。

kubernetes-prometheus-explain-network-1

如果按照上面的networkPolicy配置本身就可以了。另外 , 可以用以下类似的networkPolicy同样可以达到效果

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  labels:
    app.kubernetes.io/component: grafana
    app.kubernetes.io/name: grafana
    app.kubernetes.io/part-of: kube-prometheus
    app.kubernetes.io/version: 11.0.0
  name: grafana
  namespace: monitoring
spec:
  egress:
  - {}
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app.kubernetes.io/name: prometheus
    ports:
    - port: 3000
      protocol: TCP
  - from:                       #以下配置如下
    - ipBlock:                  #允许所有IP可以访问
        cidr: 0.0.0.0/0         #
  podSelector:
    matchLabels:
      app.kubernetes.io/component: grafana
      app.kubernetes.io/name: grafana
      app.kubernetes.io/part-of: kube-prometheus
  policyTypes:
  - Egress
  - Ingress

#允许所有IP访问指定的3000端口
root@k8s-master01:/opt/k8s-data/yaml/cbear/promethues/kube-prometheus-main/manifests# cat grafana-networkPolicy.yaml 
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  labels:
    app.kubernetes.io/component: grafana
    app.kubernetes.io/name: grafana
    app.kubernetes.io/part-of: kube-prometheus
    app.kubernetes.io/version: 11.0.0
  name: grafana
  namespace: monitoring
spec:
  egress:
  - {}
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app.kubernetes.io/name: prometheus
    ports:
    - port: 3000
      protocol: TCP
  - ports:               #配置端口如下
    - port: 3000         #允许所有IP可以访问3000端口
      protocol: TCP      #
  podSelector:
    matchLabels:
      app.kubernetes.io/component: grafana
      app.kubernetes.io/name: grafana
      app.kubernetes.io/part-of: kube-prometheus
  policyTypes:
  - Egress
  - Ingress

1.2.6 通过ingress服务部署

可以通过修改service类型的方式访问对应的prometheus。另外可以通过部署ingress服务的方式实现对内部服务的访问。

参考链接: Operator部署 - 云原生监控神器Prometheus

  • 部署ingress control

    kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.10.1/deploy/static/provider/cloud/deploy.yaml
  • 部署prometheus-ingress

    root@k8s-master01:/opt/k8s-data/yaml/cbear/promethues/kube-prometheus-main/manifests# cat prometheus-ingress.yaml 
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: prometheus-ingress
      namespace: monitoring
      annotations:
        nginx.ingress.kubernetes.io/affinity: cookie
        nginx.ingress.kubernetes.io/session-cookie-name: "prometheus-cookie"
        nginx.ingress.kubernetes.io/ssl-redirect: "false"
        certmanager.k8s.io/cluster-issuer: "letsencrypt-local"
        kubernetes.io/tls-acme: "false"
    spec:
      ingressClassName: nginx
      rules:
      - host: prom.cbear.top
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: prometheus-k8s
                port:
                  number: 9090         
      tls:
      - hosts:
          - prom.cbear.top
  • 部署grafana-networkPolicy.yaml

    root@k8s-master01:/opt/k8s-data/yaml/cbear/promethues/kube-prometheus-main/manifests# cat grafana-networkPolicy.yaml 
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      labels:
        app.kubernetes.io/component: grafana
        app.kubernetes.io/name: grafana
        app.kubernetes.io/part-of: kube-prometheus
        app.kubernetes.io/version: 11.0.0
      name: grafana
      namespace: monitoring
    spec:
      egress:
      - {}
      ingress:
      - from:
        - podSelector:
            matchLabels:
              app.kubernetes.io/name: prometheus
        ports:
        - port: 3000
          protocol: TCP
      podSelector:
        matchLabels:
          app.kubernetes.io/component: grafana
          app.kubernetes.io/name: grafana
          app.kubernetes.io/part-of: kube-prometheus
          app.kubernetes.io/name: ingress-nginx
      policyTypes:
      - Egress
      - Ingress
  • 部署alertmanager

    cat alertmanager-service.yaml
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: alertmanager-ingress
      namespace: monitoring
      annotations:
        nginx.ingress.kubernetes.io/affinity: cookie
        nginx.ingress.kubernetes.io/session-cookie-name: "alert-cookie"
        nginx.ingress.kubernetes.io/ssl-redirect: "false"
        kubernetes.io/ingress.class: nginx
        certmanager.k8s.io/cluster-issuer: "letsencrypt-local"
        kubernetes.io/tls-acme: "false"
    spec:
      rules:
      - host: alert.awslabs.cn
        http:
          paths:
          - path: /
            backend:
              serviceName: alertmanager-main
              servicePort: web
      tls:
      - hosts:
          - alert.awslabs.cn
        #secretName: alertmanager-tls

这里由于有networkPolicy的限制。可以按照以下方式修改networkPolicy

  • 修改prometheus-networkPolicy

    root@k8s-master01:/opt/k8s-data/yaml/cbear/promethues/kube-prometheus-main/manifests# cat prometheus-networkPolicy.yaml 
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      labels:
        app.kubernetes.io/component: prometheus
        app.kubernetes.io/instance: k8s
        app.kubernetes.io/name: prometheus
        app.kubernetes.io/part-of: kube-prometheus
        app.kubernetes.io/version: 2.52.0
      name: prometheus-k8s
      namespace: monitoring
    spec:
      egress:
      - {}
      ingress:
      - from:
        - podSelector:
            matchLabels:
              app.kubernetes.io/name: prometheus
        ports:
        - port: 9090
          protocol: TCP
        - port: 8080
          protocol: TCP
      - from:
        - podSelector:
            matchLabels:
              app.kubernetes.io/name: prometheus-adapter
        ports:
        - port: 9090
          protocol: TCP
      - from:
        - podSelector:
            matchLabels:
              app.kubernetes.io/name: grafana
        ports:
        - port: 9090
          protocol: TCP
      podSelector:
        matchLabels:
          app.kubernetes.io/component: prometheus
          app.kubernetes.io/instance: k8s
          app.kubernetes.io/name: prometheus
          app.kubernetes.io/part-of: kube-prometheus
          app.kubernetes.io/name: ingress-nginx                      #添加该行
      policyTypes:
      - Egress
      - Ingress
  • 修改grafana-networkPolicy.yaml

    root@k8s-master01:/opt/k8s-data/yaml/cbear/promethues/kube-prometheus-main/manifests# cat grafana-networkPolicy.yaml 
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      labels:
        app.kubernetes.io/component: grafana
        app.kubernetes.io/name: grafana
        app.kubernetes.io/part-of: kube-prometheus
        app.kubernetes.io/version: 11.0.0
      name: grafana
      namespace: monitoring
    spec:
      egress:
      - {}
      ingress:
      - from:
        - podSelector:
            matchLabels:
              app.kubernetes.io/name: prometheus
        ports:
        - port: 3000
          protocol: TCP
      podSelector:
        matchLabels:
          app.kubernetes.io/component: grafana
          app.kubernetes.io/name: grafana
          app.kubernetes.io/part-of: kube-prometheus
          app.kubernetes.io/name: ingress-nginx                              #添加该行
      policyTypes:
      - Egress
      - Ingress

之后直接通过浏览器访问对应域名即可。域名解析地址为kubernetes集群中的所有节点

2. 软件部署

2.1 软件包部署

针对CentOS/Ubuntu系统。可以使用yum/apt命令安装软件。这里可以在github中寻找对应安装安装源

对于rpm包而言。参考github链接: lest/prometheus-rpm: Prometheus RPM Packages (github.com)

  1. yum源配置如下

    [root@test ~]# cat /etc/yum.repos.d/prometheus.repo 
    [prometheus]
    name=prometheus
    baseurl=https://packagecloud.io/prometheus-rpm/release/el/$releasever/$basearch
    repo_gpgcheck=1
    enabled=1
    gpgkey=https://packagecloud.io/prometheus-rpm/release/gpgkey
           https://raw.githubusercontent.com/lest/prometheus-rpm/master/RPM-GPG-KEY-prometheus-rpm
    gpgcheck=1
    metadata_expire=300
  2. 安装prometheus

    [root@test ~]# yum install prometheus
  3. 启动prometheus服务

    [root@test ~]# systemctl start prometheus
  4. 通过网页访问对应的页面

    image-20240623171145651

注 : ubuntu中默认已经配置好了对应的prometheus源信息直接使用apt install prometheus即可

2.2 二进制安装

环境准备: 准备机器用于部署prometheus监控

prometheus01 192.168.71.47
prometheus02 192.168.71.49
prometheus03 192.168.71.54

普通node节点

node01 192.168.71.55
node02 192.168.71.56
node03 192.168.71.57

2.2.1 基础安装

  1. 下载对应安装包

    root@prometheus01:~# wget https://github.com/prometheus/prometheus/releases/download/v2.53.0/prometheus-2.53.0.linux-amd64.tar.gz
  2. 解压安装包并作软链接

    root@prometheus01:~# tar -xf prometheus-2.53.0.linux-amd64.tar.gz -C /usr/local/src/
    root@prometheus01:~# ln -sv /usr/local/src/prometheus-2.53.0.linux-amd64 /usr/local/src/prometheus
    '/usr/local/src/prometheus' -> '/usr/local/src/prometheus-2.53.0.linux-amd64'
  3. 查看解压后的文件

    root@prometheus01:~# ll /usr/local/src/prometheus/
    total 261328
    drwxr-xr-x 4 1001  127      4096 Jun 19 07:55 ./
    drwxr-xr-x 3 root root      4096 Jun 23 10:15 ../
    drwxr-xr-x 2 1001  127      4096 Jun 19 07:52 console_libraries/
    drwxr-xr-x 2 1001  127      4096 Jun 19 07:52 consoles/
    -rw-r--r-- 1 1001  127     11357 Jun 19 07:52 LICENSE
    -rw-r--r-- 1 1001  127      3773 Jun 19 07:52 NOTICE
    -rwxr-xr-x 1 1001  127 137821861 Jun 19 07:40 prometheus*
    -rw-r--r-- 1 1001  127       934 Jun 19 07:52 prometheus.yml
    -rwxr-xr-x 1 1001  127 129737825 Jun 19 07:40 promtool*
  4. 检查配置文件是否存在文件

    root@prometheus01:~# cd /usr/local/src/prometheus
    root@prometheus01:/usr/local/src/prometheus# ./promtool check config ./prometheus.yml
    Checking ./prometheus.yml
     SUCCESS: ./prometheus.yml is valid prometheus config file syntax
  5. 查看对应prometheus配置文件

    root@prometheus01:/usr/local/src/prometheus# cat ./prometheus.yml 
    # my global config
    global:                       #全局配置
      scrape_interval: 15s        #数据收集的间隔为15秒 , 如果不配置则默认为1分钟
      evaluation_interval: 15s    #规则扫描时间 , 即每隔15秒检查规则(即rule_files)是否发生变化 , 如果不配置则默认为1分钟
      # scrape_timeout is set to the global default (10s).
    
    # Alertmanager configuration
    alerting:                      #告警配置
      alertmanagers:
        - static_configs:
            - targets:
              # - alertmanager:9093    #指定altermanager服务器 , 该主机用于将告警发送给邮件服务器、钉钉、微信等。
    
    # Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
    rule_files:                        #告警规则 , 通过yaml文件配置告警规则
      # - "first_rules.yml"
      # - "second_rules.yml"
    
    # A scrape configuration containing exactly one endpoint to scrape:
    # Here it's Prometheus itself.
    scrape_configs:                    #数据抓取配置 , 分为静态配置和动态发现
      # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
      - job_name: "prometheus"        #列表形式 , 用来分组 , 可以添加多个job_name对不同主机进行监控
    
        # metrics_path defaults to '/metrics'
        # scheme defaults to 'http'.
    
        static_configs:               #静态配置
          - targets: ["localhost:9090"]     #目标主机 , 可以配置多个主机 , 也可以通过列表形式配置
  6. 通过执行prometheus可执行程序启动

    root@prometheus01:/usr/local/src/prometheus# ./prometheus 
  7. 创建service文件

    [Unit]
    Description=Prometheus Server
    Documentation=https://prometheus.io/docs/introduction/overview/
    After=network.target
    
    [Service]
    Restart=on-failure
    WorkingDirectory=/usr/local/src/prometheus
    ExecStart=/usr/local/src/prometheus/prometheus --config.file=/usr/local/src/prometheus/prometheus.yml  
    
    [Install]
    WantedBy=multi-user.target

    启动prometheus服务并设置为开机自启动

    root@prometheus01:/usr/local/src/prometheus# systemctl daemon-reload
    
    root@prometheus01:/usr/local/src/prometheus# systemctl enable --now prometheus
    Created symlink /etc/systemd/system/multi-user.target.wants/prometheus.service → /etc/systemd/system/prometheus.service.

    至此已经配置完成

2.2.2 配置动态(热)加载

动态记载指修改prometheus配置文件后无需重启prometheus服务会自动加载

  1. 在ExecStart最后加上 --web.enable-lifecycle参数 ,即:

    root@prometheus01:/usr/local/src/prometheus# systemctl cat prometheus
    # /etc/systemd/system/prometheus.service
    [Unit]
    Description=Prometheus Server
    Documentation=https://prometheus.io/docs/introduction/overview/
    After=network.target
    
    [Service]
    Restart=on-failure
    WorkingDirectory=/usr/local/src/prometheus
    ExecStart=/usr/local/src/prometheus/prometheus --config.file=/usr/local/src/prometheus/prometheus.yml --web.enable-lifecycle 
    
    [Install]
    WantedBy=multi-user.target
  2. 配置完成后重启服务使配置生效

    root@prometheus01:/usr/local/src/prometheus# systemctl daemon-reload
    root@prometheus01:/usr/local/src/prometheus# systemctl restart   prometheus
  3. 使用以下命令即可实现配置动态加载

    root@prometheus01:/usr/local/src/prometheus# curl -X POST http://192.168.71.47:9090/-/reload
  4. 访问prometheus , 浏览器输入 : 192.168.71.47:9090

    image-20240623195458926
  5. 查看Target, 目前只有prometheus自身监控

    image-20240623195555520

2.2.3 在Prometheus添加监控主机

在prometheus配置文件/usr/local/src/prometheus/prometheus.yml中添加主机192.168.71.55

root@prometheus01:/usr/local/src/prometheus# cat prometheus.yml 
# my global config
global:
  scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
......

    static_configs:
      - targets: ["localhost:9090", "192.168.71.55:9100"]

修改完成后需要重启服务 , 配置才能生效 , 这里使用热加载命令 , 无需重启服务

root@prometheus01:/usr/local/src/prometheus# curl -X POST http://192.168.71.47:9090/-/reload

查看监控页面 , 192.168.71.55已经添加成功 , 不过由于该主机没有安装node-exporter , 状态显示异常 , 这是正常现象

image-20240623200522469

2.3. 二进制安装node-exporter

k8s各node节点使用二进制或者daemonset方式安装node_exporter , 用于收集各k8s node节点宿主机的监控指标数据 , 默认监听端口为9100。(类似于zabbix的agent) 需要注意的是 , node-exporter只能用来收集物理机、虚拟机或k8s集群中node节点的数据 , 不能用来收集容器的数据 , 容器数据的收集由其他组件来完成。

2.3.1 基础安装步骤

  1. 下载二进制软件包。软件官方下载地址: Download | Prometheus

    root@ndoe01:~# wget https://github.com/prometheus/node_exporter/releases/download/v1.8.1/node_exporter-1.8.1.linux-amd64.tar.gz
  2. 解压并作软链接

    root@ndoe01:~# ln -sv /usr/local/src/node_exporter-1.8.1.linux-amd64/ /usr/local/src/node_exporter
    '/usr/local/src/node_exporter' -> '/usr/local/src/node_exporter-1.8.1.linux-amd64/'
    root@ndoe01:~# ll /usr/local/src/
    total 12
    drwxr-xr-x  3 root root 4096 Jun 23 12:14 ./
    drwxr-xr-x 10 root root 4096 Feb 16 18:37 ../
    lrwxrwxrwx  1 root root   47 Jun 23 12:14 node_exporter -> /usr/local/src/node_exporter-1.8.1.linux-amd64//
    drwxr-xr-x  2 1001 1002 4096 May 21 18:41 node_exporter-1.8.1.linux-amd64/
  3. 创建对应的service服务文件

    root@ndoe01:~# cat /etc/systemd/system/node-exporter.service
    [Unit]
    Description=Prometheus Node Exporter
    After=network.target
    
    [Service]
    ExecStart= /usr/local/src/node_exporter/node_exporter
    
    [Install]
    WantedBy=multi-user.target
  4. 启动node-exporter服务

    root@ndoe01:~# systemctl daemon-reload
    root@ndoe01:~# systemctl start node-exporter
    root@ndoe01:~# systemctl enable --now node-exporter
    Created symlink /etc/systemd/system/multi-user.target.wants/node-exporter.service → /etc/systemd/system/node-exporter.service.
  5. 查看prometheus监控页面targets , 状态变为up

    初次添加主机 , 状态可能会显示为unknown状态 , 这是因为prometheus间隔15s才会抓取node-exporter数据 , 等待15s后刷新即可

    image-20240623202052102

    在浏览器访问192.168.71.55:9100 , 这里是node-exporter收集目标主机的所有数据

    image-20240623202215733

    点击Metrics按钮 , 可以查看收集到的所有数据

    image-20240623202310959
  6. node_export常见指标

    node_boot_time:系统⾃启动以后的总结时间 , 即取uptime的值 , 以秒为单位
    node_cpu:系统CPU使⽤量
    node_disk*:磁盘IO
    node_filesystem*:系统⽂件系统⽤量 , 即分区的磁盘使用量
    node_load1:系统CPU负载
    node_memeory*:内存使⽤量
    node_network*:⽹络带宽指标
    node_time:当前系统时间
    go_*:node exporter中go相关指标
    process_*:node exporter⾃身进程相关运⾏指标
  7. 其他两个node节点配置node_export

  8. 配置prometheus服务节点

    root@prometheus01:/usr/local/src/prometheus# cat prometheus.yml 
    # my global config
    global:
      scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
      evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
      # scrape_timeout is set to the global default (10s).
    
    .....
    scrape_configs:
      # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
      - job_name: "prometheus"
    
        # metrics_path defaults to '/metrics'
        # scheme defaults to 'http'.
    
        static_configs:
          - targets: ["localhost:9090", "192.168.71.55:9100"]
      - job_name: "prometheus-node"
        static_configs:
          - targets: ["192.168.71.55:9100", "192.168.71.56:9100","192.168.71.57:9100"]   
  9. 重启prometheus服务 , 之后网页访问

    root@prometheus01:/usr/local/src/prometheus# curl -X POST http://192.168.71.47:9090/-/reload
    image-20240623205142653
  10. 查看监控数据

    点击左上角prometheus图标 , 返回prometheus首页 , 在搜索框输入关键字

    image-20240623205252994

    比如输入node , 会自动出现很多选项可以选择

    image-20240623205342983

    如果查看负载 , 输入node_load , 选择node_load1 , 查看1分钟负载情况 , 点击右侧Execute执行查询。获得数据

    image-20240623205505641

    点击Graph , 查看图形

    image-20240623205612612

3. grafana安装

grafana是一个可视化组件 , 用于接收客户端浏览器的请求并连接到prometheus查询数据 , 最后经过渲染并在浏览器进行体系化显示 , 需要注意的是 , grafana查询数据类似于zabbix一样需要自定义模板 , 模板可以手动制作也可以导入已有模板。

3.1 基本安装

官网链接:https://grafana.com/ 模板下载:https://grafana.com/grafana/dashboards/

prometheus-grafana-install-1

  1. 获取对应安装包

    image-20240623220823874

    按照官网给的命令安装对应grafana软件

    root@grafana:~# sudo apt-get install -y adduser libfontconfig1 musl
    root@grafana:~# wget https://dl.grafana.com/enterprise/release/grafana-enterprise_11.0.0_amd64.deb
    root@grafana:~# sudo dpkg -i grafana-enterprise_11.0.0_amd64.deb
  2. 启动对应服务

    root@grafana:~# systemctl start grafana-server
  3. 登录grafana: 192.168.71.49:3000, 用户名密码:admin/admin

    image-20240623221215025
  4. 添加数据源

    通过配置数据源 , grafana可以查询prometheus数据 , 在后续监控模板的配置中 , 监控模板通过与数据源关联 , 显示监控数据

    • 点击左侧导航栏 , 选择Data source

      image-20240623221350703
      image-20240623221454989
      image-20240623221522388
    • 配置名称 , 用以区分不同的k8s集群;然后添加prometheus的地址和端口 , 其他保持默认即可。这里prometheus的IP指定二进制安装的prometheus。即192.168.71.47

      image-20240623222122283

      之后点击Save& test

      image-20240623222004648

3.2 Grafana导入模板

  1. 获取模板

    在官网中搜索对应的Dashboards ,Grafana dashboards | Grafana Labs

    image-20240623224017538
    image-20240623224125935
  2. 在左侧进行数据源过滤 , 选择prometheus , 然后在搜索框搜索想要的模板

    image-20240623224847896
  3. 点击进入第一个模板 , 可以看到依赖的grafana和k8s版本 , 模板id为1860(在线导入模板时 ,需要该id)

    image-20240623225046311
  4. 导入模板

    导入方式有两种 :

    方法一是通过模板id在线下载导入模板 方法二是离线安装:如果不能联网 , 则可以在可以联网的电脑上下载json文件 , 然后将文件导入grafana

    • 在线下载导入模板

      • 在Dashboard中点击import

        image-20240623225344892
      • 在下方框内输入模板id , 然后点击右侧load , 等待下载完成

        image-20240623225606894
      • 下载完成后 , 进入下一页面 , 配置模板名称 , 选择数据源Prometheus-binary , 点击下方Import

        image-20240623225906432
      • 进入模板,可以查看相关数据

        image-20240623231004599
    • 如果不能联网,则可以通过下载监控模板文件,然后再导入的方式导入模板

      • 在grafana官网下载监控模板json文件

        image-20240623231211161
      • 在Dashboard页面中点击import

        image-20240623231436798
      • 点击Upload dashboard JSON file ,选择刚下载的json文件

        image-20240623231522493
      • 之后设置模板名和数据源。之后点击import即可

        image-20240623231701867
      • 查看导入dashboard

        image-20240623231836026


参考链接

二、部署Prometheus监控 - 袁党生博客 (yuandangsheng.top)