Prometheus监控k8s环境构建

打印 上一主题 下一主题

主题 844|帖子 844|积分 2532

        传统架构中比较盛行的监控工具有 Zabbix、Nagios 等,这些监控工具对于 Kubernetes 这类云平台的监控不是很友好,特别是当 Kubernetes 集群中有了成千上万的容器后更是云云,本章节学习下一代的云原生监控平台---Prometheus。
一、基于kubernetes的Prometheus先容

1.环境简介

        node-exporter + prometheus + grafana 是一套非常盛行的 Kubernetes 监控方案。它们的功能如下:


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

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


  • node-exporter:在每个节点也作为Daemonset 运行,收罗节点 Metrics。
  • Prometheus:部署 Prometheus operator 实现,作为 Deployment 运行,用于抓取 Metrics 和报警。
  • Grafana:部署 Grafana 0perator 实现,用于仪表盘展示。
3.Kubernetes 监控指标

K8S 自己的监控指标:


  • CPU 使用率:包罗节点 CPU 使用率、Pod CPU 使用率、容器 CPU 使用率等,用于监控 CPU 资源使用情况。
  • 内存使用率:包罗节点内存使用率、Pod 内存使用率、容器内存使用率等,用于监控内存资源使用情况。
  • 网络流量:节点网络流量、Pod 网络流量、容器网络流量,用于监控网络收发包大小和带宽使用率。
  • 磁盘使用率:节点磁盘使用率,用于监控节点磁盘空间使用情况。
  • Pod 状态od 的 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 的安装

1.从 Github 克隆项目分支

  1. [root@k8s-master ~]# git clone -b
  2. release-0.10 https://github.com/prometheus-operator/kube-prometheus.git
复制代码
 2.安装Prometheus Operator

        Prometheus operator 是 Core0s 开源的项目,它提供了一种 Kubernetes-native 的方式来运行和管理 Prometheus。Prometheus operator 可以自动创建、配置和管理 Prometheus 实例,并将其与Kubernetes 中的服务发现机制集成在一起,从而实现对 Kubernetes 集群的自动监控。
        Prometheus 和Prometheus Operator的区别如下:
        Prometheus是一种开源的监控系统,用于记录各种指标,并提供査询接口和告警机制。而PrometheusOperator 则是一种用于在 Kubernetes 上运行和管理 Prometheus 的办理方案。相比于传统方式手动部署 Prometheus,Prometheus Operator 可以自动创建、配置和管理 Prometheus 实例,并将其与Kubernetes 中的服务发现机制集成在一起,大幅简化了我们的工作量。
        安装方法如下:
  1. [root@master ~]# cd kube-prometheus/
  2. [root@master kube-prometheus]# ku apply --server-side -f manifests/
  3. setup
  4. customresourcedefinition.apiextensions.k8s.io/alertmanagerconfigs.monitoring.coreos.com serverside-applied
  5. customresourcedefinition.apiextensions.k8s.io/alertmanagers.monitoring.coreos.com serverside-applied
  6. customresourcedefinition.apiextensions.k8s.io/podmonitors.monitoring.coreos.com serverside-applied
  7. customresourcedefinition.apiextensions.k8s.io/probes.monitoring.coreos.com serverside-applied
  8. customresourcedefinition.apiextensions.k8s.io/prometheuses.monitoring.coreos.com serverside-applied
  9. customresourcedefinition.apiextensions.k8s.io/prometheusrules.monitoring.coreos.com serverside-applied
  10. customresourcedefinition.apiextensions.k8s.io/servicemonitors.monitoring.coreos.com serverside-applied
  11. customresourcedefinition.apiextensions.k8s.io/thanosrulers.monitoring.coreos.com serverside-applied
  12. namespace/monitoring serverside-applied
复制代码
  1. [root@master kube-prometheus]# ku apply --server-side -f manifests/
  2. setup
复制代码
 备注:
--server-side
这个特性主要目的是把逻辑从 kubectl apply 移动到 kube-apiserver 中,这可以修复当前遇到的很多有关所有权辩论的题目

可以直接通过 API 完成声明式配置的操作,而无需依赖于特定的 kubectl apply 命令
如果要删除Prometheus operator,可以使用下面的命令kubectl delete --ignore-not-found=true -f manifests/setup.
备注:
prometheus-operator 的作用主要是用来创建prometheus 的相关资源以及监督与管理它创建出来的资源对象。
3.Operator 容器启动起来后安装Prometheus stack

  1. [root@master kube-prometheus]# ku apply --server-side -f manifests/
