自学内容网 自学内容网

小阿轩yx-案例:Prometheus监控kubernetes环境构建

小阿轩yx-案例:Prometheus监控kubernetes环境构建

前言

  • 传统架构中比较流行的监控工具有 Zabbix、Nagios 等,这些监控工具对于 Kubernetes 这类云平台的监控不是很友好,特别是当 Kubernetes 集群中有了成千上万的容器后更是如此

基于 kubernetes 的 Prometheus 介绍

环境简介

  • node-exporter + prometheus + grafana 是一套非常流行的 Kubernetes 监控方案。

它们的功能

  • node-exporter:节点级指标导出工具,可以监控节点的 CPU、内存、磁盘、网络等指标,并暴露 Metrics 接口。
  • Prometheus:时间序列数据库和监控报警工具,可以抓取 Cadvisor 和 node-exporter 暴露的Metrics 接口,存储时序数据,并提供 PromQL 查询语言进行监控分析和报警。
  • Grafana:图表和 Dashboard 工具,可以査询 Prometheus 中的数据,并通过图表的方式直观展示 Kubernetes 集群的运行指标和状态。

监控流程

  • 在 Kubernetes 集群的每个节点安装 Cadvisor 和 node-exporter,用于采集容器和节点级指标数据。
  • 部署 Prometheus,配置抓取 Cadvisor 和 node-exporter 的 Metrics 接口,存储 containers 和nodes 的时序数据。
  • 使用 Grafana 构建监控仪表盘,选择 Prometheus 作为数据源,编写 PromQL 查询语句,展示K8S 集群的 CPU 使用率、内存使用率、网络流量等监控指标。
  • 根据监控结果,可以设置 Prometheus 的报警规则,当监控指标超过阈值时发送报警信息。这套方案能够全面监控 Kubernetes 集群的容器和节点,通过 Metrics 指标和仪表盘直观反映集群状态,并实现自动报警,非常适合 K8S 环境下微服务应用的稳定运行。

具体实现方案

  • node-exporter:在每个节点也作为 Daemonset 运行,采集节点 Metrics。
  • Prometheus:部署 Prometheus operator 实现,作为 Deployment 运行,用于抓取 Metrics 和报警。
  • Grafana:部署 Grafana Operator 实现,用于仪表盘展示。

Kubernetes 监控指标

K8S 本身的监控指标

  • CPU 利用率:包括节点 CPU 利用率、Pod CPU 利用率、容器 CPU 利用率等,用于监控 CPU 资源使用情况。
  • 内存利用率:包括节点内存利用率、Pod 内存利用率、容器内存利用率等,用于监控内存资源使用情况。
  • 网络流量:节点网络流量、Pod 网络流量、容器网络流量,用于监控网络收发包大小和带宽利用率。
  • 磁盘使用率:节点磁盘使用率,用于监控节点磁盘空间使用情况。
  • Pod 状态:Pod 的 Running、Waiting、succeeded、Failed 等状态数量,用于监控 Pod 运行状态。
  • 节点状态:节点的 Ready、NotReady 和 Unreachable 状态数量,用于监控节点运行状态。
  • 容器重启次数:单个容器或Pod 内所有容器的重启次数,用于监控容器稳定性。
  • API 服务指标:Kubernetes API Server 的请求 LATENCY、请求 QPS、错误码数量等,用于监控API Server 性能。
  • 集群组件指标:etcd、kubelet、kube-proxy 等组件的运行指标,用于监控组件运行状态。
  • 这些都是 Kubernetes集群运行状态的关键指标,通过Prometheus 等工具可以进行收集和存储,然后在 Grafana 中设计相应的 Dashboard 进行可视化展示。

当这些指标超出正常范围时,也可以根据阈值设置报警,保证 Kubernetes 集群和服务的稳定运行。

  • CPU 利用率超过 80%报警
  • 内存利用率超过 90%报警
  • 网络流量/磁盘空间突增报警
  • Pod/节点 NotReady 状态超过 10%报警
  • API Server 请求 LATENCY 超过 200ms 报警
  • etcd 节点 Down 报警等等

这些报警规则的设置需要根据集群大小和服务负载进行评估。

