阿里云容器Kubernetes监控(七) - Prometheus监控方案部署

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 前言 Prometheus是一款面向云原生应用程序的开源监控工具,作为第一个从CNCF毕业的监控工具而言,开发者对于Prometheus寄予了巨大的希望。在Kubernetes社区中,很多人认为Prometheus是容器场景中监控的第一方案,成为容器监控标准的制定者。

前言

Prometheus是一款面向云原生应用程序的开源监控工具,作为第一个从CNCF毕业的监控工具而言,开发者对于Prometheus寄予了巨大的希望。在Kubernetes社区中,很多人认为Prometheus是容器场景中监控的第一方案,成为容器监控标准的制定者。在本文中,我们会为大家介绍如何快速部署一套Kubernetes的监控解决方案。
watermark,size_16,text_QDUxQ1RP5Y2a5a6i,

Prometheus方案的解析

在解析Prometheus容器监控方案之前,我们先要确定在Kubernetes中需要监控的对象包含什么?对于一个监控系统而言,常见的监控维度包括:资源监控和应用监控。资源监控是指节点、应用的资源使用情况,在容器场景中就延伸为节点的资源利用率、集群的资源利用率、Pod的资源利用率等。应用监控指的是应用内部指标的监控,例如我们会将应用在线人数进行实时统计,并通过端口进行暴露来实现应用业务级别的监控与告警。那么在Kubernetes中,监控对象会细化为哪些实体呢?

  1. 系统组件
    kubernetes集群中内置的组件,包括apiserver、controller-manager、etcd等等。
  2. 静态资源实体
    主要指节点的资源状态、内核事件等等
  3. 动态资源实体
    主要指Kubernetes中抽象工作负载的实体,例如Deployment、DaemonSet、Pod等等。
  4. 自定义应用
    主要指需要应用内部需要定制化的监控数据以及监控指标。

对于静态资源实体和系统组件而言,大家可能非常好理解,他们的监控方式也比较简单,只需要在配置文件中指明即可。那么如何处理动态的资源实体监控呢?对于这种需要动态感知监控端点的场景,prometheus提出了自己的解决方案 - prometheus operator。prometheus operator是 CoreOS 开源的一套用于管理在 Kubernetes 集群上的 Prometheus 控制器,它是为了简化在 Kubernetes 上部署、管理和运行 Prometheus 和 Alertmanager 集群。

architecture.png

简单的讲,prometheus operator的作用通过CRD的方式将需要动态监听的实体进行定义,并通过监听apiserver中实体的变化,实现prometheus中动态更新配置与报警规则。用更通俗的话讲就是,通过prometheus operator的方案,可以让prometheus的监控对象变成自动生成的,开发者无需额外配置监控任务,即可实现动态实体的监控。

prometheus监控方案的主体是prometheus operator,为了满足Kubernetes中的监控场景,Prometheus方案在prometheus之上作了很多的扩展,主要包含如下组件:

  • prometheus-server:数据存储以及监控数据聚合
  • prometheus-config-reloader:动态更新prometheus配置
  • rules-configmap-reloader:动态更新prometheus报警配置
  • alert manager:报警组件
  • node-exporter:节点资源信息采集组件
  • kube-state-metrics:动态发现endpoint,三方监控的核心组件
  • prometheus-operator:prometheus配置的operator
  • grafana:数据展现

部署Prometheus监控方案

1. 在集群的master节点执行代码下载

git clone https://github.com/AliyunContainerService/prometheus-operator 

和社区的prometheus-operator相比,阿里云的版本做了少许的定制,并会定期同步最新版本。

2. 部署Prometheus监控方案

cd contrib/kube-prometheus
kubectl apply -f manifests 

3. 查看部署结果

默认情况下由于安全的原因,Prometheus、AlertManager与Grafana都没有开放公网访问,开发者可以通过本地的Proxy方式查看。具体方式如下:首先在容器服务控制台下载kubeconf到本地。

image

访问prometheus可以在本地执行如下命令

kubectl --namespace monitoring port-forward svc/prometheus-k8s 9090

此时访问本地的localhost:9090,即可使用prometheus。

image

选择Status下的Target查看所有采集任务,如果所有的状态都是up,表明采集任务都已经运行。

image

4. 查看数据聚合与展现

访问grafana可以在本地执行如下命令,默认的用户名密码为admin/admin,访问本地的localhost:3000,登陆并选择相应的dashboard,即可查看相应的聚合内容。

kubectl --namespace monitoring port-forward svc/grafana 3000

image

5. 查看告警规则与告警压制