复制代码
备注:
删除Prometheus stack
kubectl delete --ignore-not-found=true -f manifests/ -f manifests/setup

备注:
kube-prometheus-stack 是一个全家桶,提供监控告警组件alert-manager、grafana 等子组件。
4. 查看Prometheus 容器的状态

  1. [root@master kube-prometheus]# ku get pod -n monitoring
  2. NAME                                   READY   STATUS             RESTARTS   AGE
  3. alertmanager-main-0                    2/2     Running            0          4m4s
  4. alertmanager-main-1                    1/2     ImagePullBackOff   0          4m4s
  5. alertmanager-main-2                    2/2     Running            0          4m4s
  6. blackbox-exporter-6b79c4588b-q8jxx     3/3     Running            0          4m12s
  7. grafana-7fd69887fb-j9d2n               0/1     ImagePullBackOff   0          4m11s
  8. kube-state-metrics-55f67795cd-rf6s7    2/3     ImagePullBackOff   0          4m11s
  9. node-exporter-f9dtj                    2/2     Running            0          4m11s
  10. node-exporter-hcxgp                    2/2     Running            0          4m11s
  11. node-exporter-jshsm                    2/2     Running            0          4m11s
  12. prometheus-adapter-5565cc8d76-6stvc    1/1     Running            0          4m10s
  13. prometheus-adapter-5565cc8d76-sp6vj    1/1     Running            0          4m10s
  14. prometheus-k8s-0                       1/2     ImagePullBackOff   0          4m4s
  15. prometheus-k8s-1                       0/2     PodInitializing    0          4m4s
  16. prometheus-operator-6dc9f66cb7-bhhrh   2/2     Running            0          4m10s
复制代码
 5.查看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 的创建方法如下:
  1. [root@master kube-prometheus]# ku get servicemonitors -A
  2. NAMESPACE    NAME                      AGE
  3. monitoring   alertmanager-main         4m49s
  4. monitoring   blackbox-exporter         4m49s
  5. monitoring   coredns                   4m48s
  6. monitoring   grafana                   4m48s
  7. monitoring   kube-apiserver            4m48s
  8. monitoring   kube-controller-manager   4m48s
  9. monitoring   kube-scheduler            4m48s
  10. monitoring   kube-state-metrics        4m48s
  11. monitoring   kubelet                   4m48s
  12. monitoring   node-exporter             4m48s
  13. monitoring   prometheus-adapter        4m47s
  14. monitoring   prometheus-k8s            4m47s
  15. monitoring   prometheus-operator       4m47s
复制代码
 6.修改grafana的 service 的类型为 NodePort

留意:默认的 type为ClusterIp 的类型
  1. [root@master kube-prometheus]# ku edit svc grafana -n monitoring
  2. # Please edit the object below. Lines beginning with a '#' will be ignored,
  3. # and an empty file will abort the edit. If an error occurs while saving this file will be
  4. # reopened with the relevant failures.
  5. #
  6. apiVersion: v1
  7. kind: Service
  8. metadata:
  9.   creationTimestamp: "2024-09-18T00:51:14Z"
  10.   labels:
  11.     app.kubernetes.io/component: grafana
  12.     app.kubernetes.io/name: grafana
  13.     app.kubernetes.io/part-of: kube-prometheus
  14.     app.kubernetes.io/version: 8.3.3
  15.   name: grafana
  16.   namespace: monitoring
  17.   resourceVersion: "9661"
  18.   uid: 4375052f-17cd-4622-8e3f-fcc2ebb1e061
  19. spec:
  20.   clusterIP: 10.96.56.246
  21.   clusterIPs:
  22.   - 10.96.56.246
  23.   internalTrafficPolicy: Cluster
  24.   ipFamilies:
  25.   - IPv4
  26.   ipFamilyPolicy: SingleStack
  27.   ports:
  28.   - name: http
  29.     nodePort: 32082
  30.     port: 3000
  31.     protocol: TCP
  32.     targetPort: http
  33.   selector:
  34.     app.kubernetes.io/component: grafana
  35.     app.kubernetes.io/name: grafana
  36.     app.kubernetes.io/part-of: kube-prometheus
  37.   sessionAffinity: None
  38.   type: NodePort
  39. status:
  40.   loadBalancer: {}
复制代码
  1. [root@master kube-prometheus]# ku get svc grafana -n  monitoring
  2. NAME      TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
  3. grafana   NodePort   10.96.56.246   <none>        3000:32082/TCP   15m
