Getting Started with Prometheus Stack on EKS Cluster
作者:禅与计算机程序设计艺术
1.简介
Prometheus是一个开源系统监控和警报工具包。它可以采集各种时间序列数据(如CPU、内存、磁盘、网络等)来监测系统的运行状况。随着越来越多公司和组织采用Prometheus做为监控基础设施,更多的人开始对Prometheus进行了深度的研究和实践。而云服务厂商也逐渐将其作为自己的云原生监控组件之一。Kubernetes上也是越来越多公司开始使用其来做为集群的监控解决方案。本文将带领读者搭建一个基于EKS集群的Prometheus栈,并且部署一些常用的exporter到目标节点上并让Prometheus自动发现这些exporter。
2.Prometheus介绍
Prometheus是一个开源系统监控和警报工具包。它可以采集各种时间序列数据(如CPU、内存、磁盘、网络等)来监测系统的运行状况。Prometheus的主要功能包括:
- 
服务发现:Prometheus可以自动发现目标服务的端点和服务发现规则。通过服务发现,Prometheus可以获取当前正在运行的服务的列表并监测它们的健康状态。
 - 
查询语言:Prometheus支持灵活的查询语言,允许用户指定要收集哪些指标以及如何聚合它们。
 - 
报警机制:Prometheus具有强大的报警机制,可以设置阈值并触发 alerts when certain conditions are met.
 - 
持久化存储:Prometheus可以将所有数据保留在本地磁盘或远程存储中。
 - 
高度可靠性:Prometheus经过精心设计可以保证高可用性。它提供强大的查询语言和复杂的数据模型,可以处理大量数据流。
 
3.Prometheus相关概念和术语
3.1 Prometheus Server
Prometheus Server负责抓取各个目标对象(Exporter)生成的数据并存储起来,Prometheus会将数据存放在时间序列数据库中。因此,如果要获取Prometheus的相关信息,则需要连接到Prometheus Server。
3.2 Exporter
Exporter就是暴露给Prometheus的应用。通常来说,Exporter是一个独立的进程或者客户端库,它会从被监控的目标应用程序或服务中收集数据,并通过HTTP接口的方式暴露给Prometheus Server。
常见的Exporter如下:
- 
Node Exporter:Node Exporter是一个由Prometheus官方发布的Exporter,用于收集主机上的性能指标。例如CPU、内存、磁盘利用率、网络传输速度等。
 - 
MySQLd Exporter:MySQLd Exporter是一个由Percona发布的用于导出MySQL服务器指标的Exporter。可以用于监控MySQL服务器的运行情况。
 - 
Apache Exporter:Apache Exporter是一个由CoreOS发布的用于导出Apache服务器指标的Exporter。可以用于监控Apache服务器的运行情况。
 - 
Nginx Exporter:Nginx Exporter是一个由Prometheus官方发布的用于导出Nginx服务器指标的Exporter。可以用于监控Nginx服务器的运行情况。
 - 
HAProxy Exporter:HAProxy Exporter是一个由Metrics Finance发布的用于导出HAProxy服务器指标的Exporter。可以用于监控HAProxy服务器的运行情况。
 - 
RabbitMQ Exporter:RabbitMQ Exporter是一个由RobustPerception发布的用于导出RabbitMQ服务器指标的Exporter。可以用于监控RabbitMQ服务器的运行情况。
 
除此之外,还有很多其他类型的Exporter,比如cAdvisor、Redis Exporter、Memcached Exporter等。
3.3 Target
Target是Prometheus中的一个抽象概念。一个Target代表了一个需要被监控的实体,它可能是一个服务或者节点。一般情况下,每个Target都会关联有一个相应的Job。
3.4 Job
Job是用来定义一个监控项集合的集合。每个Job都会关联至少一个Prometheus Server实例,以及多个Targets。
3.5 Alertmanager
Alertmanager是一个独立的组件,用于管理告警。当Prometheus产生告警时,它会将告警消息发送给Alertmanager。
3.6 Pushgateway
Pushgateway是Prometheus的一个推送网关。它接收Prometheus Server的主动推送的监控数据,并存储起来。该网关也可以用作集群中单独的实例,用于处理短期内的业务数据采集需求。
4.准备工作
为了搭建Prometheus栈,首先需要准备好以下资源:
- 一台配置了kubectl、AWS CLI、eksctl、helm三件套的机器。
 - AWS IAM权限。
 - Helm v3客户端。
 - Kubernetes集群(版本v1.17)。
 - Kubectl配置。
 
安装kubectl和aws-cli:
    curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
    sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
    
    curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
    unzip awscliv2.zip
    sudo./aws/install
    
      
      
      
      
      
    
    代码解读
        配置eksctl:
    export AWS_ACCESS_KEY_ID=<your access key id>
    export AWS_SECRET_ACCESS_KEY=<your secret access key>
    export AWS_DEFAULT_REGION=us-east-1
    
      
      
    
    代码解读
        安装eksctl:
    curl --silent --location "https://github.com/weaveworks/eksctl/releases/download/latest_release/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp
    sudo mv /tmp/eksctl /usr/local/bin
    
      
    
    代码解读
        安装Helm v3客户端:
    curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
    
    
    代码解读
        创建一个新的EKS集群:
    eksctl create cluster --name prometheus \
    --version 1.17 \
    --region us-west-2 \
    --nodegroup-name standard-workers \
    --nodes 2 \
    --nodes-min 2 \
    --nodes-max 4 \
    --managed
    
      
      
      
      
      
      
      
    
    代码解读
        配置Kubectl:
    mkdir ~/.kube
    aws eks --region us-west-2 update-kubeconfig --name prometheus
    
      
    
    代码解读
        5.安装Prometheus Stack
