监控在生产系统中是必不可少的一部分,是系统稳定运行的重要基础,尤其是在云原生环境下,良好的指标监控系统对云原生应用的高效、平稳运行起到了重要的作用。
监控指标数据是可累加的,它们具有原子性,每个都是一个逻辑计量单元,或者一个时间段内的综合数据。监控的结果可以很好地观察系统的状态和趋势,但相比较于日志和追踪,监控结果对于问题的定位缺乏细节展示。
云原生架构的监控挑战
传统的监控系统在面对大规模复杂的业务和平台时,在设计和实现上就会有重大的挑战,而在云原生架构下,如何实现高效、稳定的监控系统,其面临的挑战将会更严峻。
- 监控维度更复杂
在云原生架构下,一方面,除了业务本身,还增加了集群、节点、命名空间、Service、Pod等众多维度,另一方面,节点上承载微服务的容器密度较传统应用部署变得更大,而且容器生命周期变得极短,这就意味着短时间内有大量的容器ID、Pod名称、标签等信息在不断地变化。这些对监控系统来说,都将是一个重要的挑战。
- 资源消耗更大
在云原生架构中,以Kubernetes为代表的编排平台,为云原生应用的配置、部署、运行等提供了极大的动态性和灵活性。这在提升了监控系统复杂性的同时,也提升了其对资源的消耗,如何在获取最佳监控数据的同时,能够尽可能地降低资源开销,降低对业务系统和平台造成的影响,也将是实现良好监控系统的一个重大挑战。
云原生架构的监控指标
Kubernetes的监控一方面需要包括对整个基础架构平台的监控,另一方面包括对正在运行的工作负载的监控。具体的监控指标根据集群的特性不同而有所差异,常见的监控指标如下。
- Kubernetes组件状态指标
Kubernetes集群架构包括一个主节点和多个计算节点,主要组件包括etcd、APIServer、scheduler、kube-controller-manager等。通过对Kubernetes组件的运行状态进行监控,可以有效地保证基础平台的正常运行。
- 集群状态指标
集群状态可以说是一个基本的,也是关键的监控指标,我们需要知道集群中所有的聚合资源当前的状态以及使用情况,比如节点的状态、可用的Pod、不可用Pod等。
- 资源状态指标
首先是CPU利用率。清晰准确地知道节点CPU资源的使用情况,对保障系统以及应用的平稳、安全运行有着至关重要的作用。通过CPU资源使用情况的监控,我们还可以分析资源使用行为,发现挖况、拒绝服务等针对计算资源的恶意行为。
其次是内存压力。这个监控指标展示了一个节点正在使用的内存量,通过监控数据,我们可以实时地了解整个节点内存的使用状态,防止节点因内存耗尽而对应用运行产生影响。
最后是磁盘压力。磁盘在使用过程中通常会设置相应的使用阈值,通过对磁盘使用情况的监控,结合既定的使用阈值,可判断节点磁盘空间的使用情况,进而确定是否需要增加额外的磁盘空间、当前应用程序的磁盘使用是否正常、是否需要对应用程序的磁盘使用进行调整等。
- 网络状态指标
基于微服务架构的云原生应用,其服务间的网络通信异常频繁,只有确保通信的正常才能保证业务系统的顺畅运行。通过监控网络状态指标(比如带宽、速率、连接状态等),可及时地发现网络问题,进而对问题进行定位、处置。另外,对于网络状态监控,除了能够发现并解决网络故障问题,还可以通过对网络状态数据进行分析,判断是否存在网络层入侵,比如拒绝服务入侵的检测,再比如异常网络行为的检测等。
- 作业运行指标
在Kubernetes中使用了Job和CronJob两个资源,以提供一次性任务和定时任务的特性,这两种资源使用控制器模型来实现资源的管理。基于这种机制,可以有效地对Pod进行管理和控制,同时对这些内容进行监控,还可以发现相关问题,比如作业失败、崩溃循环、资源耗尽等。
云原生架构的监控工具
- cAdvisor是Google开源的一个收集容器资源使用情况的监控工具,是Kubelet内置的容器资源收集工具。它可以自动发现给定节点中的所有容器,并收集CPU、内存、文件系统和网络使用情况等统计信息,并对外提供cAdvisor原生的API。cAdvisor是监控数据的采集器,本身并不提供任何长期存储或分析功能,而且它仅会收集基本资源利用率。Heapster是容器集群监控和性能分析工具,支持Kubernetes。Heapster是一个收集者,将每个节点上的cAdvisor数据进行汇总,然后导入后端的存储中(如InfluxDB),并且可以进一步实现可视化(如Grafana)。
- Prometheus采用多维数据模型,其中包含通过指标名称和键/值对标识的时间序列数据,以及灵活的查询语言PromQL实现这种多维度的数据检索。同时,它不依赖分布式存储,单个节点是自治的,通过基于HTTP的pull方式采集时序数据,也可以通过中间网关进行时间序列数据推送(pushing)。其中主要包括Prometheus Server、Pushgateway、Exporters、Alertmanager等组件,其中Prometheus Server是Prometheus的主服务,主要用于数据的采集和存储、PromQL查询、报警配置等;Pushgateway用作批量、短期监控指标数据的推送总节点;Exporters是各种汇报数据的导出器,如汇报机器数据的node_exporter、汇报MongoDB信息的MongoDB_exporter等;Alertmanager是用于告警的处理。