复制代码
7.访问grafana

http://192.168.10.101:32082 


 留意:
默认的登录账号密码为 admin/admin,第一次登陆会提示修改密码,不想修改可以点击 skip 跳过
8.修改Prometheus 的Service 类型

将 type 类型修改为 NodePort,默认的是 ClusterIP
  1. [root@master kube-prometheus]# ku edit svc prometheus-k8s -n monitoring
  2. # Please edit the object below. Lines beginning with a '#' will be ignored,
  3. # reopened with the relevant failures.
  4. #
  5. apiVersion: v1
  6. kind: Service
  7. metadata:
  8.   creationTimestamp: "2024-09-18T00:51:15Z"
  9.   labels:
  10.     app.kubernetes.io/component: prometheus
  11.     app.kubernetes.io/instance: k8s
  12.     app.kubernetes.io/name: prometheus
  13.     app.kubernetes.io/part-of: kube-prometheus
  14.     app.kubernetes.io/version: 2.32.1
  15.   name: prometheus-k8s
  16.   namespace: monitoring
  17.   resourceVersion: "9770"
  18.   uid: 3f6d5cfa-2f10-4426-aad2-76523ed68b48
  19. spec:
  20.   clusterIP: 10.104.223.81
  21.   clusterIPs:
  22.   - 10.104.223.81
  23.   internalTrafficPolicy: Cluster
  24.   ipFamilies:
  25.   - IPv4
  26.   ipFamilyPolicy: SingleStack
  27.   ports:
  28.   - name: web
  29.     nodePort: 32370
  30.     port: 9090
  31.     protocol: TCP
  32.     targetPort: web
  33.   - name: reloader-web
  34.     port: 8080
  35.     protocol: TCP
  36.     targetPort: reloader-web
  37.   selector:
  38.     app.kubernetes.io/component: prometheus
  39.     app.kubernetes.io/instance: k8s
  40.     app.kubernetes.io/name: prometheus
  41.     app.kubernetes.io/part-of: kube-prometheus
  42.   sessionAffinity: ClientIP
  43.   sessionAffinityConfig:
  44.     clientIP:
  45.       timeoutSeconds: 10800
  46.   type: NodePort
  47. status:
  48.   loadBalancer: {}
复制代码
  1. [root@master kube-prometheus]# ku get svc prometheus-k8s -n  monitoring
  2. NAME             TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)                         AGE
  3. prometheus-k8s   NodePort   10.104.223.81   <none>        9090:32370/TCP,8080:32140/TCP   19m
复制代码
9.访问Prometheus

http://192.168.10.101:32370



查看监控目的
 

 备注:
在 Prometheus 中一条告警规则有三个状态:
inactive:还未被触发:
pending:已经触发,但是还未达到for 设定的时间:firing:
触发且达到设定时间。
三、配置 Grafana Dashbord

1.添加数据源

留意:在本案例中,grafana已经有了 Prometheus 的数据源,(1)、(2)、(3)步调可以省去
(1)添加数据源

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

 (2)数据源选择 Prometheus

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

(3)配置数据源

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

 2.通过 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 20211010 中文版
13105

Kubernetes Pods
4686

Linux Stats with Node Exporter
14731
四、添加云原生监控项

        通过前面的学习,我们对 Prometheus 相关知识做了一定的了解,也明白了云原生和非云原生应用的监控流程。但是,在安装Prometheus 的时间,并没有对 ETCD 集群进行监控,ETCD 集群时 kubernetes的数据库,把握着 kubernetes 最核心的数据,ETCD 的状态和性能直接影响 kubernetes 集群的状态所以对 ETCD 集群的监控时非常紧张的。接下来通过 ETCD 的监控部署,老学习一下怎样对云原生应用进行监控的。
        kubernetes 有一个Metrics 接口,可以直接获取内部的运行信息,比如 ETCD 的内部数据可以通过2379 的 Metrics 端口得到,和之前的 kubelet 类似。差异的是,ETCD 对外的接口必须通过 HTTPS 访问所以在请求时需要加上对应的证书。
