前言

对于使用prometheus系统进行监控的,主要围绕以下几个点进行:
系统层面监控

  • 系统监控:CPU,Load,Memory,Swap,Disk IO,Processes,Kernel等等
  • 网络监控:网络设备,工作负载,网络延迟,丢包率等

中间件及基础设施类监控

  • 消息中间件:Kafka,RocketMQ等
  • Web服务容器:Tomcat和jetty等
  • 数据库及缓存系统:MySQL,PostgreSQL,MogoDB,Redis,ElasticSearch等
  • 数据库连接池:ShadingSpere等 存储系统:Ceph等

应用层监控

  • 用于衡量应用程序代码的状态和性能

业务层监控

  • 用户衡量应用程序的价值,例如电子商务网站上的销售量
  • QPS,DAU日活,转化率
  • 业务接口:登录数,注册数,订单量,搜索量和支付量等

然而我们监控k8s集群主要从以下维度去做

  • Kubernetes 节点的监控:比如节点的 cpu、load、disk、memory 等指标
  • 内部系统组件的状态:比如kube-scheduler、kube-controller-manager、kubedns/coredns 等组件的详细运行状态
  • 编排级的 metrics:比如 Deployment 的状态、资源请求、调度和 API 延迟等数据指标

以下我们主要从系统层面针对k8s集群中的节点进行监控。以下是环境简要
Kubernetes v1.19.13
Prometheus v2.30.3
node_exporter v1.2.2


一、部署prometheus

# 可参考文档:章节一文章


二、配置prometheus

# 由于我们在第一章节时,把prometheus部署到K8s上的,配置文件是保存在configmap资源对象的,因此我需要修改configmap的yaml并应用。(当configmap更新之后,pod默认会在10s后更新到容器里面。即是configmap的热加载机制),然后通过请求prometheus的localhost:9090/-/reload进行配置热加载,热生效。

[root@k8s-master ~]# vim prometheus_configmap.yaml

# 源YAML文件可到Github下载:https://github.com/shaxiaozz/prometheus

apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-configmap
  namespace: monitor
data:
  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.

    # Alertmanager configuration
    alerting:
      alertmanagers:
      - static_configs:
        - targets:

    # Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
    rule_files:
    scrape_configs:
      - job_name: 'prometheus'
        static_configs:
        - targets: ['127.0.0.1:9090']
     #新增监控任务,并且目标为k8s集群中的每一个节点
      - job_name: 'k8s集群'
        static_configs:
        - targets:
          - k8s-master:9100
          - k8s-node1:9100
          - k8s-node2:9100
[root@k8s-master ~]# kubectl apply -f prometheus_configmap.yaml 
[root@k8s-master ~]# kubectl get pods -A -o wide | grep prometheus	#查看pod ip
[root@k8s-master ~]# curl -X POST http://10.244.36.78:9090/-/reload	#请求pod的api界面,讲配置热加载了

在这里插入图片描述


三、部署node_exporte

#由于我们此次是针对k8s集群中的节点进行监控,因此我们可以通过 DaemonSet 控制器来部署该服务,这样每一个节点都会自动运行一个node_exporte的Pod副本,如果我们从集群中删除或者添加节点后,Pod也会进行自动扩展。

[root@k8s-master ~]# vim node_exporter_daemonset.yaml

# 源YAML文件可到Github下载:https://github.com/shaxiaozz/prometheus

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: node-exporter
  namespace: monitor
  labels:
    name: node-exporter
spec:
  selector:
    matchLabels:
      name: node-exporter
  template:
    metadata:
      labels:
        name: node-exporter
    spec:
    #pod安全策略,使用宿主机的进程命名空间,进程间通信命名空间,网络命名空间
      hostPID: true
      hostIPC: true
      hostNetwork: true

      containers:
      - name: node-exporter
        image: prom/node-exporter:v1.2.2
        ports:
        - containerPort: 9100
        resources:
          requests:
            cpu: 150m
            memory: "128Mi"
          limits:
            cpu: 350m
            memory: "512Mi"
        securityContext:
          privileged: true
        args:
        - --path.procfs
        - /host/proc
        - --path.sysfs
        - /host/sys
        - --path.rootfs
        - /host
        - --collector.filesystem.ignored-mount-points
        - '"^/(sys|proc|dev|host|etc)($|/)"'

    #容器挂载点
        volumeMounts:
        - name: dev
          mountPath: /host/dev
          readOnly: true
        - name: proc
          mountPath: /host/proc
          readOnly: true
        - name: sys
          mountPath: /host/sys
          readOnly: true
        - name: rootfs
          mountPath: /host
          readOnly: true

    #容器存活健康检测
        livenessProbe:
          httpGet:
            port: 9100
            path: /metrics
          initialDelaySeconds: 5
          failureThreshold: 3

    #容器就绪健康检测
        readinessProbe:
          httpGet:
            port: 9100
            path: /metrics
          initialDelaySeconds: 5
          failureThreshold: 3

    #监控master节点(Master存在NoSchedule的污点,需要匹配)
      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: /

由于我们做的是系统层面的监控,而我们的node_exporte是运行在容器中的,所以我们需要在Pod中添加一些安全策略,让pod可以获取到宿主机的资源性能指标,如hostPID,hostIPC,hostNetwork。
另外我们还将宿主机的/dev,/proc,/sys这些目录都挂载到容器中,并且设置为只读模式。
另外我们需要把master节点也进行监控了。但master节点上有NoSchedule的污点存在,因此我们需要在yaml中定义tolerations,匹配此污点的也运行node_exporte的pod

[root@k8s-master ~]# kubectl apply -f node_exporter_daemonset.yaml
[root@k8s-master ~]# kubectl get ds -n monitor
[root@k8s-master ~]# kubectl get pods -n monitor -o wide

由于我们在上面的yaml文件中定义了,node_exporte共享宿主机的网络命名空间(hostNetwork: true),因此我们直接在宿主机上查看9100端口是否在监听状态,并且请求/metrics看是否有指标数据出现

[root@k8s-master ~]# netstat -lntup | grep 9100
[root@k8s-master ~]# curl 127.0.0.1:9100/metrics | more

可以从http://IP:9100/metrics的URL路径下查看到宿主机的指标数据,我们可以打开prometheus的UI界面查看一下。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

到Targets界面查看一下
在这里插入图片描述

回到PromQL界面(即首页)
我们一起来查看一下节点的CPU使用率,磁盘使用率,内存使用率
CPU在5分钟的平均使用率:
100 - (avg by (instance) (irate(node_cpu_seconds_total{ mode=“idle”}[5m])) * 100)
在这里插入图片描述

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