Kubernetes集群监控方案

2023-05-16

文章目录

  • 前言
  • 一、Prometheus是什么?
    • Prometheus简介:
    • Prometheus的特点:
    • Prometheus相关组件:
  • 二、在k8s集群的所有节点上下载所需要的image
  • 三、采用daemonset方式部署node-exporter组件
  • 四、部署prometheus组件
    • 1、rbac文件
    • 2、以configmap的形式管理prometheus组件的配置文件
    • 3、Prometheus deployment 文件
    • 4、Prometheus service文件
    • 5、通过上述yaml文件创建相应的对象
  • 五、部署grafana组件
    • 1、grafana deployment配置文件
    • 2、grafana service配置文件
    • 3、grafana ingress配置文件
  • 总结


前言

本文介绍在k8s集群中使用node-exporter、prometheus、grafana对集群进行监控。
其实现原理有点类似ELK、EFK组合。node-exporter组件负责收集节点上的metrics监控数据,并将数据推送给prometheus, prometheus负责存储这些数据,grafana将这些数据通过网页以图形的形式展现给用户。


提示:以下是本篇文章正文内容,下面案例可供参考

一、Prometheus是什么?

在开始之前有必要了解下Prometheus是什么?

Prometheus简介:

Prometheus (中文名:普罗米修斯)是由 SoundCloud 开发的开源监控报警系统和时序列数据库(TSDB).自2012年起,许多公司及组织已经采用 Prometheus,并且该项目有着非常活跃的开发者和用户社区.现在已经成为一个独立的开源项目。Prometheus 在2016加入 CNCF ( Cloud Native Computing Foundation ), 作为在 kubernetes 之后的第二个由基金会主持的项目。 Prometheus 的实现参考了Google内部的监控实现,与源自Google的Kubernetes结合起来非常合适。另外相比influxdb的方案,性能更加突出,而且还内置了报警功能。它针对大规模的集群环境设计了拉取式的数据采集方式,只需要在应用里面实现一个metrics接口,然后把这个接口告诉Prometheus就可以完成数据采集了,下图为prometheus的架构图。

在这里插入图片描述

Prometheus的特点:

1、多维数据模型(时序列数据由metric名和一组key/value组成)
2、在多维度上灵活的查询语言(PromQl)
3、不依赖分布式存储,单主节点工作.
4、通过基于HTTP的pull方式采集时序数据
5、可以通过中间网关进行时序列数据推送(pushing)
6、目标服务器可以通过发现服务或者静态配置实现
7、多种可视化和仪表盘支持

Prometheus相关组件:

Prometheus生态系统由多个组件组成,其中许多是可选的:

1、Prometheus 主服务,用来抓取和存储时序数据
2、client library 用来构造应用或 exporter 代码 (go,java,python,ruby)
3、push 网关可用来支持短连接任务
4、可视化的dashboard (两种选择,promdash 和 grafana.目前主流选择是 grafana.)
4、一些特殊需求的数据出口(用于HAProxy, StatsD, Graphite等服务)
5、实验性的报警管理端(alartmanager,单独进行报警汇总,分发,屏蔽等 )

promethues 的各个组件基本都是用 golang 编写,对编译和部署十分友好.并且没有特殊依赖.基本都是独立工作。
上述文字来自网络!

现在我们正式开始部署工作。
一、环境介绍
操作系统环境:centos linux 7.2 64bit
K8S软件版本: 1.9.0(采用kubeadm方式部署)
Master节点IP: 192.168.115.5/24
Node节点IP: 192.168.115.6/24

二、在k8s集群的所有节点上下载所需要的image

需要下载的包:

# docker pull prom/node-exporter
# docker pull prom/prometheus:v2.0.0
# docker pull grafana/grafana:4.2.0

三、采用daemonset方式部署node-exporter组件

代码如下(示例):

# cat node-exporter.yaml 
---
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: node-exporter
  namespace: kube-system
  labels:
    k8s-app: node-exporter
