干货速看!同行盆友来稿:一文带你搭建K8S高可用集群,以及在上面搭建Prometheus和Grafana。2

本文涉及的产品
可观测监控 Prometheus 版,每月50GB免费额度
可观测可视化 Grafana 版,10个用户账号 1个月
简介: 干货速看!同行盆友来稿:一文带你搭建K8S高可用集群,以及在上面搭建Prometheus和Grafana。

(3)Prometheus关键组件

「*Promethus server*」

Promethus server 是promethus组件的核心部分

负责实现监控数据的获取、存储以及查询,提供PromQL查询语言支持

Retrieval:采样模块,prometheus的服务器在哪里拉取数据,检索拉取到的数据分发给 TSDB进行存储

TSDB:存储模块默认本地存储为TSDB

HTTP server : 提供http接口查询和面板,默认端口为9090

「*Nodeport业务数据源*」

业务数据源通过pull/push两种方式推送数据到promethus server

支持其他数据源的指标导入到prometheus,支持数据库,硬件,消息中间件,存储系统。http服务器,jmx等

负责收集目标对象的性能数据,并通过http接口供prometheus server获取

只要符合接口格式,就可以被采集

「*Mysqld_exporter*」

用于监控mysql指标的一个导出器,支持对mysql5.5以上进行监控。

「*altermanager报警管理器*」

Promethus通过配置报警规则,如果符合报警规则,那么就将报警推送到altermanager。

「*可视化监控界面*」

promethus收集到数据之后,由webui界面进行可视化图标展示,目前我们可以通过自定义的api客户端进行调用数据展示,也可以直接使用grafana解决方案来展示。

「*short-lived jobs:*」存在时间不足以被删除的短暂或批量业务,无法通过pull的方式拉取,需要使用push的方式,与pushgeteway结合使用。

「*Service Discovery:*」服务发现,prometheus支持多种服务发现机制:文件,DNS,k8s,openstack,等,基于服务发现的过程,通过第三方接口,prometheus查询到需要监控的target列表,然后轮询这些target获取监控数据。

「*客户端SDK*」官方提供的客户端类库有go,java,python,ruby

「*pushgateway*」支持临时性的job主动推送指标的中间网关,prometheus默认通过pull方式从exporters拉取,但有些情况我们是不允许promethes

与exporters直接进行通信的,这时候我们可以使用pushgateway由客户端主动push数据到pushgateway,在由prometheus拉取。很

多时候我们需要自定义一些组件来采集

「*proDash*」使用rails开发的dashboard,用于可视化指标数据

(4)工作过程

  • prometheus server 定期从配置好的jobs或者exporters中拉metrics.或者接受来自pushgateway发过来的metrics,或者从其他的  prometheus server中拉取metrics。
  • prometheus server 在本地存储收集到的metrics,并运行已经定义好的arlt.rules,记录新的时间序列或者向alertmanager推送报警。
  • Alertmanager根据配置文件,对接受的警报进行处理,发出告警。
  • 在图形界面中,可视化采集数据,可以使用别人写好的grafana模板。

1.1实操步骤

1.1.2 master创建一个命名空间
### master创建namespace
[root@k8s-master-01]#Vim prometheus_grafana_namespaces.yaml
apiVersion: v1
kind: Namespace 
metadata: 
name: prom-grafana 
labels: 
name: prom-grafana
[root@k8s-master-01 ]# kubectl create -f prom-grafana-namespaces.yaml
### master创建一个SA账号
[root@k8s-master-01]# kubectl create serviceaccount drifter -n prom-grafana
### matser节点把sa 账号drifter通过clusterrolebing绑定到clusterrole上
[root@k8s-master-01 ]# kubectl create clusterrolebinding drifter-clusterrolebinding -n prom-grafana --clusterrole=cluster-admin  --serviceaccount=prom-grafana:drifter
####在集群的任意节点上创建一个数据目录
mkdir /data
chmod 777 /data/
1.1.3 master创建一个configmap存储卷,用来存放prometheus配置信息
[root@k8s-master-01]#vim prometheus-cfg.yaml
---
kind: ConfigMap
apiVersion: v1
metadata:
  labels:
    app: prometheus
  name: prometheus-config
  namespace: monitor-sa