1.创建ETCD Service

  1. [root@master kube-prometheus]# vim etcd-svc.yaml
  2. apiVersion: v1
  3. kind: Endpoints
  4. metadata:
  5.   labels:
  6.     app: etcd-prom
  7.   name: etcd-prom
  8.   namespace: kube-system
  9. subsets:
  10. - addresses:
  11.   - ip: 192.168.10.101
  12. #  - ip: 192.168.10.102
  13. #  - ip: 192.168.10.103
  14.   ports:
  15.   - name: https-metrics
  16.     port: 2379   # etcd端口
  17.     protocol: TCP
  18. ---
  19. apiVersion: v1
  20. kind: Service
  21. metadata:
  22.   labels:
  23.     app: etcd-prom
  24.   name: etcd-prom
  25.   namespace: kube-system
  26. spec:
  27.   ports:
  28.   - name: https-metrics
  29.     port: 2379
  30.     protocol: TCP
  31.     targetPort: 2379
  32.   type: ClusterIP
复制代码
备注:
kubeadm安装的k8s只有master节点上安装了etcd。
2.创建ETCD Service

  1. [root@master kube-prometheus]# ku create -f etcd-svc.yaml
  2. endpoints/etcd-prom created
  3. service/etcd-prom created
复制代码
3.查看创建的ETCD Service 

  1. [root@master kube-prometheus]# ku get svc -n kube-system etcd-prom
  2. NAME             TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                        AGE
  3. etcd-prom        ClusterIP   10.109.121.206   <none>        2379/TCP                       2m18s
复制代码
4.通过ClusterIP访问测试 

  1. [root@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.key https://192.168.10.101:2379/metrics
复制代码
 备注:
ServiceMonitor需要配置证书才能请求ETCD的Metrics接口。
5.创建ETCD证书的Secret

  1. ku -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 中是比较安全的做法。
6. 修改 prometheus 资源,应用上一步创建的 secret

  1. [root@master kube-prometheus]# ku edit prometheus k8s -n  monitoring
  2. # Please edit the object below. Lines beginning with a '#' will be ignored,
  3. # reopened with the relevant failures.
  4. #
  5. apiVersion: monitoring.coreos.com/v1
  6. kind: Prometheus
  7. metadata:
  8.   creationTimestamp: "2024-09-18T00:51:14Z"
  9.   generation: 1
  10.   labels:
  11.     app.kubernetes.io/component: prometheus
  12.     app.kubernetes.io/instance: k8s
  13.     app.kubernetes.io/name: prometheus
  14.     app.kubernetes.io/part-of: kube-prometheus
  15.     app.kubernetes.io/version: 2.32.1
  16.   name: k8s
  17.   namespace: monitoring
  18.   resourceVersion: "9754"
  19.   uid: 8b7f3f06-44d8-4604-83b5-acccc1a25661
  20. spec:
  21.   alerting:
  22.     alertmanagers:
  23.     - apiVersion: v2
  24.       name: alertmanager-main
  25.       namespace: monitoring
  26.       port: web
  27.   enableFeatures: []
  28.   externalLabels: {}
  29.   image: quay.io/prometheus/prometheus:v2.32.1
  30.   nodeSelector:
  31.     kubernetes.io/os: linux
  32.   podMetadata:
  33.     labels:
  34.       app.kubernetes.io/component: prometheus
  35.       app.kubernetes.io/instance: k8s
  36.       app.kubernetes.io/name: prometheus
  37.       app.kubernetes.io/part-of: kube-prometheus
  38.       app.kubernetes.io/version: 2.32.1
  39.   podMonitorNamespaceSelector: {}
  40.   podMonitorSelector: {}
  41.   probeNamespaceSelector: {}
  42.   probeSelector: {}
  43.   replicas: 2
  44.   resources:
  45.     requests:
  46.       memory: 400Mi
  47.   ruleNamespaceSelector: {}
  48.   ruleSelector: {}
  49.   securityContext:
  50.     fsGroup: 2000
  51.     runAsNonRoot: true
  52.     runAsUser: 1000
  53.   serviceAccountName: prometheus-k8s
  54.   serviceMonitorNamespaceSelector: {}
  55.   serviceMonitorSelector: {}
  56.   version: 2.32.1
  57.   secrets:
  58.   - etcd-certs
复制代码
备注:
kubectl edit prometheus k8s -n monitoring
prometheus :资源对象类型
k8s :资源对象名称 
7.查看证书

  1. [root@master kube-prometheus]# ku -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
  2. secret/etcd-certs created
复制代码
  1. [root@master kube-prometheus]# ku -n monitoring exec -it prometheus-k8s-0 -c prometheus -- sh
  2. /prometheus $ cd /etc/prometheus/secrets/etcd-certs/
  3. /etc/prometheus/secrets/etcd-certs $ ls
  4. ca.crt                  healthcheck-client.crt  healthcheck-client.key
复制代码
备注:
需要等一小会才会瞥见这三个证书文件
8. 创建 ETCD ServiceMonitor

  1. root@master kube-prometheus]# ku get pod -A | grep etcd
  2. kube-system            etcd-master                                  1/1     Running   2 (83m ago)   29d