Prometheus 的安装

从 Github 克隆项目分支

https://github.com/prometheus-operator/kube-prometheus.git

  • release-0.10
root@k8s-master ~]# git clone -b release-0.10 https://github.com/prometheus-operator/kube-prometheus

安装 Prometheus Operator

  • Prometheus Operator 是 CoreOS 开源的项目,它提供了一种Kubernetes-native 的方式来运行和管理 Prometheus。
  • Prometheus operator 可以自动创建、配置和管理 Prometheus 实例,并将其与 Kubernetes 中的服务发现机制集成在一起,从而实现对 Kubernetes 集群的自动监控。

Prometheus 和 Prometheus Operator 的区别

  • Prometheus 是一种开源的监控系统,用于记录各种指标,并提供査询接口和告警机制。
  • PrometheusOperator 则是一种用于在 Kubernetes 上运行和管理 Prometheus 的解决方案。

相比于传统方式手动部署 Prometheus,Prometheus operator 可以自动创建、配置和管理 Prometheus 实例,并将其与Kubernetes 中的服务发现机制集成在一起,大幅简化了我们的工作量。

将镜像文件通过 Xftp 上传至 master、node01、node02三个节点(101、102、103)

将 kube-prometheus 文件单独上传至 master主节点(101)

开启会话同步

三台主机导入镜像

主机一(101)

[root@master ~]# cd images/
[root@master images]# bash imp_docker_img.sh

主机二(102)

[root@node01 ~]# cd images/
[root@node01 images]# bash imp_docker_img.sh

主机三(103)

[root@node02 ~]# cd images/
[root@node02 images]# bash imp_docker_img.sh

取消会话同步

进入 kube-prometheus 目录(在 master 节点)

[root@master ~]# cd kube-prometheus/

安装并应用服务

[root@master kube-prometheus]# kubectl apply --server-side -f manifests/setup

--server-side

  • 这个特性主要目标是把逻辑从 kubectl apply 移动到 kube-apiserver 中,这可以修复当前遇到的很多有关所有权冲突的问题。
  • 可以直接通过 API 完成声明式配置的操作,而无需依赖于特定的 kubectl apply 命令

如果要删除Prometheus Operator,可以使用下面的命令

kubectl delete --ignore-not-found=true -f manifests/setup

prometheus-operator 的作用主要是用来创建 prometheus 的相关资源以及监视与管理它创建出来的资源对象。

Operator 容器启动起来后安装 Prometheus Stack

[root@master kube-prometheus]# kubectl apply --server-side -f manifests/

删除 Prometheus stack

kubectl delete --ignore-not-found=true -f manifests/ -f manifests/setup
  • kube-prometheus-stack 是一个全家桶,提供监控告警组件 alert-manager、grafana 等子组件。

查看 Prometheus 容器的状态

[root@master kube-prometheus]# kubectl get pod -n monitoring
NAME                                  READY    STATUS    RESTARTS   AGE
alertmanager-main-0                   2/2      Running   0          79m
alertmanager-main-1                   2/2      Running   0          79m
alertmanager-main-2                   2/2      Running   0          79m
blackbox-exporter-746c64fd88-prn61    3/3      Running   0          87m
grafana-5fc7f9f55d-x4gv4              1/1      Running   0          87m
kube-state-metrics-6c8846558c-c6k55   3/3      Running   0          87m
node-exporter-hsr28                   2/2      Running   0          87m
node-exporter-tq7vv                   2/2      Running   0          87m
node-exporter-znsll                   2/2      Running   0          87m
prometheus-adapter-6455646bdc-99lgh   1/1      Running   0          87m
prometheus-adapter-6455646bdc-nxh5z   1/1      Running   0          87m
prometheus-k8s-0                      2/2      Running   0          79m
prometheus-k8s-1                      2/2      Running   0          79m
prometheus-operator-f59c8b954-hmtx8   2/2      Running   0          87m