data:
  prometheus.yml: |
    global:
      scrape_interval: 15s
      scrape_timeout: 10s
      evaluation_interval: 1m
    scrape_configs:
    - job_name: 'kubernetes-node'
      kubernetes_sd_configs:
      - role: node
      relabel_configs:
      - source_labels: [__address__]
        regex: '(.*):10250'
        replacement: '${1}:9100'
        target_label: __address__
        action: replace
      - action: labelmap
        regex: __meta_kubernetes_node_label_(.+)
    - job_name: 'kubernetes-node-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-apiserver'
      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-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
### 创建存储卷pod
kubectl create -f prometheus-cfg.yaml
1.1.4通过deployment部署prometheus server
[root@k8s-master-01]#Vim  prometheus-deployment.yaml
[root@k8s-master-01 ]# more prometheus-deployment.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: prometheus-server
  namespace: prom-grafana
  labels:
    app: prometheus
spec:
  replicas: 1
  selector:
    matchLabels:
      app: prometheus
      component: server
    #matchExpressions:
    #- {key: app, operator: In, values: [prometheus]}
    #- {key: component, operator: In, values: [server]}
  template:
    metadata:
      labels:
        app: prometheus
        component: server
      annotations:
        prometheus.io/scrape: 'false'
    spec:
      nodeName: k8s-node-02  #prometheus调度到这个节点上。
      serviceAccountName: drifter
      containers:
      - name: prometheus
        image: prom/prometheus:v2.2.1
        imagePullPolicy: IfNotPresent
        command:
          - prometheus
          - --config.file=/etc/prometheus/prometheus.yml
          - --storage.tsdb.path=/prometheus
          - --storage.tsdb.retention=720h
        ports:
        - containerPort: 9090
          protocol: TCP
        volumeMounts:
        - mountPath: /etc/prometheus/prometheus.yml
          name: prometheus-config
          subPath: prometheus.yml
        - mountPath: /prometheus/
          name: prometheus-storage-volume
      volumes:
        - name: prometheus-config
          configMap:
            name: prometheus-config
            items:
              - key: prometheus.yml
                path: prometheus.yml
                mode: 0644
        - name: prometheus-storage-volume
          hostPath:
           path: /data
           type: Directory
###创建prometheus server pod
kubectl create -f prometheus-deployment.yaml
###查看prometheus server pod状态信息
kubectl get pod -n prom-grafana
1.1.5 对外暴露prometheus端口
###prometheus pod创建一个service
[root@k8s-master-01]#vim  prometheus-svc.yaml
---
apiVersion: v1
kind: Service
metadata:
  name: prometheus-server
  namespace: prom-grafana
  labels:
    app: prometheus
spec:
#  type: NodePort     
  type: ClusterIP     
  ports:
    - port: 9090
      targetPort: 9090
#      protocol: TCP
  selector:
    app: prometheus
    component: prometheus-server
###对外暴露prometheus端口
[root@k8s-master-01]#kubectl create -f prometheus-svc.yaml
###查看pod状态信息
[root@k8s-master-01]#kubectl get svc -n prom-grafana
NAME                TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
prometheus-server   ClusterIP   10.103.172.209   <none>        9090/TCP   4m57s
1.1.6prometheus热更新
为了每次修改配置文件可以热加载prometheus,也就是不停止prometheus,就可以使配置生效,如修改prometheus-cfg.yaml,想要使配置生效可用如下热加载命令:
curl -X POST http://100.119.255.145:9090/-/reload
###热加载速度比较慢,可以暴力重启prometheus,如修改上面的prometheus-cfg.yaml文件之后,可执行如下强制删除:
[root@k8s-master-01]#kubectl delete -f prometheus-cfg.yaml
[root@k8s-master-01]#kubectl delete -f prometheus-deployment.yaml
###然后再通过apply更新:
[root@k8s-master-01]#kubectl apply -f prometheus-cfg.yaml
[root@k8s-master-01]#kubectl apply -f prometheus-deployment.yaml
注意:线上最好热加载,暴力删除可能造成监控数据的丢失
1.1.7 master节点部署node-porter组件

