查看grafana版本_使用 Prometheus 与 Grafana 为 Kubernetes 集群建立监控与警报机制

51b3213ab643cbcd3bf814e71dda396a.png 作者 | Gregoire DAYET 策划 | 田晓旭

IT 团队已经明确意识到对基础设施进行监控的必要性。目前市面上存在着大量适用于传统基础设施且历史悠久的解决方案:Nagios、Zabbix 等工具都是其中的代表。

但这些工具并不足以解决 Kubernetes 生态系统在多层级抽象与故障排查方面的实际需求。不少 DevOps 工程师一次又一次被以下问题所困扰:

调度失败,找不到与以下所有谓词相匹配的节点::CPU 不足

集群资源监控对于实时跟踪而言至关重要。与传统基础设施相比,集群资源一直在不断扩展和变化。我们永远无法知晓自己的 Pod 在集群中的启动位置。出于这些考虑,我们需要监控集群的底层资源以及内部集群的运行状态。

更重要的是,如果不配合警报机制,单纯进行监控还远远不够。因为很明显,运营工程师不可能整晚对着关键生产集群的仪表板等待。

1 为什么要选择 Prometheus 与 Grafana?

即使拥有广泛的警报与监控工具可供选择,我们为什么要专门点名 Prometheus 与 Grafana?

Prometheus

Prometheus 是一款开源监控工具。它最初在 Soundcloud 上开发完成,但如今已经转化为独立的开源项目,从 2016 年开始成为云原生计算基金会(CNCF)的一部分,并成为继 Kubernetes 本身之后的第二个项目。也正因为如此,这两款组件通常会紧密关联在一起。

除此之外,Prometheus 不同于其他众多监控工具的一大核心,在于其基本架构始终以 pull 为基础。它不断从受到监控的组件当中抓取指标。

最后,从架构本身来看,Prometheus 使用到多维数据模型,此模型与 Kubernetes 通过标签组织数据的方式非常相似。与点数据模型相反,点数据模型中的每项指标都是唯一的,而每个不同的参数都将对应不同的指标;而使用 Prometheus,所有数据都将按时间序列存储为键 - 值对:

<metric name>{<label name>=<label value>, …}

Prometheus 架构包含三大主要组件:

  • Prometheus 服务器本身,用于收集指标并通过 API 应答查询。

  • Pushgateway,公布关于临时及短期作业的指标。

  • Alertmanager:按照名称提示启用警报发布。

726ac5e00891aec757e8d0195db78fa5.pngPrometheus 架构与生态系统组件

我们还将把 prometheusnode_exporter 与 kube_state_metrics 相结合,用以发布关于集群的各项指标。

Grafana

Grafana 是一款颇为流行的 Prometheus 开源(Apache 2.0 许可)可视化层,支持以开箱即用的方式按时间查询 Prometheus 数据。实际上,从 Grafana 2.5.0 (2015–10–28) 版本开始就已经把 Prometheus 纳入为 Grafana 数据源。

最重要的是,它非常易于使用,其中提供的模板功能可帮助您轻松创建可实时编辑的动态仪表板。

最后,Grafana 提供良好的说明文档以及广泛的社区共享体系,包括各类公共仪表板。在本文中,我们将使用两套专为 Kubernetes 设计的公共仪表板。

理论到此结束,下面开始动手环节!

2 安装的先决条件

完成演练项目的唯一要求,就是拥有一套有效的 Kubernetes 集群。为了简单起见,本文将在 AWS EC2 上使用 minikube 完成安装。

Minikube 是一种便捷方法,能够快速高效地安装一套非生产、主要用于实验室及测试场景的单节点 Kubernetes 集群。由于对资源需求不高,而且支持多种现成 K8s 功能,大家可以借此在单一计算机上轻松获取 Kubernetes 集群。

只要使用虚拟机管理程序在机器上创建本地计算机,系统即可正常工作。但这里我们使用 AWS 虚拟机,并在演示中使用 Minikube 的 vm-driver=none 模式。

3 使用 Helm 安装 Prometheus 与 Grafana

接下来就是安装这两款产品了。这里我们使用 Helm, 这款 Kubernetes 软件包管理器已经在 2019 年 11 月正式更新为 3.0 版本。