查看servicemonitors

  • servicemonitors 定义了如何监控一组动态的服务,使用标签选择来定义哪些 Service 被选择进行监控。
  • 这可以让团队制定一个如何暴露监控指标的规范,然后按照这些规范自动发现新的服务,无需重新配置。
  • 为了让 Prometheus 监控 Kubernetes 内的任何应用,需要存在一个 Endpoints 对象,Endpoints 对象本质上是 IP 地址的列表,通常 Endpoints 对象是由 Service 对象来自动填充的,Service 对象通过标签选择器匹配 Pod,并将其添加到 Endpoints 对象中。
  • 一个 Service 可以暴露一个或多个端口,这些端口由多个 Endpoints 列表支持,这些端点一般情况下都是指向一个 Pod。
  • Prometheus operator 引入的这个 ServiceMonitor 对象就会发现这些 Endpoints 对象,并配置 Prometheus 监控这些 Pod,ServiceMonitorspec 的 endpoints 部分就是用于配置这些Endpoints的哪些端口将被 scrape 指标的。
  • Prometheus Operator 使用 ServiceMonitor 管理监控配置。

ServiceMonitor 的创建方法

[root@master kube-prometheus]# kubectl get servicemonitors
monitors    alertmanager-main          2m6s
monitors    blackbox-exporter          2m6s
monitors    coredns                    2m6s
monitors    grafana                    2m6s
monitors    kube-apiserver             2m6s
monitors    kube-controller-manager    2m6s
monitors    kube-scheduler             2m6s
monitors    kube-state-metrics         2m7s
monitors    kubelet                    2m6s
monitors    node-exporter              2m6s
monitors    prometheus-adapter         2m5s
monitors    prometheus-k8s             2m6s
monitors    prometheus-operator        2m5s

修改 grafana 的 service 的类型为 NodePort

默认的 type 为 ClusterIP 的类型

[root@master kube-prometheus]# kubectl edit svc grafana -n monitoring
spec:
  clusterIp: 10.107.64.140
  clusterIPs:
  - 10.107.64.140
  externalTrafficPolicy: cluster
  internalTrafficPolicy: cluster
  ipFamilies:
  - IPV4
  ipFamilyPolicy: singlestack
  ports:
  - name: http
    nodePort: 32082
    port: 3000
    protocol: TCP
    targetPort: http
  selector:
    app.kubernetes.io/component:grafana
    app.kubernetes.io/name:grafana
    app.kubernetes.io/part-of: kube-prometheus
  sessionAffinity: None
  type: NodePort
status :
  loadBalancer: {}
  • nodePort: 32082
  • type: NodePort

获取服务信息

[root@master kube-prometheus]# kubectl get svc grafana -n monitoring
NAME        TYPE        CLUSTER-IP     EXTERNAL-IP    PORT(S)            AGE
grafana     NodePort    10.99.26.98    <none>         3000:32082/TCP     28m

访问 grafana

  • http://192.168.10.101:32082

  • 默认的登录账号密码为 admin/admin,第一次登陆会提示修改密码,不想修改可以点击 skip 跳过

修改 Prometheus 的 Service 类型

  • 将 type 类型修改为 NodePort,默认的是 ClusterIP
[root@master kube-prometheus]# kubectl edit svc prometheus-k8s -n monitoring
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: "2023-04-05T03:49:40Z'
  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.32.1
  name: prometheus-k8s
  namespace: monitoring
  resourceVersion: "4615"
  uid: 9bdba2d2-a7e6-4bf2-9e3d-355d5e3de646
spec:
  clusterIp: 10.100.14.27
  clusterIPs:
  - 10.100.14.27
  externalTrafficPolicy: cluster
  internalTrafficPolicy: cluster
  ipFamilies:
  - IPV4
  ipFamilyPolicy: singlestack
  ports:
  - name: web
    nodePort: 32370
    port: 9090
    protocol: TCP
    targetPort: web
  - name: reloader-web
    nodePort: 31480
    port: 8080
    protocol: TCP
    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
  sessionAffinityConfig:
    clientIP:
      timeoutSeconds: 10800
  type: NodePort
status :
  loadBalancer: {}
  • nodePort: 32370
  • type: NodePort

获取 服务信息

[root@master kube-prometheus]# kubectl get svc grafana -n monitoring
NAME               TYPE        CLUSTER-IP       EXTERNAL-IP    PORT(S)            AGE
prometheus-k8s     NodePort    10.105.187.25    <none>         9090:32370/TCP     28m