采集机器(物理机、虚拟机、云主机等)的监控指标数据,能够采集到的指标包括CPU, 内存,磁盘,网络,文件数等信息。

[root@k8s-master-01]#vim node-export.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: node-exporter
  namespace: prom-grafana
  labels:
    name: node-exporter
spec:
  selector:
    matchLabels:
     name: node-exporter
  template:
    metadata:
      labels:
        name: node-exporter
    spec:
      hostPID: true
      hostIPC: true
      hostNetwork: true
      containers:
      - name: node-exporter
        image: prom/node-exporter:v0.16.0
        ports:
        - containerPort: 9100
        resources:
          requests:
            cpu: 0.15
        securityContext:
          privileged: true
        args:
        - --path.procfs
        - /host/proc
        - --path.sysfs
        - /host/sys
        - --collector.filesystem.ignored-mount-points
        - '"^/(sys|proc|dev|host|etc)($|/)"'
        volumeMounts:
        - name: dev
          mountPath: /host/dev
        - name: proc
          mountPath: /host/proc
        - name: sys
          mountPath: /host/sys
        - name: rootfs
          mountPath: /rootfs
      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: /
 [root@k8s-master-01]#kubectl create -f node-export.yaml
 [root@k8s-master-01]#kubectl get pods -n prom-grafana 查看到pod处于running状态则证明pod创建成功
node-export默认的监听端口是9100,可以看到当前主机获取到的所有监控数据(如图)

三、k8s搭建Grafana

1.grafana介绍

(1)什么是grafana

简单来说,是一个多用途的监控工具,同时邮件等方式进行有效的预警通知,丰富直观的可视化界面,是一种数据源配置是其优点所在,是一个跨平台的源的度量分析和可视化工具,可与通过将采集的数据查询然后可视化的展示并及时通知。

1、展示方式:

客户端可视化有丰富的仪表盘比如热图、折线图等多种展示方式

2、数据源:Graphite,InfluxDB,OpenTSDB,Prometheus,Elasticsearch,CloudWatch和KairosDB等

3、通知提醒:可视方式展示重要指标的报警规则,它将不断计算发送通知,在数据达到阈值时Slack、PagerDuty等获得通知

4、混合展示:在同一图表中混合使用不同数据源,可以基于每个查询指定数据源,甚至自定义数据源

5、注释:使用来自不同数据源的丰富事件注释图表,将鼠标悬停在事件上会显示完整的事件元数据和标记

6、过滤器:Ad-hoc过滤器允许动态创建新的键/值过滤器,这些过滤器会自动应用于使用该数据源的所有查询。

(2)Grafana结构