复制代码
  1. [root@master kube-prometheus]# ku expose pod etcd-master -n kube-system --name=etcd-k8s --port=2379 --target-port 2379
  2. service/etcd-k8s exposed
复制代码
 9.创建service,并给 port 添加 name

给名为 etcd-k8s 的 svc,添加 name 的声明
  1. [root@master kube-prometheus]# ku edit svc etcd-k8s -n kube-system
  2. # Please edit the object below. Lines beginning with a '#' will be ignored,
  3. # and an empty file will abort the edit. If an error occurs while saving this file will be
  4. # reopened with the relevant failures.
  5. #
  6. apiVersion: v1
  7. kind: Service
  8. metadata:
  9.   creationTimestamp: "2024-09-18T01:59:17Z"
  10.   labels:
  11.     component: etcd
  12.     tier: control-plane
  13.   name: etcd-k8s
  14.   namespace: kube-system
  15.   resourceVersion: "16197"
  16.   uid: e1967be2-3b2f-4a63-84df-0dca834aa15d
  17. spec:
  18.   clusterIP: 10.108.207.84
  19.   clusterIPs:
  20.   - 10.108.207.84
  21.   internalTrafficPolicy: Cluster
  22.   ipFamilies:
  23.   - IPv4
  24.   ipFamilyPolicy: SingleStack
  25.   ports:
  26.   - port: 2379
  27.     protocol: TCP
  28.     targetPort: 2379
  29.     name: api
  30.   selector:
  31.     component: etcd
  32.     tier: control-plane
  33.   sessionAffinity: None
  34.   type: ClusterIP
  35. status:
  36.   loadBalancer: {}
复制代码
10.创建 Etcd-ServiceMonitor.yaml 

  1. [root@master kube-prometheus]# vim Etcd-ServiceMonitor.yaml
  2. apiVersion: monitoring.coreos.com/v1
  3. kind: ServiceMonitor
  4. metadata:
  5.   name: etcd-k8s
  6.   namespace: monitoring
  7.   labels:
  8.     k8s-app: etcd-k8s
  9. spec:
  10.   jobLabel: k8s-app
  11.   endpoints:
  12.   - port: api
  13.     interval: 30s
  14.     scheme: https
  15.     tlsConfig:
  16.       caFile: /etc/prometheus/secrets/etcd-certs/ca.crt
  17.       certFile: /etc/prometheus/secrets/etcd-certs/healthcheck-client.crt
  18.       keyFile: /etc/prometheus/secrets/etcd-certs/healthcheck-client.key
  19.       insecureSkipVerify: true
  20.   selector:
  21.     matchLabels:
  22.       component: etcd
  23.   namespaceSelector:
  24.     matchNames:
  25.     - kube-system
复制代码
11.应用Etcd-ServiceMonitor.yaml  

  1. [root@master kube-prometheus]# ku apply -f Etcd-ServiceMonitor.yaml
  2. servicemonitor.monitoring.coreos.com/etcd-k8s created
复制代码
12.查看监控目的

多了一个ETCD 

 12.在 grafana 中添加 ETCD 监控模板

模板 ID:9618

 五、添加非云原生监控项

        上一节对云原生应用 ETCD 进行了监控,可以看到符合云原生要素开发的应用,自带的都有一个Metrics 接口,可以让监控平台直接收罗到监控的数据。而非云原生应用(如 MySOL、Redis、Kafka 等)没有袒露 Metrics 接口,所以可以使用对应的 Exporter 收罗数据,并袒露Metrics 接口。本案例使用MySQL作为一个测试用例,演示怎样使用 Exporter 监控非云原生应用。
1.在Kubernetes 中安装一个mysql

  1. [root@master kube-prometheus]# ku create deploy mysql --image=mysql:5.7.23
  2. deployment.apps/mysql created
复制代码
2. 设置 mysql密码

  1. [root@master kube-prometheus]# ku set env deploy/mysql MYSQL_ROOT_PASSWORD=pwd123
  2. deployment.apps/mysql env updated
复制代码
备注:
需要先设置密码,mysql 的 pod 状态才能正常 
3.查看pod

  1. [root@master kube-prometheus]# ku get pod
  2. NAME                    READY   STATUS    RESTARTS   AGE
  3. mysql-dcf858795-l46x4   1/1     Running   0          24s