从历史来看,此次更新非常重要,因为开发社区对 Helm 进行深度重写,借此适应 RBAC 与自定义角色定义等 Kubernetes 发展成果。新版本较以往版本更适合生产要求。以往,由于固有安全模型以及高度依赖于存在争议的 Tiller 组件(现已从 3.0 版本中删除),不少 IT 专家都不愿意将 Helm 应用于生产级集群。

我们还将使用稳定版 Helmrepo 中的 charts(Helm 打包格式)对 Kubernetes 集群组件及系统指标进行监控。

安装 Helm

将稳定版 repo 添加至您的 Helm 安装:

$ helm repo add stable[https://kubernetes-charts.storage.googleapis.com/](https://kubernetes-charts.storage.googleapis.com/)$ helm repo update

接下来,我们在 K8s 集群上创建一个自定义命名空间,用以管理所有监控栈:

$kubectlcreate ns monitoring
安装 Prometheus

现在,我们可以在新创建的监控命名空间中安装 Prometheuschart 了:

$ helm installprometheusstable/prometheus--namespace monitoringNAME:prometheusLAST DEPLOYED: Tue Apr 14 09:22:27 2020NAMESPACE: monitoringSTATUS: deployedREVISION: 1TEST SUITE: NoneNOTES:The Prometheus server can be accessed via port 80 on the following DNS name from within your cluster:prometheus-server.monitoring.svc.cluster.local[...]

接下来,我们可以使用 K8s 的本地指令命令创建一个 NodePort,借此从集群外部直接与 Pod 通信。请注意,如果您不打算在未安装 Grafana 的前提下查询 Prometheus,也可以直接跳过此步骤。

我们可以看到,端口 30568 被自动分配并映射至指向该 Pod 的端口 9090.

现在,我们可以使用公共 DNS 及浏览器中的 30568 端口访问 Prometheus 端点。

接下来,我们可以使用以下命令直接查询 Prometheus 以获取各类指标,例如命名空间的 CPU 消耗量:

sum(rate(container_cpu_usage_seconds_total{container_name!=”POD”,namespace!=””}[5m])) by (namespace)

a6a0c2f2fc67dd71c6091fd66e63a265.png

4 安装 Grafana

现在,Prometheus 已经安装完成。相较于单独查询各项指标,我们可以使用 Grafana 以聚合方式通过统一的仪表板快速查看多项指标。

我们再次使用 helm 将 grafana 安装在监控命名空间当中:

$ helm installgrafanastable/grafana--namespace monitoring

012fc8c13e221a6cc6d64d65ac1db979.png

可以看到,grafanaPod 开始配合 Prometheus 组件运行:

9d8e430fb0cb31ce73ef6b430141f315.png

这里,我们再创建一个 NodePort 服务,从集群外部访问 Grafana(此步骤为强制要求):

$kubectl-n monitoring expose pod grafana-5b74c499c6-kt4bw --typeNodePort--namegrafana-npservice/grafana-np exposed

而后将外部端口映射至 Grafana 的侦听端口 3000:(这里为 31399)

$kubectl-n monitoringgetsvcgrafana-npNAMETYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEgrafana-npNodePort10.111.59.2  80:30368/TCP,3000:31399/TCP 3h8m

在浏览器中输入:yourPublicDNS:yourPort 与 tada!

7e9217a782b570b11b48736bf2683a80.png

Grafana 提供用户管理功能,在默认情况下您需要使用 admin 用户方可接入。

要获取 admin 密码,请输入以下命令:

kubectlget secret — namespace monitoringgrafana-ojsonpath=”{.data.admin-password}” | base64 — decode ;echoADMINPASSWORD

现在即可开始正式连接。

第一步是使用 Kubernetes 的内部 DNS 结构将 Prometheus 配置为数据源:

http://prometheusServiceName.namespace.svc.cluster.local:port

在本示例中为:

http://prometheus-server.monitoring.svc.cluster.local(:80 可选)

9b340a74e2be9107a561725a06bd546d.png

现在数据已经添加完成,我们将导入两套社区仪表板,用于监控我们的工作负载与集群运行情况。这些仪表板应该可以开箱即用。

点击 import 按钮并输入 Grafana 仪表板 ID:

d868e687ebf8f3f49702a76777910ed3.png

首先安装 1860,而后安装 8685:

10cf2fd2d264002a5942e3e570b045d6.png

现在,我们已经拥有了两套工作仪表板:

5d5971689f13b7f45944e0fe73f5b6c1.png

d2aa691b363da01fe4e0e2c68fd61339.png

我们已经可以轻松监控系统指标与集群配置了!

5 通过 Slack 频道发布警报

现在,我们已经拥有了一套高效的监控解决方案,第二步就是激活警报。很明显,如果没有警报机制的支持,运营团队不可能整天盯着生产环境中的众多仪表板。

我们可以通过两种方式在监控栈中实施警报。首先是使用 PrometheusAlertManager 组件(由 helm chart 安装),其次是使用 Garfana 的内置警报功能。这里我们选择后一种方式,因为其更易于现实。

Grafana 能够通过 Slack、电子邮件、webhook 或者其他通信渠道发布警报。由于我个人经常使用 Slack,而且不少企业也在使用 Slack 作为内部通信平台,因此本示例就以 Slack 为警报通道。

创建 Slack 通知频道

第一步是将 Slack 添加为通知频道。在 Grafana 当中,单击左侧的铃铛图标,选择通知频道菜单,而后创建一个新频道。

您将在这里看到多种与 Grafana 相兼容的警报工具。

148f735aa43128c3d3402d7fb070c851.png

选择 Slack,而后输入您的 Slack webhook URL(其他字段为可选项)。

如果您还没有 webhook URL,请参阅此教程进行创建:

https://api.slack.com/messaging/webhooks

如此一来,您将拥有一个端点,用于将消息发送至 Slack 服务器上的特定频道。

a9875058c48be3fe7a725cf3f93e0b73.png

创建并测试自定义警报

现在,频道已经设置完毕,接下来使用“K8s Cluster Summary”仪表板,而后单击“Cluster Pod Capacity”标题以编辑面板。

b3f281161eb991ab360cfd7fa1b88628.png

我们将设置一项警报来监控 Pod 容量,在默认情况下,每个节点上的 Kubernetes 限制为 110 个。此上限总体属于可靠上限。如果集群中的节点数量受到限制,而且已经达到 110 个这一硬上限,则剩余的 Pod 将进入挂起状态。而这会在高业务活动强度期间给生产集群扩展造成巨大问题。

我们将警报设置为 90 个 Pod:

6468a6945f19abf73a4cf1034cf55ea2.png

回到我们的集群,创建一个包含 100 个 nginx 副本的任意部署:

$kubectlcreate nsloadtestnamespaceloadtestcreated$kubectlcreate deploymentnginx--image=nginx-nloadtestdeployment.apps/nginxcreated$kubectl-nloadtestscale deploymentnginx--replicas=100deployment.apps/nginxscaled

可以看到,由于集群中已经包含 15 个初始 Pod,且 Pod 容量迅速增加到 115 个:

14eefe63ced6fd0d686f1b7d5fa2bccf.png

这比许可的 Pod 上限 110 个还多了 5 个。实际上,我们可以在仪表板中看到 5 个 Pod 处于待处理状态。

784454dfe89e0459e89c214e8e375927.png

5 分钟之后,警报进入 ALERTING 状态,并在 Slack 频道上发送带有自定义消息及当前值的通知。

1495014ae3530e0ff8ed6e6beac62a41.png

我们可以将部署缩减至 1 个 Pod:

$kubectl-nloadtestscale deploymentnginx— replicas=1deployment.apps/nginxscaled

Pod Capacity 已经冷却:

fccf87850c2e1f2389981b45a2cf7b9a.png

警报会向 Slack 发送返回正常状态的通知。

ef3832d02479b99b6e7ceddb9f2f8955.png

这项小小的演练非常有趣,因为它不仅实施起来相当简单,而且足以反映真实的运营场景。

关于 Grafana 警报功能,还有其他一些注意事项。我们的两套仪表板都使用被称为模板变量的函数。变量是您可以在主机、集群或者命名空间等仪表板之上进行更改的值。根据设计,Grafana 不可根据模板变量发出警报,原因很多。如果尝试在仪表板的某些面板上放置一些警报,则有可能因此而出错。解决方案是为各项警报指定一个特定的主机、集群或者节点,而非使用变量进行监控。

6 总结

在与 Prometheus 与 Grafana 打过一番交道之后,希望大家喜欢这篇文章,并感受到监控对于 Kubernetes 生态系统的重要意义。

原文链接

https://gregoiredayet.medium.com/monitoring-and-alerting-on-your-kubernetes-cluster-with-prometheus-and-grafana-55e4b427b22d

今日推荐文章

对话Ruby on Rails之父DHH:我们需要重新审视软件开发

点个在看少个 bug ?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/551716.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java的注解_java-注解相关

注解概念&#xff1a;说明程序的&#xff0c;给计算机看注释&#xff1a;用文字描述程序先了解一些怎么正常javadoc文档1&#xff1a;给类或者方法添加doc注释2&#xff1a;通过命令javadoc 执行 类.java文件新建的类&#xff1a;/*** 注解doc演示*authorquan*sincejdk 1.7*ver…

linux删除文件_Linux删除文件夹用什么命令

请关注本头条号&#xff0c;每天坚持更新原创干货技术文章。如需学习视频&#xff0c;请在微信搜索公众号“智传网优”直接开始自助视频学习1. 前言本文主要讲解Linux删除文件夹或目录的命令rmdir和rm的使用方法。Windows上的文件夹与Linux系统里的目录是同一概念。默认情况下&…

shrio 登陆后 还是失效_在 iPhone 上取消订阅后,应用或内容会立即失效吗?

在 iPhone 中&#xff0c;一些应用和服务需要进行订阅&#xff0c;即您需要支付相应的费用以获得应用或服务中内容的访问权限。如果您想要取消订阅某个项目&#xff0c;可以按以下步骤操作&#xff1a;前往 iPhone “设置”-“Apple ID”-“iTunes Store 与 App Store”&#x…

wifi 信道_WiFi网速太慢,四招就可以让无线网络变得顺畅

和WIFI网速相关联的因素主要有四个&#xff0c;对应解决方法也就有四个。频段冲突是WIFI网速变慢很常见的问题。现实中常用的WIFI频段有2.4GHZ和5GHZ两个大频段&#xff0c;也好比两条高速公路。中国2.4GHZ频段里有11个信道&#xff0c;5GHZ有15个信道。多少个信道就好比有多少…

判读一个对象不为空_“人不为己,天诛地灭”的真实含义

“人不为己&#xff0c;天诛地灭”出自《佛说十善业道经》&#xff0c;其意思不是“一个人如果不为自己谋利益&#xff0c;就会遭到天地诛灭”&#xff0c;而是“一个人如果不修行自己的德行&#xff0c;那么就会为天地所不容”。“为”是修习、修炼、修行的意思&#xff0c;修…

c++opencv显示中文_OpenCV如何入门秘籍

OpenCV简介谈起入门&#xff0c;我们首先要搞明白OpenCV是什么&#xff1f;OpenCV的全称是Open Source Computer Vision Library&#xff0c;是一种计算机视觉库&#xff0c;主要用于处理摄像头采集的图像。既然说到了是一种库&#xff0c;就要聊聊这个库使用什么语言编写的。O…

安卓开发文档_鸿蒙2.0,HarmonyOS开发体验!

“没有人能够熄灭漫天星光”。在9月10日的华为2020开发者大会上&#xff0c;余承东掷地有声地说道。从去年开放的鸿蒙1.0&#xff0c;到今年的2.0。仅仅一年时间&#xff0c;华为就把基础设施全部搭建好。从之前的感知不强&#xff0c;到现在的触手可得&#xff0c;让果核这个半…

python字符串类型_Python3的字符串类型(疯狂Python)

先看一下本篇文章要讲的内容目录&#xff1a; 4.2 字符串入门String4.2.1 repr和字符串4.2.2 input和raw_input4.2.3 长字符串4.2.4 bytes4.2.5 字符串格式化4.2.6 Python自带两个帮助函数4.2.7 删除多余空白4.2.8 字符串的查找&#xff0c;替换4.2.9 字符串的分割&#xff0c;…

盘点苹果微信聊天记录恢复的3大常用方法!

微信聊天记录一旦被误删除或者意外丢失&#xff0c;那确实是一件麻烦的事情。如果只是丢失了文件、图片、视频等&#xff0c;那么重新让好友转发就行。 那如果是想恢复全部聊天记录呢&#xff1f;苹果微信聊天记录恢复有哪些方法&#xff1f;如果你还不知道正确的恢复方法&…

python采用面向对象编程模式吗_如何理解 Python 中的面向对象编程?

现如今面向对象编程的使用非常广泛&#xff0c;本文我们就来探讨一下Python中的面向对象编程。作者 | Radek Fabisiak 译者 | 弯月&#xff0c;责编 | 郭芮 以下为译文&#xff1a; Python支持多种类型的编程范式&#xff0c;例如过程式编程、函数式编程、面向对象编程&#xf…

android 打开系统相册_这5款常用Android手机自动化测试工具你要收藏

1、Monkey是Android SDK自带的测试工具&#xff0c;在测试过程中会向系统发送伪随机的用户事件流&#xff0c;如按键输入、触摸屏输入、手势输入等)&#xff0c;实现对正在开发的应用程序进行压力测试&#xff0c;也有日志输出。实际上该工具只能做程序做一些压力测试&#xff…

php 替换某个字符,php中如何替换字符串中的某个字符-PHP问题

正在PHP中&#xff0c;能够应用strtr()函数完成字符串交换。起首咱们简略理解下strtr()函数的界说及语法。语法&#xff1a;string strtr( string $str, string $from, string $to)第一个参数示意待转换的字符串。第二个参数示意字符串中与将要被转换的目的字符 to 绝对应的源字…

python提示对话框自动关闭_Python实现定时自动关闭的tkinter窗口方法

Python实现定时自动关闭的tkinter窗口方法 更新时间&#xff1a;2019年02月16日 09:13:27 作者&#xff1a;Python_小屋 今天小编就为大家分享一篇Python实现定时自动关闭的tkinter窗口方法&#xff0c;具有很好的参考价值&#xff0c;希望对大家有所帮助。一起跟随小编过来看看…

x5内核有什么优点_接上U盘就是NAS私有云,蒲公英X5入手测评

接上U盘就是NAS私有云&#xff0c;蒲公英X5入手测评&#xff01;现在很多人喜欢在家里配置一台NAS&#xff0c;这样远程访问家里的数据不仅方便&#xff0c;而且可以即时备份PC以及手机等设备的数据。一旦手机丢失或电脑数据损坏&#xff0c;还可以通过NAS来恢复数据。但是对于…

小程序如何调用php程序,微信小程序调用PHP后台接口 解析纯html文本

搜索热词1、微信js动态传参&#xff1a;PHP/Home/Xiaoxxf/activity_detail?a_idoptions.id,//含富文本htmldata: {is_detail:1},method: GET,// OPTIONS,GET,HEAD,POST,PUT,DELETE,TRACE,CONNECTheader: {Content-Type: application/json},success: function (res) {that.setD…

手机联系人头像包_一组抖音上很火的表情包,这里都有,一起来可可爱爱吧

我是最新抖音表情包马上到表情包轿车带火花|马上到表情包白色汽车动图em..不知道为什么这个表情包也很火&#xff0c;感jio没什么特别&#xff0c;这个就厉害了&#xff0c;你以为我是雨伞&#xff1f;那你就错了。砰~可可爱爱&#xff01;太萌了。像不像考试中的你&#xff1f…

python视频处理代码_python如何实现视频转代码视频

本文实例为大家分享了python如何实现视频转代码视频的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下 # -*- coding:utf-8 -*- #coding:utf-8 import argparse import os import cv2 import subprocess from cv2 import VideoWriter, VideoWriter_fourcc, imread, re…

遵义大数据中心项目工程概况_中策大数据:8月建筑工程项目有哪些?建筑工程项目信息汇总...

2020年8月建筑工程项目有哪些&#xff1f;中策大数据中国工程网为你搜集整理出了建筑工程项目信息&#xff0c;包括项目环评、施工单位招标、施工建设、项目设计、立项审批等各个工程项目阶段的拟在建项目。2020年8月建筑工程项目信息汇总&#xff1a;山东省济南温泉城通用航空…

php什么程度算学会,十天学会PHP - 序1,学会的标准是什么?(20180820-1)

学会的标准是什么十天学会&#xff0c;这种名称难免给人“浮躁”之感&#xff0c;所以要和大家稍作解释。很多同学认为&#xff0c;学会 达到目的&#xff0c;这个看法过于主观&#xff0c;比如想就业、创业、做毕业设计&#xff0c;他们所需要的专业知识差异很大&#xff0c;…

空间皮肤代码_不废话,看我20行代码搞定色块提取与定位…….

点击上方蓝字关注我们微信公众号&#xff1a;OpenCV学堂关注获取更多计算机视觉与深度学习知识问题来由这个问题是谁问我的我已经不记得了&#xff0c;刚开始的时候他发了这张图像给我&#xff0c;让我给他看一下&#xff0c;我当时告诉他转换一下色彩空间提取就好啦&#xff0…