![img](file:///C:\Users\ZOOWEM~1\AppData\Local\Temp\ksohtml4440\wps1.jpg)

(3)通俗解释工作过程

Export监控指标并获取指标数据推送到prometheus,prometheus拉取数据并连接到grafana,直观展示被监控状态。

1.2 实操步骤

1.2.1 master上安装grafana

外网可以自动下载镜像,内网可以上传下载好镜像

[root@k8s-master-01]#vim  grafana.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: grafana-server
  namespace: prom-grafana
spec:
  replicas: 1
  selector:
    matchLabels:
      task: monitoring
      k8s-app: grafana
  template:
    metadata:
      labels:
        task: monitoring
        k8s-app: grafana
    spec:
      imagePullSecrets:
      - name: registry-pps
      containers:
      - name: grafana-server
        image: registry.drifter.net/grafana:5.0.4
        ports:
        - containerPort: 3000
          protocol: TCP
        volumeMounts:
        - mountPath: /etc/ssl/certs
          name: ca-certificates
          readOnly: true
        - mountPath: /var
          name: grafana-storage
        env:
        - name: INFLUXDB_HOST
          value: monitoring-influxdb
        - name: GF_SERVER_HTTP_PORT
          value: "3000"
        - name: GF_AUTH_BASIC_ENABLED
          value: "false"
        - name: GF_AUTH_ANONYMOUS_ENABLED
          value: "true"
        - name: GF_AUTH_ANONYMOUS_ORG_ROLE
          value: Admin
        - name: GF_SERVER_ROOT_URL
          value: /
      volumes:
      - name: ca-certificates
        hostPath:
          path: /etc/ssl/certs
      - name: grafana-storage
        emptyDir: {}
1.2.2 创建pod
[root@k8s-master-01]#kubectl  create  -f grafana.yaml
deployment.apps/grafana-server created
1.2.3 查看grafana pod 状态 ,处于running状态则pod创建成功
[root@k8s-master-01]#kubectl get pods -n prom-grafana
NAME                                 READY   STATUS    RESTARTS   AGE
grafana-server-657495c99d-x5hnn      1/1     Running   0          23s
1.2.4 对外暴露grafana端口
[root@k8s-master-01]# vim grafana-svc.yaml
---
apiVersion: v1
kind: Service
metadata:
  labels:
    kubernetes.io/cluster-service: 'true'
    kubernetes.io/name: grafana-server
  name: grafana-server
  namespace: prom-grafana
spec:
  ports:
  - port: 80
    targetPort: 3000
  selector:
    k8s-app: grafana
#  type: NodePort
  type: ClusterIP
  [root@k8s-master-01]# kubectl create -f grafana-svc.yaml
1.2.5 查看暴露的端口
[root@k8s-master-01]# kubectl get svc -n prom-grafana
NAME                TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
grafana-server      ClusterIP   10.102.129.245   <none>        3000/TCP   2m3s
prometheus-server   ClusterIP   10.96.17.72      <none>        9090/TCP   12m
1.2.6 访问效果
  • 访问prometheus

  • 访问grafana

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
1天前
|
存储 数据采集 Prometheus
Grafana Prometheus Altermanager 监控系统
Grafana、Prometheus 和 Alertmanager 是一套强大的开源监控系统组合。Prometheus 负责数据采集与存储,Alertmanager 处理告警通知,Grafana 提供可视化界面。本文简要介绍了这套系统的安装配置流程,包括各组件的下载、安装、服务配置及开机自启设置,并提供了访问地址和重启命令。适用于希望快速搭建高效监控平台的用户。
38 20
|
1天前
|
Prometheus Kubernetes 监控
OpenAI故障复盘 - 阿里云容器服务与可观测产品如何保障大规模K8s集群稳定性
聚焦近日OpenAI的大规模K8s集群故障,介绍阿里云容器服务与可观测团队在大规模K8s场景下我们的建设与沉淀。以及分享对类似故障问题的应对方案:包括在K8s和Prometheus的高可用架构设计方面、事前事后的稳定性保障体系方面。
|
3天前
|
Prometheus 运维 监控
Prometheus+Grafana+NodeExporter:构建出色的Linux监控解决方案,让你的运维更轻松
本文介绍如何使用 Prometheus + Grafana + Node Exporter 搭建 Linux 主机监控系统。Prometheus 负责收集和存储指标数据,Grafana 用于可视化展示,Node Exporter 则采集主机的性能数据。通过 Docker 容器化部署,简化安装配置过程。完成安装后,配置 Prometheus 抓取节点数据,并在 Grafana 中添加数据源及导入仪表盘模板,实现对 Linux 主机的全面监控。整个过程简单易行,帮助运维人员轻松掌握系统状态。
35 3
|
3天前
|
Kubernetes 网络协议 应用服务中间件
Kubernetes Ingress:灵活的集群外部网络访问的利器
《Kubernetes Ingress:集群外部访问的利器-打造灵活的集群网络》介绍了如何通过Ingress实现Kubernetes集群的外部访问。前提条件是已拥有Kubernetes集群并安装了kubectl工具。文章详细讲解了Ingress的基本组成(Ingress Controller和资源对象),选择合适的版本,以及具体的安装步骤,如下载配置文件、部署Nginx Ingress Controller等。此外,还提供了常见问题的解决方案,例如镜像下载失败的应对措施。最后,通过部署示例应用展示了Ingress的实际使用方法。
18 2
|
3天前
|
Prometheus 监控 前端开发
Grafana 安装配置教程,让你的 Prometheus 监控数据变得更美观
《Grafana安装配置教程,让你的Prometheus监控数据变得更美观》简介: Grafana是一个开源的度量分析与可视化工具,支持多种数据源(如Prometheus),提供丰富的可视化功能和警报机制。本文详细介绍了Grafana的安装、汉化方法及模板使用,帮助用户轻松创建美观、灵活的数据面板,并实现数据的协作与共享。通过Docker镜像、配置文件修改或替换前端页面等方式实现汉化,让用户更便捷地使用中文界面。此外,还提供了导入JSON格式模板的具体步骤,方便快速搭建仪表盘。
20 2
|
3天前
|
Prometheus Cloud Native Linux
Prometheus+Grafana新手友好教程:从零开始搭建轻松掌握强大的警报系统
本文介绍了使用 Prometheus 和 Grafana 实现邮件报警的方案,包括三种主要方法:1) 使用 Prometheus 的 Alertmanager 组件;2) 使用 Grafana 的内置告警通知功能;3) 使用第三方告警组件如 OneAlert。同时,详细描述了环境准备、Grafana 安装配置及预警设置的步骤,确保用户能够成功搭建并测试邮件报警功能。通过这些配置,用户可以在系统或应用出现异常时及时收到邮件通知,保障系统的稳定运行。
22 1
|
15天前
|
存储 Kubernetes 关系型数据库
阿里云ACK备份中心,K8s集群业务应用数据的一站式灾备方案
本文源自2024云栖大会苏雅诗的演讲,探讨了K8s集群业务为何需要灾备及其重要性。文中强调了集群与业务高可用配置对稳定性的重要性,并指出人为误操作等风险,建议实施周期性和特定情况下的灾备措施。针对容器化业务,提出了灾备的新特性与需求,包括工作负载为核心、云资源信息的备份,以及有状态应用的数据保护。介绍了ACK推出的备份中心解决方案,支持命名空间、标签、资源类型等维度的备份,并具备存储卷数据保护功能,能够满足GitOps流程企业的特定需求。此外,还详细描述了备份中心的使用流程、控制台展示、灾备难点及解决方案等内容,展示了备份中心如何有效应对K8s集群资源和存储卷数据的灾备挑战。
|
25天前
|
Prometheus 监控 Cloud Native
如何使用Prometheus监控Docker Swarm集群的资源使用情况?
还可以根据实际需求进行进一步的配置和优化,如设置告警规则,当资源使用超出阈值时及时发出警报。通过这些步骤,能够有效地使用 Prometheus 对 Docker Swarm 集群的资源进行监控和管理。
43 8
|
1月前
|
Kubernetes 监控 Cloud Native
Kubernetes集群的高可用性与伸缩性实践
Kubernetes集群的高可用性与伸缩性实践
73 1
|
1月前
|
Prometheus 运维 监控
智能运维实战:Prometheus与Grafana的监控与告警体系
【10月更文挑战第26天】Prometheus与Grafana是智能运维中的强大组合,前者是开源的系统监控和警报工具,后者是数据可视化平台。Prometheus具备时间序列数据库、多维数据模型、PromQL查询语言等特性,而Grafana支持多数据源、丰富的可视化选项和告警功能。两者结合可实现实时监控、灵活告警和高度定制化的仪表板,广泛应用于服务器、应用和数据库的监控。
254 3

热门文章

最新文章