访问 Prometheus

  • http://192.168.10.101:32370

查看监控目标

在 Prometheus 中一条告警规则有三个状态

  • inactive:还未被触发;
  • pending:已经触发,但是还未达到for 设定的时间;
  • firing:触发且达到设定时间。

配置 Grafana Dashboard

添加数据源

本案例中,grafana 已经有了 Prometheus 的数据源(1)(2)(3)步骤可以省去

添加数据源

  • 单击 Dashboards 按钮(四方块图标),选择 “Add your first data source”

数据源选择 Prometheus

  • 鼠标放到 Prometheus 上,选择最右侧的 “Select” 按钮

配置数据源

  • HTTP 配置项下的 URL 填写 “http://prometheus-k8s:9090”,这里的 prometheus 是 K8s 集群内的 Service 名,也可以使用 IP 地址代替
  • 然后点击页面底部的 “Save & Test” 按钮,保存并确定测试通过

通过 Node id 导入监控模板

  • 单击首页左侧搜索框下面的+的按钮
  • 选择 import 按钮,输入监控模板 id:13105
  • 单击 Load 按钮加载即可,最后单击 Import 按钮导入

  • 完成上述步骤后,可以査看到 Node 节点在 Dashbord 监控页面展示情况

其它模板

  • 可以去官网查找更丰富的模板

https://grafana.com/grafana/dashboards/

常见的模板有

Kubernetes cluster

  • 7249

Docker Registry

  • 9621

Docker and system monitoring

  • 893

K8S for Prometheus Dashboard 20211018中文版

  • 13105

Kubernetes Pods

  • 4686

Linux stats with Node Exporter

  • 14731

添加云原生监控项

  • 前面对 Prometheus 相关知识做了一定的了解,也理解了云原生和非云原生应用的监控流程。
  • 但是,在安装Prometheus 的时候,并没有对 ETCD 集群进行监控,ETCD 集群时 kubernetes的数据库,掌握着 kubernetes 最核心的数据,ETCD 的状态和性能直接影响 kubernetes 集群的状态,所以对 ETCD 集群的监控时非常重要的。
  • kubernetes 有一个Metrics 接口,可以直接获取内部的运行信息
  • 比如 ETCD 的内部数据可以通过 2379 的 Metrics 端口得到,和之前的 kubelet 类似。

不同的是,ETCD 对外的接口必须通过 HTTPS 访问,所以在请求时需要加上对应的证书。

创建 ETCD Service

[root@k8s-master kube-prometheus]# cat etcd-svc.yaml
apiVersion: v1
kind: Endpoints
metadata:
  labels:
    app: etcd-prom
  name: etcd-prom
  namespace: kube-system
subsets:
- addresses: 
  - ip: 192.168.10.101
  - ip: 192.168.10.102
  - ip: 192.168.10.103
  ports:
  - name: https-metrics
    port: 2379   # etcd端口
    protocol: TCP
---

apiVersion: v1
kind: Service 
metadata:
  labels:
    app: etcd-prom
  name: etcd-prom
  namespace: kube-system
spec:
  ports:
  - name: https-metrics
    port: 2379
    protocol: TCP
    targetPort: 2379
  type: ClusterIP
  • kubeadm 安装的 k8s 只有master节点上安装了 etcd。

创建 ETCD Service

[root@k8s-master kube-prometheus]# kubectl create -f etcd-svc.yaml

查看创建的 ETCD Service

[root@k8s-master kube-prometheus]# kubectl get svc n kube-system etcd-prom
NAME        TYPE        CLUSTER-IP        EXTERNAL-IP    PORT(S)    AGE
etcd-prom   ClusterIP   10.109.39.124     <none>         2379/TCP   36s

通过 ClusterIP 访问测试

[root@k8s-master kube-prometheus]# curl --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/etcd/healthcheck-client.crt --key /etc/kubernetes/pki/etcd/healthcheck-client.keyhttps://192.168.10.101:2379/metrics
  • ServiceMonitor 需要配置证书才能请求 ETCD的Metrics 接口。

创建 ETCD 证书的 Secret