在Prometheus的Alerts类目中可以查看当前的报警规则,红色的规则表示正在触发报警,绿色的规则表示状态正常,默认prometheus operator会自动创建一批报警规则。

image

如果需要设置报警压制,需要访问Alter Manager,可以在本地执行如下命令,访问本地的localhost:9093

kubectl --namespace monitoring port-forward svc/alertmanager-main 9093

image

点击Silence可以设置报警压制的内容。

定制Prometheus监控方案

看到这里很多开发者会提出一个疑问,这么多内容是否可以进行定制?答案是肯定的,标准的Prometheus是通过配置文件来实现,传统中对于容器中的配置文件变化处理是非常麻烦的,因为配置的变化需要重启应用甚至容器,而且还需要提前将文件拷贝到主机上。我们先抛开Prometheus这件事情,先想想Kubernetes中是怎么解决的,在Kubernetes中所有的实体操作都可以通过Yaml变更来进行实现。那么Prometheus的配置是否可以通过类似的方式下发呢?

答案是肯定的,这就是Prometheus operator做的事情,他将操作Promtheus的一些动作变得更有kubernetes的味道。

我们回到最开始部署的命令:

kubectl apply -f manifests 

manifests是本次部署的所有内容文件,当我们深入到目录中的具体文件时,就会发现一些熟悉的内容。例如prometheus-rules.yaml这个文件,内容如下:

apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  labels:
    prometheus: k8s
    role: alert-rules
  name: prometheus-k8s-rules
  namespace: monitoring
spec:
  groups:
  - name: k8s.rules
    rules:
    - expr: |
        sum(rate(container_cpu_usage_seconds_total{job="kubelet", image!="", container_name!=""}[5m])) by (namespace)
      record: namespace:container_cpu_usage_seconds_total:sum_rate

此处有一个特殊的抽象叫PrometheusRule,这就是prometheus-operator定义的的CRD,在rules字段中是定义的具体的报警规则与方式。因此,如果要修改prometheus中的报警规则,只需要修改这个yaml,并重新apply即可。

Prometheus不是“银弹”

Prometheus的方案相比社区中Heapster(Metrics Server)的方案而言更加强大。但是也并非没有缺点,常常被开发者诟病的缺点主要有如下几个。

  • 性能差
    首先对于Prometheus而言,是一个拉取模式的采集系统,而拉取式的系统通常会有一个通病,就是数据提供方的数据量级问题。推送数据的时候,我们可以根据数据的量级分批,分次进行推送。而拉取通常是全量数据的同步。此外相比传统的监控系统的数据存储Prometheus自身的存储数据格式性能还是很低下的。这会导致在集群量级比较大的情况下,Prometheus的CPU、内存、磁盘、网络都存在较高的利用率。Prometheus本身是单点的架构,虽然社区中已经有集群的模式,但是依然不够成熟,使用Promehteus的开发者要做好热备多活的思想准备,使用资源冗余的方式来保证系统稳定。
  • 组件过多
    刚才我们已经看到一个标准的Prometheus方案会涉及的组件部分,这些组件大部分都是不可缺少的,这也会导致部署这个方案后,需要额外维护很多监控相关的组件,维护的成本较高。
  • 学习成本高
    Kubernetes的风格固然能够成为一种标准表达和执行的范式,但是对于监控而言,后续有些过于激进,本身Prometheus的学习成本已经较高,加入CRD的方式,会使学习的成本变得更高。
  • 扩展性差
    表面上看Prometheus定义了CRD可以进行扩展,但是从Prometheus本身而言,缺乏插件的机制进行扩展,从代码外直接扩展则会增加整体架构的复杂,相比zabbix、grafana或者heapster等等监控相关工具的扩展方式,Prometheus还有很长的路要走。
  • 监控指标不准确
    这个问题是从Prometheus监控制定开始就存在的问题,由于kubelet的数据指标不是实时的,而Prometheus的数据采集会丢失时间戳,这会导致非常异常的利用率曲线。具体的描述,可以参考如下两个PR 20592028

最后

