云原生应用-Kubernetes-监控与弹性实践

50次阅读

共计 2918 个字符,预计需要花费 8 分钟才能阅读完成。

前言  

云原生应用的设计理念已经被越来越多的开发者接受与认可,而 Kubernetes 做为云原生的标准接口实现,已经成为了整个 stack 的中心,云服务的能力可以通过 Cloud Provider、CRD Controller、Operator 等等的方式从 Kubernetes 的标准接口向业务层透出。开发者可以基于 Kubernetes 来构建自己的云原生应用与平台,Kubernetes 成为了构建平台的平台。今天我们会向大家介绍一个云原生应用该如何在 Kubernetes 中无缝集成监控和弹性能力。

本文整理自由阿里云容器平台技术专家 刘中巍(莫源)在 KubeCon 分享的《Cloud Native Application monitoring and autoscaling in kubernetes》演讲。获取 KubeCon 全部阿里演讲 PPT,关注阿里巴巴云原生公众号,微信菜单栏点击 PPT 下的“获取 PPT”

阿里云容器服务 Kubernetes 的监控总览

云服务集成  

阿里云容器服务 Kubernetes 目前已经和四款监控云服务进行了打通,分别是 SLS(日志服务)、ARMS(应用性能监控)、AHAS(架构感知监控服务)、Cloud Monitor(云监控)。

SLS 主要负责日志的采集、分析。在阿里云容器服务 Kubernetes 中,SLS 可以采集三种不同类型的日志

  • APIServer 等核心组件的日志
  • Service Mesh/Ingress 等接入层的日志
  • 应用的标准日志  

除了采集日志的标准链路外,SLS 还提供了上层的日志分析能力,默认提供了基于 APIServer 的审计分析能力、接入层的可观测性展现、应用层的日志分析。在阿里云容器服务 Kubernetes 中,日志组件已经默认安装,开发者只需要通过在集群创建时勾选即可。

ARMS 主要负责采集、分析、展现应用的性能指标。目前主要支持 Java 与 PHP 两种语言的集成,可以采集虚拟机(JVM)层的指标,例如 GC 的次数、应用的慢 SQL、调用栈等等。对于后期性能调优可以起到非常重要的作用。

AHAS 是架构感知监控,通常在 Kubernetes 集群中负载的类型大部分为微服务,微服务的调用拓扑也会比较复杂,因此当集群的网络链路出现问题时,如何快速定位问题、发现问题、诊断问题则成为了最大的难题。AHAS 通过网络的流量和走向,将集群的拓扑进行展现,提供更高层次的问题诊断方式。

开源方案集成

开源方案的兼容和集成也是阿里云容器服务 Kubernetes 监控能力的一部分。主要包含如下两个部分:

Kubernetes 内置监控组件的增强与集成  

在 kubernetes 社区中,heapster/metrics-server 是内置的监控方案,而且例如 Dashboard、HPA 等核心组件会依赖于这些内置监控能力提供的 metrics。由于 Kubernetes 生态中组件的发布周期和 Kubernetes 的 release 不一定保证完整的同步,这就造成了部分监控能力的消费者在 Kubernetes 中存在监控问题。因此阿里云就这个问题做了 metrics-server 的增强,实现版本的兼容。此外针对节点的诊断能力,阿里云容器服务增强了 NPD 的覆盖场景,支持了 FD 文件句柄的监测、NTP 时间同步的校验、出入网能力的校验等等,并开源了 eventer,支持离线 Kubernetes 的事件数据到 SLS、kafka 以及钉钉,实现 ChatOps。

Prometheus 生态的增强与集成   

Promethes 作为 Kubernetes 生态中三方监控的标准,阿里云容器服务也提供了集成的 Chart 供开发者一键集成。此外,我们还在如下三个层次作了增强:

  • 存储、性能增强:支持了产品级的存储能力支持(TSDB、InfluxDB),提供更持久、更高效的监控存储与查询。
  • 采集指标的增强:修复了部分由于 Prometheus 自身设计缺欠造成的监控不准的问题,提供了 GPU 单卡、多卡、共享分片的 exporter。
  • 提供上层可观测性的增强:支持场景化的 CRD 监控指标集成,例如 argo、spark、tensorflow 等云原生的监控能力,支持多租可观测性。

阿里云容器服务 Kubernetes 的弹性总览  

阿里云容器服务 Kubernetes 主要包含如下两大类弹性组件:调度层弹性组件与资源层弹性组件。

调度层弹性组件  

调度层弹性组件是指所有的弹性动作都是和 Pod 相关的,并不关心具体的资源情况。

  • HPA

HPA 是 Pod 水平伸缩的组件,除了社区支持的 Resource Metrics 和 Custom Metrics,阿里云容器服务 Kubernetes 还提供了 external-metrics-adapter,支持云服务的指标作为弹性伸缩的判断条件。目前已经支持例如:Ingress 的 QPS、RT,ARMS 中应用的 GC 次数、慢 SQL 次数等等多个产品不同维度的监控指标。

  • VPA 

VPA 是 Pod 的纵向伸缩的组件,主要面向有状态服务的扩容和升级场景。

  • cronHPA 

cronHPA 是定时伸缩组件,主要面向的是周期性负载,通过资源画像可以预测有规律的负载周期,并通过周期性伸缩,实现资源成本的节约。

  • Resizer

Resizer 是集群核心组件的伸缩控制器,可以根据集群的 CPU 核数、节点的个数,实现线性和梯度两种不同的伸缩,目前主要面对的场景是核心组件的伸缩,例如:CoreDNS。

资源层弹性组件

资源层弹性组件是指弹性的操作都是针对于 Pod 和具体资源关系的。

  • Cluster-Autoscaler 

Cluster-Autoscaler 是目前比较成熟的节点伸缩组件,主要面向的场景是当 Pod 资源不足时,进行节点的伸缩,并将无法调度的 Pod 调度到新弹出的节点上。

  • virtual-kubelet-autoscaler 

virtual-kubelet-autoscaler 是阿里云容器服务 Kubernetes 开源的组件,和 Cluster-Autoscaler 的原理类似,当 Pod 由于资源问题无法调度时,此时弹出的不是节点,而是将 Pod 绑定到虚拟节点上,并通过 ECI 的方式将 Pod 进行启动。

Demo Show Case 

最后给大家进行一个简单的 Demo 演示:应用主体是 apiservice,apiservice 会通 sub-apiservice 调用 database,接入层通过 ingress 进行管理。我们通过 PTS 模拟上层产生的流量,并通过 SLS 采集接入层的日志,ARMS 采集应用的性能指标,并通过 alibaba-cloud-metrics-adapster 暴露 external metrics 触发 HPA 重新计算工作负载的副本,当伸缩的 Pod 占满集群资源时,触发 virtual-kubelet-autoscaler 生成 ECI 承载超过集群容量规划的负载。

总结  

在阿里云容器服务 Kubernetes 上使用监控和弹性的能力是非常简单的,开发者只需一键安装相应的组件 Chart 即可完成接入,通过多维度的监控、弹性能力,可以让云原生应用在最低的成本下获得更高的稳定性和鲁棒性。


本文作者:jessie 筱姜

阅读原文

本文为云栖社区原创内容,未经允许不得转载。

正文完
 0