k8s-8部署Prometheus+Grafana

k8s-8部署Prometheus+Grafana

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

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

一、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

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
修改文件一
  • 修改 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 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
    

    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

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

image-20220729165303014

3. 创建资源对象

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

image-20220730203531978

解决报错

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

扫描二维码关注公众号,回复: 14469935 查看本文章
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/

image-20220730204418594

4. 验证查看

查看pod状态
kubectl get pod -n monitoring

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

添加数据源

首先在左边菜单找到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 
    

    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 

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

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# 
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

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

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

image-20220730220206111

然后使用
kubectl apply -f .

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 .

image-20220730220403223

猜你喜欢

转载自blog.csdn.net/tianmingqing0806/article/details/126078457