spec:
  template:
    metadata:
      labels:
        k8s-app: node-exporter
    spec:
      containers:
      - image: prom/node-exporter
        name: node-exporter
        ports:
        - containerPort: 9100
          protocol: TCP
          name: http
---
apiVersion: v1
kind: Service
metadata:
  labels:
    k8s-app: node-exporter
  name: node-exporter
  namespace: kube-system
spec:
  ports:
  - name: http
    port: 9100
    nodePort: 31672
    protocol: TCP
  type: NodePort
  selector:
    k8s-app: node-exporter

通过上述文件创建pod和service

  # kubectl create -f  node-exporter.yaml 

四、部署prometheus组件

1、rbac文件

# cat rbac-setup.yaml 
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: prometheus
rules:
- apiGroups: [""]
  resources:
  - nodes
  - nodes/proxy
  - services
  - endpoints
  - pods
  verbs: ["get", "list", "watch"]
- apiGroups:
  - extensions
  resources:
  - ingresses
  verbs: ["get", "list", "watch"]
- nonResourceURLs: ["/metrics"]
  verbs: ["get"]
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: prometheus
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: prometheus
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: prometheus
subjects:
- kind: ServiceAccount
  name: prometheus
  namespace: kube-system

2、以configmap的形式管理prometheus组件的配置文件

# cat configmap.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-config
  namespace: kube-system
data:
  prometheus.yml: |
    global:
      scrape_interval:     15s
      evaluation_interval: 15s
    scrape_configs:
    - job_name: 'kubernetes-apiservers'
      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-nodes'
      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
 
    - job_name: 'kubernetes-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-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
 
    - job_name: 'kubernetes-services'
      kubernetes_sd_configs:
      - role: service
      metrics_path: /probe
      params:
        module: [http_2xx]
      relabel_configs:
      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_probe]
        action: keep
        regex: true
      - source_labels: [__address__]
        target_label: __param_target
      - target_label: __address__
        replacement: blackbox-exporter.example.com:9115
      - source_labels: [__param_target]
        target_label: instance
      - action: labelmap
        regex: __meta_kubernetes_service_label_(.+)
      - source_labels: [__meta_kubernetes_namespace]
        target_label: kubernetes_namespace
      - source_labels: [__meta_kubernetes_service_name]
        target_label: kubernetes_name
 
    - job_name: 'kubernetes-ingresses'
      kubernetes_sd_configs:
      - role: ingress
      relabel_configs:
      - source_labels: [__meta_kubernetes_ingress_annotation_prometheus_io_probe]
        action: keep
        regex: true
      - source_labels: [__meta_kubernetes_ingress_scheme,__address__,__meta_kubernetes_ingress_path]
        regex: (.+);(.+);(.+)
        replacement: ${1}://${2}${3}
        target_label: __param_target
      - target_label: __address__
        replacement: blackbox-exporter.example.com:9115
      - source_labels: [__param_target]
        target_label: instance
      - action: labelmap
        regex: __meta_kubernetes_ingress_label_(.+)
      - source_labels: [__meta_kubernetes_namespace]
        target_label: kubernetes_namespace
      - source_labels: [__meta_kubernetes_ingress_name]
        target_label: kubernetes_name
 
    - job_name: 'kubernetes-pods'
      kubernetes_sd_configs:
      - role: pod
      relabel_configs:
      - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
        action: keep
        regex: true
      - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
        action: replace
        target_label: __metrics_path__
        regex: (.+)
      - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]
        action: replace
        regex: ([^:]+)(?::\d+)?;(\d+)
        replacement: $1:$2
        target_label: __address__
      - action: labelmap
        regex: __meta_kubernetes_pod_label_(.+)
      - source_labels: [__meta_kubernetes_namespace]
        action: replace
        target_label: kubernetes_namespace
      - source_labels: [__meta_kubernetes_pod_name]
        action: replace
        target_label: kubernetes_pod_name

3、Prometheus deployment 文件

# cat prometheus.deploy.yml 
---
apiVersion: apps/v1beta2
kind: Deployment
metadata:
  labels:
    name: prometheus-deployment
  name: prometheus
  namespace: kube-system
