• k8s-8部署Prometheus+Grafana


    k8s-8部署Prometheus+Grafana

    采用文章大佬–为了提高自己的k8s熟练,按照这位大佬的文章做了一遍

    https://www.yuque.com/cuiliang-s1qrv/k8s/yyiswl
    
    • 1

    一、Prometheus介绍

    如果已安装metrics-server需要先卸载,否则冲突

    1. Prometheus(普罗米修斯)是一套开源的监控&报警&时间序列数据库的组合,起始是由SoundCloud公司开发的。随着发展,越来越多公司和组织接受采用Prometheus,社会也十分活跃,他们便将它独立成开源项目。现在最常见的Kubernetes容器管理系统中,通常会搭配Prometheus进行监控。
    2. Prometheus基本原理是通过HTTP协议周期性抓取被监控组件的状态,这样做的好处是任意组件只要提供HTTP接口就可以接入监控系统,不需要任何SDK或者其他的集成过程。这样做非常适合虚拟化环境比如VM或者Docker
    3. 输出被监控组件信息的HTTP接口被叫做exporter
      。目前互联网公司常用的组件大部分都有exporter可以直接使用,比如Varnish、Haproxy、Nginx、MySQL、Linux
      系统信息 (包括磁盘、内存、CPU、网络等等)
    4. 与其他监控系统相比,Prometheus的主要特点是:
    • 一个多维数据模型(时间序列由指标名称定义和设置键/值尺寸);
    • 非常高效的存储;
    • 一种灵活的查询语言;
    • 不依赖分布式存储,单个服务器节点;
    • 时间集合通过HTTP上的PULL模型进行;
    • 通过中间网关支持推送时间;
    • 通过服务发现或静态配置发现目标;
    • 多种模式的图形和仪表板支持。

    二、Grafana介绍

    Grafana是一个跨平台的开源的度量分析和可视化工具,可以通过将采集的数据查询然后可视化的展示,并及时通知。它主要有以下六大特点:

    • 展示方式:快速灵活的客户端图表,面板插件有许多不同方式的可视化指标和日志,官方库中具有丰富的仪表盘插件,比如热图、折线图、图表等多种展示方式;
    • 数据源:Graphite,InfluxDB,OpenTSDB,Prometheus,Elasticsearch,CloudWatch和KairosDB等;
    • 通知提醒:以可视方式定义最重要指标的警报规则,Grafana将不断计算并发送通知,在数据达到阈值时通过Slack、PagerDuty等获得通知;
    • 混合展示:在同一图表中混合使用不同的数据源,可以基于每个查询指定数据源,甚至自定义数据源;
    • 注释:使用来自不同数据源的丰富事件注释图表,将鼠标悬停在事件上会显示完整的事件元数据和标记;
    • 过滤器:Ad-hoc过滤器允许动态创建新的键/值过滤器,这些过滤器会自动应用于使用该数据源的所有查询。

    三、组件说明

    1. MetricServer:是kubernetes集群资源使用情况的聚合器,收集数据给kubernetes集群内使用,如kubectl,hpa,scheduler等。
    2. PrometheusOperator:是一个系统监测和警报工具箱,用来存储监控数据。
    3. NodeExporter:用于各node的关键度量指标状态数据。
    4. KubeStateMetrics:收集kubernetes集群内资源对象数据,制定告警规则。
    5. Prometheus:采用pull方式收集apiserver,scheduler,controller-manager,kubelet组件数据,通过http协议传输。
    6. Grafana:是可视化数据统计和监控平台。

    四、安装部署

    1. git项目至本地

    # git clone https://github.com/coreos/kube-prometheus.git
    
    • 1

    image-20220729163113945

    2. 修改资源清单文件

    root@k8s-master:~/k8s-Prometheus# cd kube-prometheus/
    root@k8s-master:~/k8s-Prometheus/kube-prometheus# ls
    build.sh	    CONTRIBUTING.md	 example.jsonnet  go.mod   jsonnetfile.json	      kustomization.yaml  manifests   scripts
    CHANGELOG.md	    developer-workspace  examples	  go.sum   jsonnetfile.lock.json      LICENSE		  README.md   tests
    code-of-conduct.md  docs		 experimental	  jsonnet  kubescape-exceptions.json  Makefile		  RELEASE.md
    
    • 1
    • 2
    • 3
    • 4
    • 5
    修改文件一
    • 修改 kube-prometheus/manifests/grafana-service.yaml 文件,使用 nodepode 方式

      root@k8s-master:~/k8s-Prometheus/kube-prometheus/manifests# 
      root@k8s-master:~/k8s-Prometheus/kube-prometheus/manifests# pwd
      /root/k8s-Prometheus/kube-prometheus/manifests
      root@k8s-master:~/k8s-Prometheus/kube-prometheus/manifests# vim grafana-service.yaml
      
      • 1
      • 2
      • 3
      • 4
        1 apiVersion: v1
        2 kind: Service
        3 metadata:
        4   labels:
        5     app.kubernetes.io/component: grafana
        6     app.kubernetes.io/name: grafana
        7     app.kubernetes.io/part-of: kube-prometheus
        8     app.kubernetes.io/version: 9.0.4
        9   name: grafana
       10   namespace: monitoring
       11 spec:
       12   type: NodePort
       13   ports:
       14   - name: http
       15     port: 3000
       16     targetPort: http
       17     nodePort: 30100
       18   selector:
       19     app.kubernetes.io/component: grafana
       20     app.kubernetes.io/name: grafana
       21     app.kubernetes.io/part-of: kube-prometheus
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21

      image-20220729163753310

    修改文件二

    修改 kube-prometheus/manifests/prometheus-service.yaml,改为nodepode方式

      1 apiVersion: v1
      2 kind: Service
      3 metadata:
      4   labels:
      5     app.kubernetes.io/component: prometheus
      6     app.kubernetes.io/instance: k8s
      7     app.kubernetes.io/name: prometheus
      8     app.kubernetes.io/part-of: kube-prometheus
      9     app.kubernetes.io/version: 2.37.0
     10   name: prometheus-k8s
     11   namespace: monitoring
     12 spec:
     13   type: NodePort
     14   ports:
     15   - name: web
     16     port: 9090
     17     targetPort: web
     18     nodePort: 30200
     19   selector:
     20     app.kubernetes.io/component: prometheus
     21     app.kubernetes.io/instance: k8s
     22     app.kubernetes.io/name: prometheus
     23     app.kubernetes.io/part-of: kube-prometheus
     24   sessionAffinity: ClientIP
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    image-20220729164933732

    修改文件三
    • 修改 kube-prometheus/manifests/alertmanager-service.yaml,改为 nodepode
      1 apiVersion: v1
      2 kind: Service
      3 metadata:
      4   labels:
      5     app.kubernetes.io/component: alert-router
      6     app.kubernetes.io/instance: main
      7     app.kubernetes.io/name: alertmanager
      8     app.kubernetes.io/part-of: kube-prometheus
      9     app.kubernetes.io/version: 0.24.0
     10   name: alertmanager-main
     11   namespace: monitoring
     12 spec:
     13   type: NodePort
     14   ports:
     15   - name: web
     16     port: 9093
     17     targetPort: web
     18     nodePort: 30300
     19   selector:
     20     app.kubernetes.io/component: alert-router
     21     app.kubernetes.io/instance: main
     22     app.kubernetes.io/name: alertmanager
     23     app.kubernetes.io/part-of: kube-prometheus
     24   sessionAffinity: ClientIP
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    image-20220729165303014

    3. 创建资源对象

    • 创建monitoring名称空间
      `# kubectl create namespace monitoring` 
      - 创建crd资源
        `# kubectl apply -f kube-prometheus/manifests/setup/` 
      - 创建其他资源
        `# kubectl apply -f kube-prometheus/manifests/` 
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      遇到报错
      error: unable to recognize "kube-prometheus/manifests/prometheus-prometheus.yaml": no matches for kind "Prometheus" in version "monitoring.coreos.com/v1"
      
      • 1

    image-20220730203531978

    解决报错

    没有采用上面命令,采用的下面解决报错命令

    https://blog.csdn.net/weixin_48351036  #解决问题文章
    
    解决办法:
    ``
     
    $ kubectl create -f manifests/setup
    
    
    $ until kubectl get servicemonitors --all-namespaces ; do date; sleep 1; echo ""; done
    
    
    $ kubectl create -f manifests/
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    image-20220730204418594

    4. 验证查看

    查看pod状态
    kubectl get pod -n monitoring
    
    • 1

    image-20220730204710662

    查看top信息

    image-20220730204911750

    5. web访问验证

    访问prometheus http://196.196.196.11:30200/targets,查看节点状态

    image-20220730205035734

    访问 grafana http://196.196.196.11:30100/login,默认用户名和密码是admin/admin

    image-20220730205217733

    配置数据源

    image-20220730205430120

    使用默认配置,点击测试

    image-20220730205404788

    image-20220730205528630

    导入默认仪表盘

    添加数据源

    配置文档

    https://jingyan.baidu.com/article/9faa7231ae65c2063c28cba9.html
    
    • 1

    添加数据源

    首先在左边菜单找到setting设置按钮,然后在设备选项里面找到数据源data source点击进去

    grafana添加prometheus数据源并导入仪表盘展示

    然后在界面点击add data source按钮,进入添加数据源的页面

    grafana添加prometheus数据源并导入仪表盘展示

    然后在数据源添加的界面选择你的数据源类型,这里用的是prometheus数据源,点击它就行

    grafana添加prometheus数据源并导入仪表盘展示

    然后设置数据源中的一些参数及数据源服务地址,主要是设置url,其他可以默认

    grafana添加prometheus数据源并导入仪表盘展示

    然后点击save & test按钮,然后提示data source is working,就代表添加成功了,关掉该页面

    grafana添加prometheus数据源并导入仪表盘展示

    END

    添加仪表盘模版

    点击左侧的加号的符号,然后在里面点击import导入按钮

    grafana添加prometheus数据源并导入仪表盘展示

    然后输入模版的code,可以去官网找你喜欢的模版,然后复制code在这里添加即可

    grafana添加prometheus数据源并导入仪表盘展示

    模板导入后,会进行数据源的选择,这里选择prometheus,然后点击import按钮就成功导入了

    grafana添加prometheus数据源并导入仪表盘展示

    image-20220730212057578

    点击home选择仪表盘查看

    image-20220730213212774

    配置prometheus

    两个监控任务没有对应的目标

    image-20220730213332688

    1. 新建prometheus-kubeSchedulerService.yaml并apply创建资源
      apiVersion: v1
      kind: Service
      metadata:
        namespace: kube-system
        name: kube-scheduler
        labels:
          k8s-app: kube-scheduler #与servicemonitor中的selector匹配
      spec:
        selector: 
          component: kube-scheduler # 与scheduler的pod标签一直
        ports:
        - name: http-metrics
          port: 10251
          targetPort: 10251
          protocol: TCP 
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15

      image-20220730215249957

    新建prometheus-kubeControllerManagerService.yaml并apply创建资源
    apiVersion: v1
    kind: Service
    metadata:
       namespace: kube-system
       name: kube-controller-manager
       labels:
        k8s-app: kube-controller-manager
    spec:
      selector:
        component: kube-controller-manager
      ports:
      - name: http-metrics
        port: 10252
        targetPort: 10252
        protocol: TCP 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    image-20220730215355323

    查看prometheus-serviceMonitorKubeScheduler.yaml 文件,并apply创建资源
    apiVersion: monitoring.coreos.com/v1
    kind: ServiceMonitor
    metadata:
      labels:
        k8s-app: kube-scheduler
      name: kube-scheduler
      namespace: monitoring
    spec:
      endpoints:
      - bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
        interval: 30s # 每30秒采集一次信息
        port: https-metrics # 对应service的端口名
        scheme: https
        tlsConfig:
          insecureSkipVerify: true
      jobLabel: k8s-app
      namespaceSelector: 
        matchNames:
        - kube-system
        # selector匹配的资源标签为k8s-app=kube-scheduler
      selector:
        matchLabels:
          k8s-app: kube-scheduler
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    image-20220730215516616

    再次查看targets信息

    image-20220730215555815

    六、部署pushgateway

    1. pushgetway目录下,创建这三个yaml文件。
    root@k8s-master:~/k8s-Prometheus/kube-prometheus# pwd
    /root/k8s-Prometheus/kube-prometheus
    root@k8s-master:~/k8s-Prometheus/kube-prometheus# mkdir pushgetway
    root@k8s-master:~/k8s-Prometheus/kube-prometheus# cd pushgetway/
    root@k8s-master:~/k8s-Prometheus/kube-prometheus/pushgetway# 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    vim  prometheus-pushgatewayServiceMonitor.yaml
    
    apiVersion: monitoring.coreos.com/v1
    kind: ServiceMonitor
    metadata:
      labels:
        prometheus: k8s
      name: prometheus-pushgateway
      namespace: monitoring
    spec:
      endpoints:
      - honorLabels: true
        port: http
      jobLabel: k8s-app
      selector:
        matchLabels:
          app: prometheus-pushgateway
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    image-20220730215958567

    第二个文件
    vim prometheus-pushgatewayService.yaml
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app: prometheus-pushgateway
      name: prometheus-pushgateway
      namespace: monitoring
    spec:
      type: NodePort
      ports:
      - name: http
        port: 9091
        nodePort: 30400
        targetPort: metrics
      selector:
        app: prometheus-pushgateway
    #  type: ClusterIP
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    image-20220730220111097

    第三个文件
    vim prometheus-pushgatewayDeployment.yaml
    
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: prometheus-pushgateway
      name: prometheus-pushgateway
      namespace: monitoring
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: prometheus-pushgateway
      template:
        metadata:
          labels:
            app: prometheus-pushgateway
        spec:
          containers:
          - image: prom/pushgateway:v0.8.0
            livenessProbe:
              httpGet:
                path: /#/status
                port: 9091
              initialDelaySeconds: 10
              timeoutSeconds: 10
            name: prometheus-pushgateway
            ports:
            - containerPort: 9091
              name: metrics
            readinessProbe:
              httpGet:
                path: /#/status
                port: 9091
              initialDelaySeconds: 10
              timeoutSeconds: 10
            resources:
              limits:
                cpu: 50m
                memory: 100Mi
              requests:
                cpu: 50m
                memory: 100Mi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    image-20220730220206111

    然后使用
    kubectl apply -f .
    
    • 1

    nds: 10
    name: prometheus-pushgateway
    ports:
    - containerPort: 9091
    name: metrics
    readinessProbe:
    httpGet:
    path: /#/status
    port: 9091
    initialDelaySeconds: 10
    timeoutSeconds: 10
    resources:
    limits:
    cpu: 50m
    memory: 100Mi
    requests:
    cpu: 50m
    memory: 100Mi

    
    [外链图片转存中...(img-4VBPkFaF-1659189962398)]
    
    ###### 然后使用
    
    ```shell
    kubectl apply -f .
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    image-20220730220403223

  • 相关阅读:
    SpringBoot框架
    [VIM] config
    软考架构师知识点
    Thread的基本用法
    Flutter组件--Padding和AnimatedPadding
    Eureka介绍和使用
    学习如何读论文的一些磨刀不误砍柴工
    IOS OpenGL ES GPUImage 图像Lanczos重取样模糊效果 GPUImageLanczosResamplingFilter
    .locked勒索病毒的最新威胁:如何恢复您的数据?
    Java实现快速排序
  • 原文地址:https://blog.csdn.net/tianmingqing0806/article/details/126078457