第7章 监控与弹性能力
云原生应用的设计理念已经被越来越多的开发者接受与认可,而 Kubernetes 作为云原生的标准接口实现,已经成了整个技术栈的中心。
云服务的能力可以通过 Cloud Provider、CRD Controller、Operator 等方式从 Kubernetes 的标准接口向业务层透出。开发者可以基于 Kubernetes 来构建自己的云原生应用与平台,Kubernetes 成了“构建平台的平台”。
这一章内容以阿里云容器服务实现为范本,介绍一个云原生应用该如何在 Kubernetes 中无缝集成监控与弹性能力。
7.1 阿里云容器服务 Kubernetes 的监控总览
如图 7-1 所示,阿里云 Kubernetes 集群监控方案与云服务和开源方案深入结合,实现了完善的监控体系。
Transclude of 图7-1-阿里云Kubernetes集群监控方案
7.1.1 云服务集成
阿里云容器服务 Kubernetes 目前已经和四款监控云服务进行了“打通”,它们分别是:
- SLS(日志服务)
- ARMS(应用实时监控服务)
- AHAS(应用高可用服务)
- Cloud Monitor(云监控)
SLS(日志服务)
SLS 主要负责日志的采集、分析。在阿里云容器服务 Kubernetes 中,SLS 可以采集三种不同类型的日志:
- API Server 等核心组件的日志。
- Service Mesh 和 Ingress 等接入层的日志。
- 应用的标准日志。
其中 Ingress 接入层控制台界面如图 7-2 所示。
Transclude of 图7-2-Ingress接入层控制台界面
除了采集日志的标准链路外,SLS 还提供了上层的日志分析能力:
- 默认提供基于 API Server 的审计分析能力
- 接入层的可观测性展现
- 应用层的日志分析
在阿里云容器服务 Kubernetes 中,日志组件已经默认安装,开发者只需要在集群创建时勾选即可。
ARMS(应用实时监控服务)
如图 7-3 所示,ARMS 主要负责采集、分析、展现应用的性能指标。ARMS 目前主要支持 Java 与 PHP 两种语言的集成,可以采集虚拟机(JVM)层的指标,例如:
- GC 的次数
- 应用的慢 SQL 查询操作
- 调用栈等
对于后期性能调优可以起到非常重要的作用。
Transclude of 图7-3-应用实时监控系统
AHAS(架构感知监控)
AHAS 是架构感知监控,如图 7-4 所示。通常在 Kubernetes 集群中负载的类型大部分为微服务,微服务的调用拓扑也会比较复杂。因此当集群的网络链路出现问题时,如何快速定位问题、发现问题、诊断问题则成了最大的难题。AHAS 使用网络流量和走向数据,构造并展现出集群的拓扑结构,为业务提供了更高层次的问题诊断方式。
Transclude of 图7-4-架构感知监控
7.1.2 开源集成方案
开源方案的兼容和集成也是阿里云容器服务 Kubernetes 监控能力的一部分,主要包含如下两个部分。
1. Kubernetes 内置监控组件的增强与集成
在 Kubernetes 社区中,heapster / metrics-server 是内置的监控方案,而且 Dashboard、HPA 等核心组件会依赖于这些内置监控能力提供的性能数据。
由于 Kubernetes 生态中组件的发布周期和 Kubernetes 的 release 不一定保证完全同步,造成了部分消费者限于监控能力在 Kubernetes 中存在监控问题。阿里云就这个问题做了 metrics-server 的增强,实现了版本的兼容。
此外,针对节点的诊断能力,阿里云容器服务增强了 NPD 的覆盖场景,支持了:
- FD 文件句柄的监测
- NTP 时间同步的校验
- 出入网能力的校验等
并开源了 Eventer,支持收集离线 Kubernetes 的事件数据并发送给 SLS、Kafka 以及钉钉,实现 ChatOps。
2. Prometheus 生态的增强与集成
Prometheus 是 Kubernetes 生态中三方监控的事实标准,因此阿里云容器服务提供了其安装包供开发者一键集成。此外,还在如下三个层次做了增强:
- 存储和性能的增强:提供了产品级的存储能力支持(TSDB、InfluxDB),保证了持久高效的监控数据写入与查询。
- 采集指标的增强:修复了部分由于 Prometheus 自身设计缺陷造成的监控不准的问题,提供了 CPU 单卡、GPU 多卡、GPU 共享分片的 Exporter。
- 上层可观测性的增强:支持场景化的 CRD 监控指标集成,例如 Argo、Spark、TensorFlow 等组件的云原生监控能力,支持多租户场景下应用可观测性。
7.2 阿里云容器服务 Kubernetes 的弹性总览
阿里云容器服务 Kubernetes 主要包含如下两大类弹性组件:调度层弹性组件与资源层弹性组件,如图 7-5 所示。
Transclude of 图7-5-阿里云Kubernetes集群弹性方案
7.2.1 调度层弹性组件
调度层弹性组件是指所有的弹性动作都是和 Pod 相关的,与具体的资源情况无关。
HPA(Horizontal Pod Autoscaler)
HPA 是 Pod 水平伸缩的组件。除了社区支持的 Resource Metrics 和 Custom Metrics,阿里云容器服务 Kubernetes 还提供了 external-metrics-adapter,支持云服务的指标作为弹性伸缩的判断条件。目前已经支持多个产品不同维度的监控指标,例如:
- Ingress 的 QPS、RT
- ARMS 中应用的 GC 次数、慢 SQL 次数等
VPA(Vertical Pod Autoscaler)
VPA 是 Pod 纵向伸缩的组件,主要面向有状态服务的扩容和升级场景。
cronHPA
cronHPA 是定时伸缩组件,主要面向的是周期性负载。通过资源画像可以预测有规律的负载周期,并通过周期性伸缩,实现资源成本的节约。
Resizer
Resizer 是集群核心组件的伸缩控制器。可以根据集群的 CPU 核数、节点的个数,实现线性和梯度两种不同的伸缩。目前主要面对的场景是核心组件的伸缩,例如 CoreDNS。
7.2.2 资源层弹性组件
对于资源层弹性组件,弹性的操作都是针对 Pod 和具体资源关系的。
Cluster Autoscaler
Cluster Autoscaler 是目前比较成熟的节点伸缩组件。主要应用场景是当 Pod 资源不足时进行节点的伸缩,并将无法调度的 Pod 调度到新弹出的节点上。
Virtual kubelet autoscaler
Virtual kubelet autoscaler 是阿里云容器服务 Kubernetes 开源的组件,和 Cluster Autoscaler 的原理类似。当 Pod 由于资源问题无法调度时,弹出的不是节点,而是将 Pod 绑定到虚拟节点上,并通过 ECI 的方式启动 Pod。
弹性方案演示
最后给大家做一个简单的方案演示。如图 7-6 所示:
- 应用主体是
Apiservice,Apiservice会通过Sub-Apiservice调用Database。 - 接入层通过 Ingress 进行管理。
我们通过 PTS 模拟上层产生的流量,通过 SLS 采集接入层的日志,通过 ARMS 采集应用的性能指标,并通过 Alibaba cloud metrics adapter 暴露 external metrics,触发 HPA 重新计算工作负载的副本。当伸缩的 Pod 占满集群资源时,触发 Virtual kubelet autoscaler 生成 ECI 承载超过集群容量规划的负载。
Transclude of 图7-6-集群弹性方案示例
7.3 总结
在阿里云容器服务 Kubernetes 上使用监控和弹性能力是非常简单的。开发者只需一键安装相应的组件 Chart 即可完成接入。通过多维度的监控和弹性能力,可以让云原生应用在最低的成本下获得更高的稳定性和鲁棒性。