spec:
  replicas: 1
  selector:
    matchLabels:
      app: prometheus
  template:
    metadata:
      labels:
        app: prometheus
    spec:
      containers:
      - image: prom/prometheus:v2.0.0
        name: prometheus
        command:
        - "/bin/prometheus"
        args:
        - "--config.file=/etc/prometheus/prometheus.yml"
        - "--storage.tsdb.path=/prometheus"
        - "--storage.tsdb.retention=24h"
        ports:
        - containerPort: 9090
          protocol: TCP
        volumeMounts:
        - mountPath: "/prometheus"
          name: data
        - mountPath: "/etc/prometheus"
          name: config-volume
        resources:
          requests:
            cpu: 100m
            memory: 100Mi
          limits:
            cpu: 500m
            memory: 2500Mi
      serviceAccountName: prometheus    
      volumes:
      - name: data
        emptyDir: {}
      - name: config-volume
        configMap:
          name: prometheus-config       

4、Prometheus service文件

# cat prometheus.svc.yml 
---
kind: Service
apiVersion: v1
metadata:
  labels:
    app: prometheus
  name: prometheus
  namespace: kube-system
spec:
  type: NodePort
  ports:
  - port: 9090
    targetPort: 9090
    nodePort: 30003
  selector:
    app: prometheus

5、通过上述yaml文件创建相应的对象

# kubectl create -f  rbac-setup.yaml
# kubectl create -f  configmap.yaml 
# kubectl create -f  prometheus.deploy.yml 
# kubectl create -f  prometheus.svc.yml 

在这里插入图片描述
在这里插入图片描述

Node-exporter对应的nodeport端口为31672,通过访问http://192.168.115.5:31672/metrics 可以看到对应的metrics

在这里插入图片描述

prometheus对应的nodeport端口为30003,通过访问http://192.168.115.5:30003/target 可以看到prometheus已经成功连接上了k8s的apiserver

在这里插入图片描述
可以在prometheus的WEB界面上提供了基本的查询K8S集群中每个POD的CPU使用情况,查询条件如下:

sum by (pod_name)( rate(container_cpu_usage_seconds_total{image!="", pod_name!=""}[1m] ) )

在这里插入图片描述
上述的查询有出现数据,说明node-exporter往prometheus中写入数据正常,接下来我们就可以部署grafana组件,实现更友好的webui展示数据了。


五、部署grafana组件

1、grafana deployment配置文件

# cat grafana-deploy.yaml 
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: grafana-core
  namespace: kube-system
  labels:
    app: grafana
    component: core
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: grafana
        component: core
    spec:
      containers:
      - image: grafana/grafana:4.2.0
        name: grafana-core
        imagePullPolicy: IfNotPresent
        # env:
        resources:
          # keep request = limit to keep this container in guaranteed class
          limits:
            cpu: 100m
            memory: 100Mi
          requests:
            cpu: 100m
            memory: 100Mi
        env:
          # The following env variables set up basic auth twith the default admin user and admin password.
          - name: GF_AUTH_BASIC_ENABLED
            value: "true"
          - name: GF_AUTH_ANONYMOUS_ENABLED
            value: "false"
          # - name: GF_AUTH_ANONYMOUS_ORG_ROLE
          #   value: Admin
          # does not really work, because of template variables in exported dashboards:
          # - name: GF_DASHBOARDS_JSON_ENABLED
          #   value: "true"
        readinessProbe:
          httpGet:
            path: /login
            port: 3000
          # initialDelaySeconds: 30
          # timeoutSeconds: 1
        volumeMounts:
        - name: grafana-persistent-storage
          mountPath: /var
      volumes:
      - name: grafana-persistent-storage
        emptyDir: {}

2、grafana service配置文件

# cat grafana-svc.yaml 
apiVersion: v1
kind: Service
metadata:
  name: grafana
  namespace: kube-system
  labels:
    app: grafana
    component: core
spec:
  type: NodePort
  ports:
    - port: 3000
  selector:
    app: grafana
component: core

3、grafana ingress配置文件