[root@k8s-master kube-prometheus]# kubectl -n monitoring create secret generic etcd-certs --from-file=/etc/kubernetes/pki/etcd/ca.crt --from-file=/etc/kubernetes/pki/etcd/healthcheck-client.crt --from-file=/etc/kubernetes/pki/etcd/healthcheck-client.key
  • Secret 是Kubernetes 中的一种资源对象类型,用来保护感信息
  • 例如密码、令牌等信息,将这些信息放在 Secret 中是比较安全的做法。

修改 prometheus 资源,应用上一步创建的 secret

[root@k8s-master ~]# kubectl edit prometheus k8s -n monitoring
#添加内容(在末尾添加红色的两行)
serviceMonitorSelector: {}
version: 2.32.1
secrets:
- etcd-certs
  • secrets:
  • - etcd-certs

kubectl edit prometheus k8s -n monitoring

prometheus:资源对象类型

k8s资源对象名称

查看证书

[root@k8s-master kube-prometheus]# kubectl -n monitoring exec -it prometheus-k8s-0 -c prometheus -- sh
[root@k8s-master kube-prometheus]# ls /etc/prometheus/secrets/etcd-certs/
ca.crt    healthcheck-client.crt healthcheck-client.key
  • 需要等一小会才会看见这三个证书文件

创建 ETCD ServiceMonitor

[root@k8s-master kube-prometheus]# kubectl get pod -Agrep etcd
kube-system    etcd-k8s-master    1/1    Running    2(19m ago)    15d
[root@k8s-master kube-prometheus]# kubectl expose pod -n kube-systemetcd-k8s-master --name=etcd-k8s --port=2379 --target-port=2379

创建 service,并给 port 添加 name

  • 给名为 etcd-k8s 的 svc,添加 name 的声明
[root@k8s-master kube-prometheus]# kubectl -n kube-system edit svc etcd-k8s
apiVersion:v1
kind:Service
metadata :
  creationTimestamp: "2023-04-08T08:47:51Z"
  labels:
    component: etcd
    tier: control-plane
  name: etcd-k8s
  namespace: kube-system
  resourceVersion: "4730'
  uid: 223d93f1-908c-47c2-9423-64a4e306c0a2
spec:
  clusterIp: 10.106.142.218
  clusterIPs:
  - 10.106.142.218
  internalTrafficPolicy: Cluster
  ipFamilies:
  - IPV4
  ipFamilyPolicy: singlestack
  ports:
  - port: 2379
    protocol: TCP
    targetPort: 2379
    name: api
  selector:
    component: etcd
    tier: control-plane
  sessionAffinity:None
  type: clusterIP
status:
  loadBalancer: {}
  • name: api

创建 Etcd-ServiceMonitor.yaml

[root@k8s-master kube-prometheus]# vim Etcd-ServiceMonitor.yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: etcd-k8s
  namespace: monitoring
  labels:
    k8s-app: etcd-k8s
spec:
  jobLabel: k8s-app
  endpoints:
  - port: api
    interval: 30s
    scheme: https
    tlsConfig:
      caFile: /etc/prometheus/secrets/etcd-certs/ca.crt
      certFile: /etc/prometheus/secrets/etcd-certs/healthcheck-client.crt
      keyFile: /etc/prometheus/secrets/etcd-certs/healthcheck-client.key
      insecureSkipVerify: true
  selector:
    matchLabels:
      component: etcd
  namespaceSelector:
    matchNames:
    - kube-system

应用 Etcd-ServiceMonitor.yaml

[root@k8s-master kube-prometheus]# kubectl apply -f Etcd-serviceMonitor.yaml

查看监控目标

  • 多了一个 ETCD

在 grafana 中添加 ETCD 监控模板

  • 模板 ID:9618

添加非云原生监控项

  • 非云原生应用(如 MySQL、Redis、Kafka 等)没有暴露 Metrics 接口,所以可以使用对应的 Exporter 采集数据,并暴露Metrics 接口。
  • 本案例使用 MySQL 作为一个测试用例,使用 Exporter 监控非云原生应用。

在 Kubernetes 中安装一个 mysql