虽然Prometheus有很多的缺点,但是他依然是Kubernetes社区中监控领域的重要一环,开发者可以根据自己的需求来选择合适的方案。对于大部分的开发者而言,内置的Heapter(Metrics Server)与云监控集成的方案已经可以解决80%的基础问题了,未尝不是一个便捷的选择。Prometheus的未来依然是光明的,阿里云也会和社区一起,推进Prometheus的演进,提供更好的Prometheus监控方案。

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
1月前
|
存储 Kubernetes Docker
容器服务ACK常见问题之阿里云控制台进不去了如何解决
容器服务ACK(阿里云容器服务 Kubernetes 版)是阿里云提供的一种托管式Kubernetes服务,帮助用户轻松使用Kubernetes进行应用部署、管理和扩展。本汇总收集了容器服务ACK使用中的常见问题及答案,包括集群管理、应用部署、服务访问、网络配置、存储使用、安全保障等方面,旨在帮助用户快速解决使用过程中遇到的难题,提升容器管理和运维效率。
|
1月前
|
Arthas 弹性计算 运维
阿里云ECS监控服务
阿里云ECS监控服务
403 2
|
1月前
|
弹性计算 安全 数据安全/隐私保护
2024年阿里云幻兽帕鲁Palworld联机服务器搭建部署指南,图文教程
近年来,幻兽帕鲁以其独特的游戏魅力,迅速成为玩家们的热门选择。对于许多想要与好友一起体验这款游戏的玩家来说,如何搭建一个稳定的联机服务器成为了他们关注的焦点。今天,我将为大家带来一篇简单易懂的图文教程,让你轻松搭建幻兽帕鲁的联机服务器,与好友们畅快游戏。
|
1月前
|
弹性计算 运维 安全
2024年阿里云一键搭建部署幻兽帕鲁服务器解决方案
幻兽帕鲁火了,为了确保畅快体验游戏,构建高效、稳定的游戏服务器至关重要。幸运的是,阿里云为您提供了快速、简便的服务器搭建解决方案,即使您对技术知识了解有限,也能在短短一分钟内轻松完成《幻兽帕鲁》游戏的联机服务器搭建!
1453 4
|
6天前
|
Java 应用服务中间件 Linux
在阿里云服务器上部署Tomcat详细图文详解
本文介绍了在阿里云服务器上安装和配置JDK和Tomcat的步骤。首先,需要注册阿里云账号并进行实名认证,然后购买并设置服务器。接着,通过File Zilla连接服务器,创建Java和Tomcat的安装目录,并将JDK和Tomcat的tar.gz文件上传到服务器,解压并重命名。之后,配置JDK的环境变量,将catalina.sh复制到/etc/init.d/目录下,并修改相关配置。最后,启动Tomcat并配置安全组规则,确保可以通过公网访问。
|
6天前
|
弹性计算 Java Linux
阿里云服务器搭建部署宝塔详细流程
该内容是一个阿里云服务器和域名的配置指南。首先,需注册阿里云账号并进行企业实名认证。接着,选购服务器如2核2G1兆的Linux系统,并购买域名。完成域名备案后,进行域名解析和ICP备案。然后,通过远程连接登录服务器,重置密码,安装宝塔面板。在安全组中开启宝塔面板随机生成的端口。最后,登录宝塔面板安装LNMP环境,配置数据库如MySQL和Redis,部署JDK、Tomcat,上传前端和后端项目以实现上线。
|
7天前
|
弹性计算 JavaScript Java
阿里云服务器搭建部署宝塔详细流程
以下是内容的摘要: 本文主要介绍了在阿里云上创建和配置服务器环境的步骤,包括注册阿里云账号、实名认证、购买和设置服务器、域名的获取与备案、以及使用宝塔面板安装和配置环境。首先,用户需要注册阿里云账号并进行实名认证,选择合适的服务器配置。接着,购买服务器后,要准备并备案域名,以便通过友好的网址访问网站。在服务器上安装宝塔面板,可以方便地管理和配置LAMP/LNMP/Tomcat/Node.js等应用环境。完成这些步骤后,用户还需要在宝塔面板中安装MySQL、Redis等数据库,部署Java或Vue项目,并配置相关端口。最后,将前端项目打包上传至服务器,并设置站点,即可实现网站的上线。
|
7天前
|
应用服务中间件 Linux 开发工具
如何在阿里云服务器快速搭建部署Nginx环境
以下是内容的摘要: 本文档主要介绍了在阿里云上购买和配置服务器的步骤,包括注册阿里云账号、实名认证、选择和购买云服务器、配置安全组、使用Xshell和Xftp进行远程连接和文件传输,以及安装和配置Nginx服务器的过程。在完成这些步骤后,你将能够在服务器上部署和运行自己的网站或应用。
|
9天前
|
NoSQL 关系型数据库 MySQL
阿里云服务器部署项目流程
本文主要讲解阿里云服务器的部署,如何选择配置等
|
12天前
|
Java 应用服务中间件 Linux
阿里云服务器部署多个tomcat
阿里云服务器部署多个tomcat

相关产品

  • 容器服务Kubernetes版
  • 推荐镜像

    更多