# cat grafana-ing.yaml 
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
   name: grafana
   namespace: kube-system
spec:
   rules:
   - host: k8s.grafana
     http:
       paths:
       - path: /
         backend:
          serviceName: grafana
          servicePort: 3000

通过访问traefik的webui可以看到k8s.grafana服务发布成功
在这里插入图片描述
修改hosts解析,访问测试
在这里插入图片描述
在这里插入图片描述
也可以直接访问nodeport端口
在这里插入图片描述
默认用户名和密码都是admin
在这里插入图片描述
配置数据源为prometheus
在这里插入图片描述
导入面板,可以直接输入模板编号315在线导入,或者下载好对应的json模板文件本地导入,面板模板下载地址https://grafana.com/dashboards/315
在这里插入图片描述
导入面板之后就可以看到对应的监控数据了。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里要说明一下,在测试过程中,导入编号为162的模板,发现只有部分数据,且pod的名称显示不友好。模板地址https://grafana.com/dashboards/162,详见下图。
在这里插入图片描述

总结

这里存在一些问题后续要继续研究解决。

  1. prometheus的数据存储采用emptydir。如果Pod被删除,或者Pod发生迁移,emptyDir也会被删除,并且永久丢失。后续可以在K8S集群外部再配置一个Prometheus系统来永久保存监控数据, 两个prometheus系统之间通过配置job自动进行数据拉取。
  2. Grafana的配置数据存储采用emptydir。如果Pod被删除,或者Pod发生迁移,emptyDir也会被删除,并且永久丢失。我们也可以选择将grafana配置在k8s外部,数据源选择K8S集群外部的prometheus即可。
  3. 关于监控项的报警(alertmanager)尚未配置。

参考文档,感谢作者分享!

https://www.kubernetes.org.cn/3418.html
https://blog.qikqiak.com/post/kubernetes-monitor-prometheus-grafana/
https://github.com/giantswarm/kubernetes-prometheus/tree/master/manifests
https://segmentfault.com/a/1190000013245394

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Kubernetes集群监控方案 的相关文章