由于Prometheus项目是一个开源项目,因此可以直接使用helm chart来安装Prometheus stack。下面的命令会部署一个Prometheus server,alertmanager,以及pushgateway组件。其中,prometheus server会使用默认配置,alertmanager则会禁用掉,而pushgateway组件则会设置为Headless Service类型,意味着它不会拥有Cluster IP地址。
    git clone https://github.com/prometheus-community/helm-charts.git
    cd helm-charts/charts/prometheus-stack
    helm dependency update
    helm install my-prometheus-stack.
    
      
      
      
    
    代码解读
        6.配置Prometheus Stack
默认情况下,Prometheus stack会启动时开启三个组件:Prometheus Server,Alertmanager和Pushgateway。但是这些组件都是无状态的,也就是说它们的数据会丢失重启后无法保留。为了能够让Prometheus保存数据,我们需要为它们指定持久化存储。
6.1 配置Prometheus Server
默认情况下,Prometheus Server没有任何持久化配置。我们可以使用下面的命令为Prometheus Server添加持久化存储。
    helm upgrade my-prometheus-stack. \
      --set persistence.enabled=true \
      --set persistence.size=5Gi
    
      
      
    
    代码解读
        上述命令启用了Prometheus Server的数据持久化,并且设置了5G的存储容量。
6.2 配置Alertmanager
默认情况下,Alertmanager组件没有任何持久化配置。我们可以使用下面的命令为Alertmanager添加持久化存储。
    helm upgrade my-prometheus-stack. \
      --set alertmanager.persistentVolume.enabled=true \
      --set alertmanager.persistentVolume.size=5Gi
    
      
      
    
    代码解读
        上述命令启用了Alertmanager的数据持久化,并且设置了5G的存储容量。
6.3 配置Pushgateway
默认情况下,Pushgateway组件没有任何持久化配置。我们可以使用下面的命令为Pushgateway添加持久化存储。
    helm upgrade my-prometheus-stack. \
      --set pushgateway.service.type="ClusterIP" \
      --set pushgateway.persistence.enabled=true \
      --set pushgateway.persistence.storageClass="gp2" \
      --set pushgateway.persistence.size=5Gi
    
      
      
      
      
    
    代码解读
        上述命令修改了Pushgateway的Service Type为ClusterIP,使得它只能被其它集群内部组件访问。并且为Pushgateway启用了数据持久化,并设置了GP2类型的存储类,存储容量为5G。
7.使用Prometheus Stack
7.1 添加Exporter
Prometheus stack已经成功部署,现在就可以向Prometheus Server中添加Exporter了。下面的命令会添加node exporter到所有集群节点。
    kubectl apply -f node-exporter-daemonset.yaml
    
    
    代码解读
        其中,node-exporter-daemonset.yaml的内容如下所示:
    ---
    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: node-exporter
      namespace: default
    spec:
      selector:
    matchLabels:
      app: node-exporter
      template:
    metadata:
      labels:
        app: node-exporter
    spec:
      serviceAccount: default
      hostNetwork: true
      tolerations:
      - effect: NoSchedule
        operator: Exists
      containers:
      - image: prom/node-exporter:v0.18.1
        name: node-exporter
        ports:
        - containerPort: 9100
          protocol: TCP
        resources:
          limits:
            memory: 200Mi
          requests:
            cpu: 100m
            memory: 200Mi
        securityContext:
          privileged: true
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读
        这个模板创建了一个名叫node-exporter的DaemonSet,该DaemonSet会在每个集群节点上运行一个node exporter Pod。每隔一段时间,Prometheus就会从这几个Pod上抓取node exporter的指标。
注意,以上命令会将node exporter DaemonSet部署到默认命名空间default。如果你想将node exporter部署到其他命名空间,需要调整namespace字段。
7.2 查看Prometheus Dashboard
Prometheus stack已成功配置,并且已添加node exporter。现在可以通过浏览器打开Prometheus dashboard页面查看相关信息。
图中展示了Prometheus Server,存储,查询,警报等模块的主要信息。
点击右上角的菜单按钮,可以看到不同的视图。选择Status -> Targets即可查看到目前集群中所有的targets,以及它们的健康状态。
点击左侧边栏中的Graph按钮,然后点击右上角的Add Graph按钮,可以添加新的图表。比如,可以在node exporter所在的节点上绘制cpu利用率的曲线。
点击左侧边栏中的Alerts按钮,然后点击右上角的Create Rule按钮,可以添加新的告警规则。比如,可以设置当CPU利用率超过85%时,触发告警。
这些都是Prometheus Dashboard提供的基本功能。当然,Prometheus还提供了许多丰富的特性,如Dashboard模板,PromQL语句语法,折线图的直方图等。这些特性都可以根据实际需求来使用。