复制代码
4.创建service,袒露mysql端口 

  1. [root@master kube-prometheus]# ku expose deployment mysql --type NodePort --port=3306
  2. service/mysql exposed
复制代码
  1. [root@master kube-prometheus]# ku get svc -l app=mysql
  2. NAME    TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
  3. mysql   NodePort   10.99.132.36   <none>        3306:32148/TCP   29s
复制代码
5.访问测试 

  1. [root@master kube-prometheus]# yum -y install mysql
  2. [root@master kube-prometheus]# mysql -u root -ppwd123 -h 192.168.10.101 -P 32148
复制代码
6.设置权限 

  1. MySQL [(none)]> grant all on *.* to exporter@'%' identified by 'exporter';
  2. Query OK, 0 rows affected, 1 warning (0.03 sec)
复制代码
 7.配置mysql exporter收罗mysql监控文件

  1. [root@master kube-prometheus]# vim mysql-exporter.yaml
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5.   name: mysql-exporter
  6.   namespace: monitoring
  7. spec:
  8.   replicas: 1
  9.   selector:
  10.     matchLabels:
  11.       k8s-app: mysql-exporter
  12.   template:
  13.     metadata:
  14.       labels:
  15.         k8s-app: mysql-exporter
  16.     spec:
  17.       containers:
  18.       - name: mysql-exporter
  19.         image: registry.cn-beijing.aliyuncs.com/dotbalo/mysqld-exporter
  20.         env:
  21.          - name: DATA_SOURCE_NAME
  22.            value: "exporter:exporter@(mysql.default:3306)/"
  23.         imagePullPolicy: IfNotPresent
  24.         ports:
  25.         - containerPort: 9104
  26. ---
  27. apiVersion: v1
  28. kind: Service
  29. metadata:
  30.   name: mysql-exporter
  31.   namespace: monitoring
  32.   labels:
  33.     k8s-app: mysql-exporter
  34. spec:
  35.   type: ClusterIP
  36.   selector:
  37.     k8s-app: mysql-exporter
  38.   ports:
  39.   - name: api
  40.     port: 9104
  41.     protocol: TCP
复制代码
  1. [root@master kube-prometheus]# ku create -f mysql-exporter.yaml
  2. deployment.apps/mysql-exporter created
  3. service/mysql-exporter created
复制代码
  1. [root@master kube-prometheus]# ku get -f mysql-exporter.yaml
  2. NAME                             READY   UP-TO-DATE   AVAILABLE   AGE
  3. deployment.apps/mysql-exporter   1/1     1            1           68s
  4. NAME                     TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
  5. service/mysql-exporter   ClusterIP   10.106.50.50   <none>        9104/TCP   68s
复制代码
8.测试可否获取metrics数据 

  1. [root@master kube-prometheus]# curl 10.106.50.50:9104/metrics | tail -l
  2.   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
  3.                                  Dload  Upload   Total   Spent    Left  Speed
  4. 100  130k    0  130k    0     0  2191k      0 --:--:-- --:--:-- --:--:-- 2215k
  5. # TYPE process_virtual_memory_max_bytes gauge
  6. process_virtual_memory_max_bytes 1.8446744073709552e+19
  7. # HELP promhttp_metric_handler_requests_in_flight Current number of scrapes being served.
  8. # TYPE promhttp_metric_handler_requests_in_flight gauge
  9. promhttp_metric_handler_requests_in_flight 1
  10. # HELP promhttp_metric_handler_requests_total Total number of scrapes by HTTP status code.
  11. # TYPE promhttp_metric_handler_requests_total counter
  12. promhttp_metric_handler_requests_total{code="200"} 0
  13. promhttp_metric_handler_requests_total{code="500"} 0
  14. promhttp_metric_handler_requests_total{code="503"} 0
复制代码
9.配置ServiceMonitor 

  1. [root@master kube-prometheus]# vim mysql-sm.yaml
  2. apiVersion: monitoring.coreos.com/v1
  3. kind: ServiceMonitor
  4. metadata:
  5.   name: mysql-exporter
  6.   namespace: monitoring
  7.   labels:
  8.     k8s-app: mysql-exporter
  9.     namespace: monitoring
  10. spec:
  11.   jobLabel: k8s-app
  12.   endpoints:
  13.   - port: api
  14.     interval: 30s
  15.     scheme: http
  16.   selector:
  17.     matchLabels:
  18.       k8s-app: mysql-exporter
  19.   namespaceSelector:
  20.     matchNames:
  21.     - monitoring