随机推荐

  • TMS320F28377X芯片can通信心得笔记(2)——流程细节

    一 xff0c 前言 补充上一篇文章 TMS320F28377X芯片can通信心得笔记 xff0c 之前一直找不到清晰又压缩的方式把图片缩小 二 xff0c 补充流程如图片和部分代码 带颜色 和带 号部分为中断配置 1 CAN配置部分代码
  • IDEA创建一个servlet项目

    1 File gt project gt java project 选中web application 如果选择java Enterprise可以免去后期导入servlet api jar包和配置Tomcat xff0c 但是需要在proj
  • STM32系列单片机的标准外设库、HAL库和LL库的区别和介绍

    本文转载自CSDN博客 xff1a ZCShouEXP xff0c 点击此处跳转至原博客 STM32 Embedded Software 工作以来一直使用意法半导体 xff08 ST xff09 的STM32系列MCU xff0c ST为开
  • Github的wiki编写

    全球最大的wiki xff0c 应该就是维基百科吧 xff0c 其实百度百科 xff0c csdn写博客等等也是wiki 不久前自己接触了Github wiki的编写 xff0c 因此做个记录吧 模式一般选择Markdown xff0c 因
  • EGOPlanner—Prometheus代码阅读笔记汇总

    Prometheusv2中的EGOSwarm代码阅读笔记 xff0c 个人学习用 目前还有部分代码没看明白 xff0c 欢迎大家交流 xff01 主要参考资料 xff1a Fast Planner 代码解读参考资料整理 EGO Swarm代
  • UAVControl—Prometheus代码阅读笔记【二】——节点实现

    Prometheusv2中的uav control代码阅读笔记 xff0c 个人学习用 内容正在补充中 xff0c 欢迎大家交流 xff01 代码来源 xff1a https github com amov lab Prometheus 二
  • 记录Ubuntu server不能输入中文的全记录--没有解决(最后靠装的桌面版+x11vnc解决)

    1 网上查到的资料都是针对桌面版本的 xff0c 所以先安装了一个vnc桌面 xff0c 至少右击可以看到包含了系统属性 参考链接 xff1a https blog csdn net wayway0554 article details 8
  • int 和 Integer的区别

    int 和 Integer的区别 分析intIntegerint 与 Integer 的区别相同值下的 int 和 Integer 的比较结果 分析 int int 是java的基本数据类型 Integer Integer 继承了Objec
  • C/C++ 使用信号量控制线程运行顺序

    span class token macro property span class token directive keyword include span span class token string lt stdio h gt sp
  • C++ 问题整理

    说一下C 43 43 和C的区别 设计思想上 xff1a C 43 43 是面向对象的语言 xff0c 而 C 是面向过程的结构化编程语言 C 43 43 具有封装 继承和多态三种特性 C 43 43 支持范式编程 xff0c 比如模板类
  • 职业向导 - 面试题目汇总(嵌入式篇)

    自己踩的坑 存储类操作系统类总线类工具实用类基本电路知识类计算机语言类 存储类 SDRAM SRAM DRAM PSRAM xff0c NOR Flash Nand Flash不同 TablesChineseFull NameSDRAMab
  • ROS笔记(一)xxx.launch文件详解

    ROS笔记 一 xxx launch文件详解 launch文件是ROS中用于同时启动多个节点的重要文件 在大型的ROS项目中使用频繁 所以掌握其主要元素与属性对ROS系统的应用至关重要 xff1a launch标签 元素 说明launch拓
  • 【OpenCV/aruco】第一个AR Demo-二维图片

    说在前面 操作系统 xff1a win10 vs 版本 xff1a 2017 opencv版本 xff1a 4 0 1 opencv contrb版本 xff1a 4 0 1 接上篇 xff1a OpenCV aruco 校准相机 Came
  • 学C++就学服务端,先把apue和unp两卷看了,接着libevent,出来找工作应该没问题

    学C 43 43 就学服务端 xff0c 先把apue和unp两卷看了 xff0c 接着libevent xff0c 出来找工作应该没问题
  • 详解双闭环控制算法(理论篇)

    什么是双闭环控制 双闭环控制算法是一种先进的控制方法 xff0c 它针对控制系统中存在的多种干扰和变化进行优化 xff0c 提高系统的稳定性 精度和响应速度 双闭环控制算法由内环和外环组成 xff0c 分别控制系统的快速响应和系统稳定 内环
  • rtthread中使用sqlite

    一 简介 SQLite是一款嵌入式 轻量级的关系型数据库系统 xff0c 它的设计目标是嵌入式的 xff0c 而且目前已经在很多嵌入式产品中使用了它 它占用资源非常的低 xff0c 在嵌入式设备中 xff0c 可能只需要几百K的内存就够了
  • Pycharm报错:ERROR: Command "python setup.py egg_info" failed with error code 1

    今天在调试程序的时候 xff0c Pycharm报了这个错 xff0c 然后自己弄了半天 最后发现其实原因在一个很简单的地方 xff0c 我却没发现 下面开始介绍怎么处理这个错误 xff0c 只是有可能的解决方法 xff0c 不一定适合所有
  • ubuntu下串口发送或者接收(c语言实现)minicom调试

    关于串口的知识这里就不累赘了 xff0c 看着多又烦 xff0c 搞这个的都懂串口 xff0c 不多废话了 xff01 xff01 进入正题 xff01 xff01 1 选择合适的usb串口模块 某宝很多这种模块 xff0c 有各种型号的
  • 解决ssh登录,找不到匹配的host key算法

    使用SSH登录某台机器 xff0c 有时因为server端的一些变动 xff0c 会出现以下信息 xff1a 找不到匹配的host key算法 xff08 此处先不提及原理 xff0c 只讲处理方法 xff0c 需要了解原因的请留言或找其他
  • Kubernetes集群监控方案

    文章目录 前言一 Prometheus是什么 Prometheus简介 xff1a Prometheus的特点 xff1a Prometheus相关组件 xff1a 二 在k8s集群的所有节点上下载所需要的image三 采用daemonse