[root@k8s-master ~]# kubectl create deploy mysql --image=mysql:5.7.23

设置 mysql 密码

[root@k8s-master ~]# kubectl set env deploy/mysql MYSOL_ROOT_PASSWORD=pwd123
  • 需要先设置密码,mysql 的 pod 状态才能正常

查看 pod

[root@k8s-master ~]# kubectl get pod
NAME                      READY    STATUS     RESTARTS   AGE
mysql-58dd9c4df4-17fgd    1/1      Running    6          2m53s

创建 service,暴露 mysql 端口

[root@k8s-master ~l# kubectl expose deployment mysql --type NodePort --port=3306

获取信息

[root@k8s-master ~]# kubectl get svc -l app=mysql
NAME        TYPE        CLUSTER-IP        EXTERNAL-IP    PORT(S)        AGE
mysql       NodePort    10.96.116.184     <none>         3306:31152/TCP 37S

安装 mysql

[root@k8s-master ~]# yum -y install mysql

访问测试

[root@k8s-master ~]# mysql -u root -ppwd123 -h 192.168.10.101 -P 31152

设置权限

[root@k8s-master ~]# grant all on *.* to exporter@'%' identified by 'exporter';

配置 mysql exporter 采集 mysql 监控文件

[root@k8s-master ~]# cat mysql-exporter.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql-exporter
  namespace: monitoring
spec:
  replicas: 1
  selector:
    matchLabels:
      k8s-app: mysql-exporter
  template:
    metadata:
      labels:
        k8s-app: mysql-exporter
    spec:
      containers:
      - name: mysql-exporter
        image: registry.cn-beijing.aliyuncs.com/dotbalo/mysqld-exporter 
        env:
         - name: DATA_SOURCE_NAME
           value: "exporter:exporter@(mysql.default:3306)/"
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 9104
---
apiVersion: v1
kind: Service
metadata:
  name: mysql-exporter
  namespace: monitoring
  labels:
    k8s-app: mysql-exporter
spec:
  type: ClusterIP
  selector:
    k8s-app: mysql-exporter
  ports:
  - name: api
    port: 9104
    protocol: TCP

将文件创建出来

[root@k8s-master ~]# kubectl create -f mysql-exporter.yaml

获取文件信息

[root@k8s-master ~]# kubectl get -f mysql-exporter.yaml
NAME                              READY    UP-TO-DATE    AVAILABLE    AGE
deployment.apps/mysql-exporter      1/1      1             1            84s
NAME                              READY        CLUSTER-IP    EXTERNAL-IP   PORT(S)    AGE
service/mysql-exporter            ClusterIp    10.109.16.46  <none>        9104/TCP   84s

测试能否获取 metrics 数据

[root@k8s-master ~]# curl 10.109.16.46:9104/metricstail -1
% Total    % Received %Xferd Average Speed Time    Time Current
                            Dload Upload    Total    Spent    Left Speed
100    130k    0 130k    0    0 2923k    0 --:--:-- --:--:-- --:--:-- 2973k
promhttp metric_handler_requests_total{code="503"} 0

配置 ServiceMonitor

[root@k8s-master ~]# cat mysql-sm.yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: mysql-exporter
  namespace: monitoring
  labels:
    k8s-app: mysql-exporter
    namespace: monitoring
spec:
  jobLabel: k8s-app
  endpoints:
  - port: api
    interval: 30s
    scheme: http
  selector:
    matchLabels:
      k8s-app: mysql-exporter
  namespaceSelector:
    matchNames:
    - monitoring

创建这个 ServiceMonitor

[root@k8s-master ~]# kubectl create -f mysql-sm.yaml

在 prometheus 查看监控目标中是否出现了 mysql

在 grafana 中添加 mysql 监控模板

  • 模板 ID:6239

添加外部主机

https://github.com/prometheus-community

  • 下载 windows 版 exporter 监控程序并安装
  • 安装后会自动开启 9182 的端口给 prometheus

Linux 被监控端安装 node_exporter

将所需的源码包上传至主机 master(101)

解压

[root@k8s-master ~]# tar zxvf node exporter-1.7.0.linux-amd64.tar.gz

移动文件到指定目录下

[root@k8s-master ~]# mv node exporter-1.7.0.linux-amd64 /usr/local/node exporter

添加服务为系统服务

[root@k8s-master ~]# vim /usr/lib/systemd/system/node exporter.service
[Unit]
Description=node_exporter
After=network.target
[Service]
ExecStart=/usr/local/node exporter/node exporter
Restart=on-failure
[Install]
WantedBy=multi-user.target

启动服务

[root@k8s-master ~]# systemctl daemon-reload
[root@k8s-master ~]# systemctl start node_exporter
[root@k8s-master ~]# systemctl enable node_exporter

查看端口

[root@k8s-master ~]# netstat -anpt grep 9100
tcp6    0    0 :::9100    :::*    LISTEN    6352/node_exporter

windows 被监控端安装 windows_exporter

打开一个 windows 系统(以 win10 系统演示)

将所需的程序包复制或上传至 win10 系统

只需鼠标双击运行就OK

创建一个 Prometheus 的静态配置,用来指定外部主机

[root@k8s-master ~]# vim prometheus-additional.yaml
- job_name: 'WindowsServerMonitor'
  static_configs:
    - targets:
      - "192.168.10.50:9182"
      labels:
        server_type: "windows"
  relabel_configs:
    - source_labels: [__address__]
      target_label: instance
  •  - "192.168.10.50:9182"
  • Linux 主机的 exporter 进程监听的是TCP 9100 端口
  • windows 主机的exporter 进程监听的TCP 9182 端口

通过上面的文件创建一个 secret,作为 prometheus 的静态配置

[root@k8s-master ~]# kubectl create secret generic additional-configs --from-file=prometheus-additional.yaml -n monitoring

查看是否创建成功

[root@k8s-master ~]# kubectl get secret additional-configs -n monitoring
NAME                    TYPE        DATA    AGE
additional-configs      Opaque      1       16m

修改 prometheus 的配置

[root@k8s-master ~]# kubectl edit prometheus-n monitoring
添加红色部分到末尾即可:
  runAsUser: 1000
serviceAccountName: prometheus-k8s
serviceMonitorNamespaceselector: {}
serviceMonitorSelector: {}
version: 2.32.1
additionalscrapeConfigs:
  key: prometheus-additional.yaml
  name: additional-configs
  optional: true
  • additionalscrapeConfigs:
  •   key: prometheus-additional.yaml
  •   name: additional-configs
  •   optional: true

查看是否自动加载成功

[root@k8s-master ~]# kubectl get secret -n monitoring

查看创建出来的 secret

[root@k8s-master ~]# kubectl get secret additional-configs -n monitoring -oyaml
apiVersion:v1
data:
  prometheus-additional.yaml:
LSBgb2JfbmFtzTogJ1dpbmRvd3NTZXJ2ZXJNb25pdG9yJWogIHNYXRpY19jb25maWdzOgOgICAgLSBOYX]nZXRZOgOgICAgICAtICIXOTIUMTY4LjEWLjUxOjkxODIiCiAgICAgIGxhYmVSCZOKICAgICAgICBzZXJ2ZXJfdHlwZTogIndpbmRvd3MiciAgcmVsYW]1bF9jb25maWdz0gogICAgLSBzb3VyY2VfbGFiZWxz0iBbX19hZGRyZXNzX19dCiAgICAgIHRhcmdldF9sYWJlbDogaW5zdGFuY2UK
kind: Secret
metadata:
  creationTimestamp: "2022-10-19T13:01:30Z'
  name: additional-configs
  namespace: monitoring
  resourceVersion: "16897"
  uid: 6d7a4c50-2a15-46d3-bfab-505b8fd74fcb
type: opaque

查看 prometheus 监控目标

在 grafana 中添加监控模板

  • 模板 ID:12566
  • 此模板是针对 windows 服务器的。
  • 用户也可以选择其他对应的模板进行创建。
  • 12633:针对 Linux 的节点进行监控的模板
  • 14694:针对 windows 的节点进行监控的模板

小阿轩yx-案例:Prometheus监控kubernetes环境构建


原文地址:https://blog.csdn.net/2401_83435725/article/details/142330022

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!