复制代码
10.创建这个ServiceMonitor 

  1. [root@master kube-prometheus]# ku create -f mysql-sm.yaml
  2. servicemonitor.monitoring.coreos.com/mysql-exporter created
复制代码
 11.在 prometheus 查看监控目的中是否出现了 mysql


 12.在grafana中添加mysql监控模板

模板ID:6239

 六、添加外部主机

https://github.com/prometheus-community
下载 windows 版 exporter 监控步伐并安装
安装后会自动开启 9182 的端口给 prometheus
1.Linux 被监控端安装 node exporter

(1)安装node exporter

  1. [root@localhost ~]# hostnamectl set-hostname agent01
  2. [root@localhost ~]# bash
  3. [root@agent01 ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/’/etc/selinux/config
  4. [root@agent01 ~]# setenforce 0
  5. [root@agent01 ~]# systemctl disable firewalld
  6. [root@agent01 ~]# systemctl stop firewalld
复制代码
  1. [root@agent01 ~]# tar zxvf node exporter-1.7.0.linux-amd64.tar.gz
  2. [root@agent01 ~]# mv node exporter-1.7.0.linux-amd64 /usr/local/node exporter
复制代码
 (2)添加服务为系统服务

  1. [root@agent01 ~]# vim /usr/lib/systemd/system/node exporter.service
复制代码
  1. [Unit]
  2. Description=node exporter
  3. After=network.target
  4. [Service]
  5. ExecStart=/usr/local/node exporter/node exporterRestart=on-failure
  6. [Install]
  7. WantedBy=multi-user.target
复制代码
 (3)启动

  1. [root@agent01 ~# systemctl daemon-reload
  2. [root@agent01 ~]# systemctl enable node exporter
  3. [root@agent01 ~]# systemctl start node exporter
复制代码
 (4)查看端口

  1. [root@agent01 ~]# netstat -anpt grep 9100
  2. tcp6      0      0 :::9100    :::*    LISTEN
  3. 6352/node exporter
复制代码
2.windows 被监控端安装 windows exporter 

此步调比较简朴,此处不在演示,将windows exporter-0.20.0-amd64.msi 直接安装到 windows 系统中即可,无需任何设置。
3.创建一个 Prometheus 的静态配置,用来指定外部主机

  1. [root@master kube-prometheus]# vim prometheus-additional.yaml
  2. - job_name: 'WindowsServerMonitor'
  3.   static_configs:
  4.     - targets:
  5.       - "192.168.10.50:9182"
  6.       labels:
  7.         server_type: "windows"
  8.   relabel_configs:
  9.     - source_labels: [__address__]
  10.       target_label: instance
复制代码
备注
Linux 主机的exporter 进程监听的是TCP 9100 端口,windows 主机的exporter 进程监听的TCP9182 端口。 
4.通过上面的文件创建一个 secret,作为 prometheus 的静态配置

  1. [root@master kube-prometheus]# ku create secret generic additional-configs --from-file=prometheus-additional.yaml -n monitoring
  2. secret/additional-configs created
复制代码
5.查看是否创建乐成 

  1. [root@k8s-master ~]# kubectl get secret additional-configs -n monitoring
  2. NAME        TYPE    DATA    AGE
  3. additional-configs    opaque    1    16m
复制代码
6.修改 prometheus 的配置

  1. [root@master kube-prometheus]# ku edit prometheus -n monitoring
  2. # Please edit the object below. Lines beginning with a '#' will be ignored,
  3. # reopened with the relevant failures.
  4. #
  5. apiVersion: monitoring.coreos.com/v1
  6. kind: Prometheus
  7. metadata:
  8.   creationTimestamp: "2024-09-18T00:51:14Z"
  9.   generation: 2
  10.   labels:
  11.     app.kubernetes.io/component: prometheus
  12.     app.kubernetes.io/instance: k8s
  13.     app.kubernetes.io/name: prometheus
  14.     app.kubernetes.io/part-of: kube-prometheus
  15.     app.kubernetes.io/version: 2.32.1
  16.   name: k8s
  17.   namespace: monitoring
  18.   resourceVersion: "15352"
  19.   uid: 8b7f3f06-44d8-4604-83b5-acccc1a25661
  20. spec:
  21.   alerting:
  22.     alertmanagers:
  23.     - apiVersion: v2
  24.       name: alertmanager-main
  25.       namespace: monitoring
  26.       port: web
  27.   enableFeatures: []
  28.   externalLabels: {}
  29.   image: quay.io/prometheus/prometheus:v2.32.1
  30.   nodeSelector:
  31.     kubernetes.io/os: linux
  32.   podMetadata:
  33.     labels:
  34.       app.kubernetes.io/component: prometheus
  35.       app.kubernetes.io/instance: k8s
  36.       app.kubernetes.io/name: prometheus
  37.       app.kubernetes.io/part-of: kube-prometheus
  38.       app.kubernetes.io/version: 2.32.1
  39.   podMonitorNamespaceSelector: {}
  40.   podMonitorSelector: {}
  41.   probeNamespaceSelector: {}
  42.   probeSelector: {}
  43.   replicas: 2
  44.   resources:
  45.     requests:
  46.       memory: 400Mi
  47.   ruleNamespaceSelector: {}
  48.   ruleSelector: {}
  49.   secrets:
  50.   - etcd-certs
  51.   securityContext:
  52.     fsGroup: 2000
  53.     runAsNonRoot: true
  54.     runAsUser: 1000
  55.   serviceAccountName: prometheus-k8s
  56.   serviceMonitorNamespaceSelector: {}
  57.   serviceMonitorSelector: {}
  58.   version: 2.32.1
  59.   additionalScrapeConfigs:
  60.     key: prometheus-additional.yaml
  61.     name: additional-configs
  62.     optional: true
复制代码
7.验证是否自动加载乐成 

  1. [root@master kube-prometheus]# ku get secret -n monitoring
  2. NAME                              TYPE                                  DATA   AGE
  3. additional-configs                Opaque                                1      4m48s
  4. alertmanager-main                 Opaque                                1      125m
  5. alertmanager-main-generated       Opaque                                1      125m
  6. alertmanager-main-tls-assets-0    Opaque                                0      125m
  7. alertmanager-main-token-hh944     kubernetes.io/service-account-token   3      125m
  8. blackbox-exporter-token-x5k8h     kubernetes.io/service-account-token   3      125m
  9. default-token-7tcvm               kubernetes.io/service-account-token   3      127m
  10. etcd-certs                        Opaque                                3      63m
  11. grafana-config                    Opaque                                1      125m
  12. grafana-datasources               Opaque                                1      125m
  13. grafana-token-dt9pd               kubernetes.io/service-account-token   3      125m
  14. kube-state-metrics-token-sfw9h    kubernetes.io/service-account-token   3      125m
  15. node-exporter-token-rj525         kubernetes.io/service-account-token   3      125m
  16. prometheus-adapter-token-l9v2p    kubernetes.io/service-account-token   3      125m
  17. prometheus-k8s                    Opaque                                1      125m
  18. prometheus-k8s-tls-assets-0       Opaque                                0      125m
  19. prometheus-k8s-token-lc5m4        kubernetes.io/service-account-token   3      125m
  20. prometheus-k8s-web-config         Opaque                                1      125m
  21. prometheus-operator-token-9gcrn   kubernetes.io/service-account-token   3      125m
复制代码
8.查看创建出来的secret 

  1. [root@master kube-prometheus]# ku get secret additional-configs -n monitoring -oyaml
  2. apiVersion: v1
  3. data:
  4.   prometheus-additional.yaml: LSBqb2JfbmFtZTogJ1dpbmRvd3NTZXJ2ZXJNb25pdG9yJwogIHN0YXRpY19jb25maWdzOgogICAgLSB0YXJnZXRzOgogICAgICAtICIxOTIuMTY4LjEwLjUwOjkxODIiCiAgICAgIGxhYmVsczoKICAgICAgICBzZXJ2ZXJfdHlwZTogIndpbmRvd3MiCiAgcmVsYWJlbF9jb25maWdzOgogICAgLSBzb3VyY2VfbGFiZWxzOiBbX19hZGRyZXNzX19dCiAgICAgIHRhcmdldF9sYWJlbDogaW5zdGFuY2UK
  5. kind: Secret
  6. metadata:
  7.   creationTimestamp: "2024-09-18T02:52:24Z"
  8.   name: additional-configs
  9.   namespace: monitoring
  10.   resourceVersion: "20576"
  11.   uid: 7c53888b-b887-48a8-93f4-783a192b6f03
  12. type: Opaque
复制代码
9.查看prometheus 监控目的


10.在 grafana 中添加监控模板

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


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

乌市泽哥

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表