0 元体验|使用 Prometheus 监控 Kubernetes 的最佳实践
![0元体验|使用 Prometheus 监控 Kubernetes 的最佳实践](https://static001.geekbang.org/infoq/35/35048256f426014b9bf5a0945297a848.jpeg)
Kubernetes 简介
项目起源
Kubernetes 是谷歌开源的容器集群管理系统,是 Google 多年来大规模容器管理技术 Borg 的开源版本。Kubernetes 发展非常迅速,已经成为容器编排领域的领导者。
Kubernetes 主要功能包括:
基于容器的应用部署、维护和滚动升级
负载均衡和服务发现
跨机器和跨地区的集群调度
自动伸缩
无状态服务和有状态服务
广泛的 Volume 支持
插件机制保证扩展性
Prometheus 项目与 Kubernetes 项目一样,也来自于 Google 的 Borg 体系,它的原型系统 BorgMon 是一个几乎与 Borg 同时诞生的内部监控系统。Prometheus 项目发展至今,已经全面接管了 Kubernetes 项目的整套监控体系。
核心组件
Kubernetes 主要由以下核心组件组成:
etcd 保存了整个集群的状态;
apiserver 提供了资源操作的唯一入口,并提供认证、授权、访问控制、API 注册和发现等机制;
controller manager 负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
scheduler 负责资源的调度,按照预定的调度策略将 Pod 调度到相应的机器上;
kubelet 负责维护容器的生命周期,同时也负责 Volume(CVI)和网络(CNI)的管理;
Container runtime 负责镜像管理以及 Pod 和容器的真正运行(CRI);
kube-proxy 负责为 Service 提供 cluster 内部的服务发现和负载均衡。
![](https://static001.geekbang.org/infoq/52/52f79fa3230e1dadffcc2a8e2efd8acc.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
基本概念
Container
Container(容器)是一种便携式、轻量级的操作系统级虚拟化技术。它使用 namespace 隔离不同的软件运行环境,并通过镜像自包含软件的运行环境,从而使得容器可以很方便的在任何地方运行。
Pod
Kubernetes 使用 Pod 来管理容器,每个 Pod 可以包含一个或多个紧密关联的容器。Pod 是一组紧密关联的容器集合,它们共享 IPC 和 Network namespace,是 Kubernetes 调度的基本单位。Pod 内的多个容器共享网络和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务。
Node
Node 是 Pod 真正运行的主机,可以是物理机,也可以是虚拟机。为了管理 Pod,每个 Node 节点上至少要运行 container runtime(比如 docker 或者 rkt)、kubelet 和 kube-proxy 服务。
Namespace
Namespace 是对一组资源和对象的抽象集合,比如可以用来将系统内部的对象划分为不同的项目组或用户组。常见的 pods, services, replication controllers 和 deployments 等都是属于某一个 namespace 的(默认是 default),而 node, persistentVolumes 等则不属于任何 namespace。
Service
Service 是应用服务的抽象,通过 labels 为应用提供负载均衡和服务发现。匹配 labels 的 Pod IP 和端口列表组成 endpoints,由 kube-proxy 负责将服务 IP 负载均衡到这些 endpoints 上。
每个 Service 都会自动分配一个 cluster IP(仅在集群内部可访问的虚拟地址)和 DNS 名,其他容器可以通过该地址或 DNS 来访问服务,而不需要了解后端容器的运行。
Label
Label 是识别 Kubernetes 对象的标签,以 key/value 的方式附加到对象上(key 最长不能超过 63 字节,value 可以为空,也可以是不超过 253 字节的字符串)。
Annotations
Annotations 是 key/value 形式附加于对象的注解。不同于 Labels 用于标志和选择对象,Annotations 则是用来记录一些附加信息,用来辅助应用部署、安全策略以及调度策略等。比如 deployment 使用 annotations 来记录 rolling update 的状态。
Kubernetes 监控指标
指标分类
1、宿主机监控指标
通过 Node Exporter 暴露指标供 Prometheus 采集。一般来说,Node Exporter 会以 DaemonSet 的方式运行在宿主机上。Node Exporter 暴露的指标数据, 包括节点的负载(Load)、CPU 、内存、磁盘以及网络等常规信息,以及其他更丰富的指标。
2、Kubernetes 的组件监控指标
Kubernetes 的 API Server、kubelet 等组件的监控,除了常规的 CPU、内存的信息外,还包括了各个组件的核心监控指标。比如,对于 API Server 来说,它就会在 /metrics API 里,暴露出各个 Controller 的工作队列(Work Queue)的长度、请求的 QPS 和延迟数据等等。这些指标,是检查 Kubernetes 本身工作情况的主要依据。
3、Kubernetes 相关的监控指标
Kubernetes 核心监控数据,包括了 Pod、Node、容器、Service 等主要 Kubernetes 核心概念的指标。其中,容器相关的指标主要来自于 kubelet 内置的 cAdvisor 服务。在 kubelet 启动后,cAdvisor 服务也随之启动,而它能够提供的信息,可以细化到每一个容器的 CPU 、文件系统、内存、网络等资源的使用情况。
指标规划原则
在具体的监控指标规划上,可以遵循业界通用的 USE 原则和 RED 原则。
USE 原则
适用于资源监控指标,比如节点和容器的资源使用情况。
利用率(Utilization),资源被有效利用起来提供服务的平均时间占比;
饱和度(Saturation),资源拥挤的程度,比如工作队列的长度;
错误率(Errors),错误的数量。
RED 原则
适用于服务监控指标,比如 kube-apiserver 或者某个应用的工作情况。
每秒请求数量(Rate);
每秒错误数量(Errors);
服务响应时间(Duration)。
Kubernetes 常见监控与排障场景
Kubernetes 的常见问题场景,均可使用 Prometheus 监控实现异常监测与告警,协助问题排查与解决,助力高效运维。
1.监控集群健康状况
场景:使用 Prometheus 监控 Kubernetes 集群的健康状况,包括节点状态、Pod 运行情况、资源利用率等,以便实时了解集群运行情况并及时发现潜在问题,提高集群的稳定性和可靠性。步骤:
指标采集:使用 Prometheus 采集节点指标、Pod 指标、容器指标,如节点 CPU 使用率、内存利用率、磁盘空间、Pod 运行状态、网络流量等。
监控面板:创建监控面板,展示集群的健康状况和关键指标,便于实时监控和分析。
告警通知:根据实际情况设置警报规则,如节点宕机、Pod 崩溃、资源利用率异常等,以便在问题发生时及时触发警报。
2.性能调优
场景:使用 Prometheus 监控 Kubernetes 集群的性能指标,分析和优化应用程序和集群资源的利用,以提高性能和效率。步骤:
指标采集:确定需要监控和优化的性能指标,使用 Prometheus 采集 Kubernetes 集群和应用程序的性能指标,包括 CPU 使用率、内存利用率、网络流量、请求响应时间等。
监控面板:配置性能相关指标的监控面板,根据监控数据分析出资源瓶颈和潜在问题,比如资源瓶颈、应用程序性能不佳等。
制定优化策略:根据数据分析结果制定性能优化策略,可能包括调整资源配额、优化应用程序代码、扩展集群规模等。例如针对监控 Pod 的资源使用问题,调整 Pod 的资源请求和限制,以提高性能和避免资源不足导致的问题。
3.故障排查
场景:使用 Prometheus 监控 Kubernetes 集群,通过实时监控和告警功能来快速识别并解决潜在的故障和问题,保障集群的稳定性和可靠性。步骤:
指标采集:使用 Prometheus 采集集群状态和性能相关指标,比如节点健康状态、Pod 运行情况、资源利用率等。
监控面板:通过 Prometheus 的监控面板查看实时的集群状态和性能指标。
告警通知:定义关键性能指标的阈值,并配置告警策略,以便在达到预设阈值时发送告警通知。
故障定位与分析:根据告警通知和实时监控数据,快速定位可能出现故障的节点、Pod 或服务,识别问题的根本原因。结合日志和事件信息,进一步分析问题,查找故障的详细信息和可能的解决方案。例如针对服务不可用的故障,可以查看相关指标的变化情况,结合日志信息,定位问题所在,比如网络故障、服务配置错误等。
故障解决:基于分析结果,采取相应的措施来解决故障,可能包括重启 Pod、调整资源配额、修复应用程序代码等。
4.资源利用率
监控资源利用率,帮助进行资源规划和优化,确保资源的有效利用。
场景:使用 Prometheus 在 Kubernetes 环境中监控资源利用率,例如某个 Pod 的 CPU 利用率异常上升,快速排查和解决异常问题。同时帮助进行资源规划和优化,确保资源的有效利用。步骤:
指标采集:使用 Prometheus 采集 Pod 和节点资源利用率指标。
监控面板:通过 Prometheus 的监控面板更直观地监控资源利用率的变化情况。
告警通知:配置资源利用率数据相关的告警规则,例如当 CPU 利用率超过阈值时触发告警。
异常定位:分析异常上升的 Pod 的资源利用率数据,结合日志等信息,定位引起 CPU 利用率异常的具体原因,比如应用程序 bug、配置问题或者资源不足等。
异常解决:根据定位的问题原因,采取相应的措施解决问题,比如优化应用程序代码、调整资源配置或者增加集群资源等。
5.自动收缩
场景:在 Kubernetes 集群中,基于 Prometheus 监控指标实现自动水平扩展 Pod 的伸缩功能,以应对负载变化,提高系统的弹性和效率,确保应用在不同负载下的稳定性和可用性。步骤:
指标采集:使用 Prometheus 采集 Kubernetes 集群中的指标,如 CPU 利用率、内存利用率、网络流量等。
自动伸缩规则:基于 Prometheus 监控的指标,定义自动伸缩的规则,如根据 CPU 利用率来动态扩展或缩减 Pod 的副本数量。
设置自动伸缩:使用 Kubernetes 的 Horizontal Pod Autoscaler(HPA)来创建自动伸缩器,将 Prometheus 监控的指标与自动伸缩规则关联起来。
自动伸缩效果:观察自动伸缩器根据 Prometheus 监控指标的变化,自动调整 Pod 的副本数量,以适应负载变化。据实际情况和经验,不断优化自动伸缩规则,以提高系统的自适应性和性能表现。
监控系统(自建与托管对比)
Prometheus 作为 Kubernetes 的标准监控解决方案,一般有两种试用方式:
基于开源 Prometheus 自行搭建。
直接使用云厂商的托管 Prometheus。
如果基于开源自建 Prometheus,一般会遇到一些问题,给企业带来困扰。
1、对于中小企业,使用成本高
自建 Prometheus 的使用成本,包括机器资源成本和人力成本,最主要的是人力成本。其中人力成本又包括:
前期调研成本
中期搭建成本
后期维护成本
由于中小企业的运维团队规模较小,一般不多于 5 人,有的甚至只有一两个人,要自建和维护一套 Prometheus 监控服务,显然非常吃力。
2、对于大企业,可扩展性差,容易出现性能瓶颈
大企业或快速发展的中型企业,在业务发展初期自建 Prometheus 监控,但随着业务量高速的增长,意味着更多资源的投入,对监控也有了更高的要求。自建 Prometheus 就会开始暴露出可扩展性差、性能瓶颈的问题,使企业运维面临巨大的挑战。
基于以上原因,越来越多的企业选择直接使用全托管、免运维的云上 Prometheus 监控服务,以下以腾讯云 Prometheus 监控服务举例,做个对比。
腾讯云托管 Prometheus 与自建 Prometheus 对比
![](https://static001.geekbang.org/infoq/88/88f4478db734d5e93c121eeaca76a5a9.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
Prometheus 监控容器服务
1.容器服务开通 Prometheus 监控
方式一:在 Prometheus 监控页面关联容器集群
在 Prometheus 监控实例详情页,单击数据采集 > 集成容器服务 > 关联集群,选择需要关联的容器集群,完成关联。
![](https://static001.geekbang.org/infoq/55/55476b9ce176381b56d6a8faad242341.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
方式二:在新建容器集群页面关联 Prometheus 监控
标准集群和 Serverless 集群的新建页面,Prometheus 监控服务配置项,点击选择 Prometheus 实例,集群创建成功后将自动关联 Prometheus。
![](https://static001.geekbang.org/infoq/b9/b98f047621a1db4b0060fcaf9657e969.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
方式三:在容器集群详情页开通 Prometheus 监控(近期新上线)
在容器集群详情页,点击一键开通 Prometheus 监控或关联已有 Prometheus 实例,完成集群关联 Prometheus。
![](https://static001.geekbang.org/infoq/fd/fd0fa0f5c3f9bc165f117e89368168de.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
2.配置指标的采集
基础监控
容器集群关联 Prometheus 监控后,会默认采集基础的免费指标,免费指标可覆盖最基础的监控场景。如需配置采集更多基础监控指标,可以在 Prometheus 监控实例详情页,点击数据采集 > 集成容器服务 > 数据采集配置,选择对应组件点击指标详情,在弹窗指标列表中勾选需要新采集的指标。
![](https://static001.geekbang.org/infoq/b7/b77ac521e34f1eb0d6c1f8af19774f2f.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
![](https://static001.geekbang.org/infoq/75/7573bc5e51ad2aeebccbe619c2f568bb.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
一键采集预设图表指标
支持一键选择 Prometheus 监控预设容器图表相关的全部指标,快速完成图表指标配置。
![](https://static001.geekbang.org/infoq/37/372ca47a7831480480e1ce6ba7860bc6.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
自定义监控
对于自定义指标的采集,Prometheus 监控服务预置了部分采集配置文件,用来常用的采集场景。
可以在 Prometheus 监控实例详情页,点击数据采集 > 集成容器服务 > 数据采集配置,选择新建自定义监控,在弹窗中通过【页面编辑】或【yaml 编辑】的方式配置新的数据采集规则来监控您的业务数据。
![](https://static001.geekbang.org/infoq/4c/4c3dffce75e1e91f57eef5ae52e16919.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
![](https://static001.geekbang.org/infoq/f6/f636e97ea66cfc47c6f210030c976397.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
其他组件监控
Prometheus 监控的集成中心,支持一键安装常用组件的监控指标采集,包括中间件、数据库、大数据、健康巡检等。
![](https://static001.geekbang.org/infoq/6e/6e0032d052c56d5a37f98b9ba9c3bed4.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
3.查看指标的监控图表
容器集群关联 Prometheus 监控后,可通过以下两种方式查看监控图表:
容器详情页内嵌监控图表
点击集群详情页的 Prometheus 监控 ,可以看到内嵌的监控图表,展示常用的基础指标。
内嵌监控图表指标提供 5 个大类(监控概览、核心组件监控、节点监控、应用监控、网络监控、存储监控)中 20 个子类的 Dashboard。
![](https://static001.geekbang.org/infoq/12/1210499929d725075b2cbc6d3a99907b.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
Grafana 平台预设监控面板
将 Prometheus 监控绑定 Grafana 实例后,可以前往 Grafana 平台查看常用指标的预设监控面板,预设监控面板列表如下:
![](https://static001.geekbang.org/infoq/aa/aabbf2002b5018ce8a9a557f2e309cd1.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
Grafana 平台还支持配置展示更多种监控数据的一体化监控大盘,可以通过 Prometheus 监控采集业务监控、应用层监控、中间件监控、系统层监控的监控数据,可实现如下演示 demo 的效果:
![](https://static001.geekbang.org/infoq/4d/4d5f8327f803969470b2fb11f1c42884.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
4.管理告警
在 Prometheus 监控实例详情页,点击告警管理 > 告警策略 ,选择新建告警策略,支持【选择模板】、【页面编辑】、【YAML 编辑】三种配置方式,推荐使用模板创建,我们预设了容器相关常用监控指标的告警策略模板作为专家建议,帮助用户快速完成告警配置。
告警通知渠道支持腾讯云通知模板(电话/短信/邮件/微信/企业微信)、webhook、Alertmanager 三种方式。同时支持告警收敛、告警静默、告警排班等高级告警能力。
![](https://static001.geekbang.org/infoq/3b/3bbdd0c121825506c6bc0b0823b9e4cd.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
【重磅优惠】新用户免费试用 15 天
近期我们新推出了针对新用户的免费试用 15 天的优惠活动,欢迎您体验,进一步了解腾讯云 Prometheus 监控服务。
【免费试用】使用路径:
(1)Prometheus 监控控制台列表页,点击【免费试用】入口,进入购买页
![](https://static001.geekbang.org/infoq/01/014a34136d94660fdcab13dac1ffa700.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
(2)在购买页中,配置免费试用实例信息,默认同步创建 Grafana 免费试用实例。
![](https://static001.geekbang.org/infoq/a2/a2ef1d647e3efd539f73015a17f89381.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
(3)开始体验上述介绍的产品功能,以及探索更多好用的功能。
相关产品
腾讯云 Prometheus 监控服务: https://console.cloud.tencent.com/monitor/prometheus
腾讯云 Grafana 服务: https://console.cloud.tencent.com/monitor/grafana
腾讯云容器服务:https://console.cloud.tencent.com/tke2
参考资料
https://kubernetes.feisky.xyz/introduction/index
联系我们
如有任何疑问,欢迎加入官方技术交流群
![](https://static001.geekbang.org/infoq/bc/bce2b511a791b616a873cbdfc5014306.webp?x-oss-process=image%2Fresize%2Cp_80%2Fformat%2Cpng)
关于腾讯云可观测平台
腾讯云可观测平台(Tencent Cloud Observability Platform,TCOP)基于指标、链路、日志、事件的全类型监控数据,结合强大的可视化和告警能力,为您提供一体化监控解决方案。满足您全链路、端到端的统一监控诉求,提高运维排障效率,为业务的健康和稳定保驾护航。功能模块有:
Prometheus 监控:开箱即用的 Prometheus 托管服务;
应用性能监控 APM:支持无侵入式探针,零配置获得开箱即用的应用观测能力;
云拨测 CAT:利用分布于全球的监测网络,提供模拟终端用户体验的拨测服务;
前端性能监控 RUM:Web、小程序等大前端领域的页面质量和性能监测;
Grafana 可视化服务:提供免运维、免搭建的 Grafana 托管服务;
云压测 PTS:模拟海量用户的真实业务场景,全方位验证系统可用性和稳定性;
......等等
版权声明: 本文为 InfoQ 作者【腾讯云可观测平台】的原创文章。
原文链接:【http://xie.infoq.cn/article/3954bdb11772d711dbfcb85a4】。文章转载请联系作者。
评论