近年来,Kubernetes作为众多公司云原生改造的首选容器化编排平台,越来越多的开发和运维工作都围绕Kubernetes展开,保证Kubernetes的稳定性和可用性是最基础的需求,而这其中最核心的就是如何有效地监控Kubernetes集群,保证整个集群的一个良好的可观察性。本期将为大家介绍如何对Kubernetes开展全方位的监控与分析。
监控整体架构
Kubernetes的监控整体上可以分为4层,自底向上包括基础设施监控、ServiceMesh监控、接入层监控、业务监控,其中越底层的监控覆盖面越广,可能也会包括一些上层的监控,比如从K8s的事件中也可以监控业务容器的一些状态,做到一定程度的业务监控;而越往上会更加贴近业务,相关的指标也更能反映出业务是否正常,比如接入层的Ingress日志,直接就能看到当前服务的成功率、延迟等关键指标,而业务日志的监控则会更加具有针对性,所以监控的价值也越高。
从实施角度上来讲,一般会自底向上逐步实施,而且底层的监控相对固定,SLS都提供了一些标准的监控模板可以直接使用,部署复杂度会低;而上层的业务监控一般需要依赖业务方的日志/监控数据输出,而且不同公司不同技术栈的数据格式都不一样,需要实施者做很多定制化工作。
数据中台实施方式
上述的监控架构设计非常多的数据源和数据格式,包括硬件、操作系统、Kubernetes系统组件、ServiceMesh、Ingress、业务Pod等,数据格式包括日志(Logging)、监控指标(Metrics)、链路追踪(Tracing)数据。需要借助于阿里云SLS才能完整支持一整套监控体系。SLS提供了支持日志(Logging)、监控指标(Metrics)、链路追踪(Tracing)数据的存储和查询引擎,并支持各种分析、可视化、告警方式,而且所有功能都提供了API接口调用,可定制程度极高。基于SLS提供的DevOps数据中台,可快速构建出一套适用于自己公司的Kubernetes监控方案。
目前SLS对于Kubernetes的基础监控、ServiceMesh、接入层都提供了监控模板,可以借助模板快速部署一套监控方案。下面我们将为大家介绍如何部署这些监控模板。
基础指标监控-Prometheus
众所周知,Kubernetes是CNCF的第一个毕业项目,也是最火的项目,而Prometheus则是CNCF下第二个毕业的项目,也是CNCF除Kubernetes外最火爆的项目。可以毫不夸张的说,Prometheus已经成为了云原生领域监控的事实标准,如果说开启云原生的第一步是拥有一个Kubernetes环境,那Prometheus就是云原生下监控的第一步。关于SLS支持Prometheus的相关功能介绍可以参考之前的文章:《高性能、高可用、免运维-云原生Prometheus方案与实践》。
Prometheus在Kubernetes上部署非常简单,只需要部署一个Prometheus Operator即可完成,目前阿里云Kubernetes的应用市场已经内置了Prometheus Operator,可以直接选择安装,具体操作方式可以参考:《使用Prometheus采集Kubernetes监控数据》。整体步骤分为:
- 创建一个Namespace,名为monitoring
- 在monitoring下创建一个保密词典,填写上申请好的只具备SLS权限的AK
- 在容器服务Kubernetes应用市场安装PrometheusOperator,修改其中的RemoteWrite部分参数
- 配置Grafana连接SLS进行可视化
- 基于Grafana或SLS配置监控告警
基础事件监控-Kubernetes事件中心
为了让用户对Kubernetes的内部状态有更好的了解,Kubernetes引入了事件(Events)系统,在Kubernetes的资源产生变化的时候,会以事件的形式记录在APIServer中,并可以通过API或者 kubectl 命令去查看件。
Kubernetes事件包含了发生的时间、组件、等级(Normal、Warning、Error)、类型、详细信息,通过事件我们能够知道应用的部署、调度、运行、停止等整个生命周期,也能通过事件去了解系统中正在发生的一些异常。在Kubernetes各个组件的源码中都会定义该组件可能会触发的事件类型,例如kubelet的事件源码。
为了让大家更便捷的使用Kubernetes事件功能,阿里云容器服务Kubernetes和日志服务SLS合作推出了Kubernetes事件中心,支持将Kubernetes中的事件实时采集到日志服务中,把阿里工程师在多年Kubernetes运维中积累的事件监控、告警指标提炼到事件中心,开箱即可获得这些积累的运维经验,相关文章可以参考《Kubernetes可观察性:全方位事件监控》。
事件中心的部署方式非常简单,默认在阿里云Kubernetes开通的时候就已经勾选,开通后就会自动创建出事件中心;如果没有勾选安装事件中心,可以在阿里云Kubernetes应用市场安装ack-node-problem-detector,具体可参考《创建并使用Kubernetes事件中心》,安装后会自动开启事件中心。
接入层监控-Ingress访问日志监控与分析
在K8s中,组件通过Service对外暴露服务,常见的包括NodePort、LoadBalancer、Ingress等。其中Ingress主要提供HTTP层(7层)路由功能,相比TCP(4层)的负载均衡具备非常多的优势(路由规则更加灵活、支持金丝雀、蓝绿、A/B Test发布模式、SSL支持、日志、监控、支持自定义扩展等),是目前K8s中HTTP/HTTPS服务的主流暴露方式。
K8s中Ingress只是一种API资源的声明,具体的实现需要安装对应的Ingress Controller,由Ingress Controller接管Ingress定义,将流量转发到对应的Service。目前Ingress Controller的实现有非常多种(具体可以参考Ingress Controller官方文档),比较流行的有Nginx、Traefik、Istio、Kong等,在国内接受度最高的是Nginx Ingress Controller。
Ingress日志的分析与监控方案需要搭建多个模块(采集Agent、数据队列、索引、可视化、告警灯),工作量极大。为简化广大用户对于Ingress日志分析与监控的门槛,阿里云容器服务和日志服务将Ingress日志打通(官方文档),只需要应用一个yaml资源即可完成日志采集、分析、可视化等一整套Ingress日志方案的部署。
整个Ingress的监控方案部署极其简单,默认在阿里云Kubernetes开通的时候就已经支持,开通后就会自动创建出Ingress方案;如果没有勾选安装,只需按照文档应用一个yaml即可完成。Ingress监控提供了秒级的各类维度监控信息,包括PV、UV、地域分布、成功率、平均延迟、P99/P9999延迟等,此外还支持蓝绿版本对比,便于灰度发布时对比新老版本的关键指标。
ServiceMesh监控-Istio访问日志监控
现在越来越多的企业开始选择使用ServiceMesh,其中Istio已经逐渐成为主流。目前SLS已经支持和阿里云服务网格(ASM)直接对接,和Ingress方案类似,直接控制台勾选或手动部署yaml即可完成安装,详细使用过程可参考《使用日志服务采集数据平面的AccessLog》。
业务监控-自定义日志分析
Kubernetes下的业务监控最佳方式还是基于日志的分析与监控,日志采集在Kubernetes中相比传统的采集方式要复杂,需要考虑动态性、多目标、多日志格式等问题,主流的采集软件很难稳定工作。目前Kubernetes日志借助于SLS提供的Logtail可以实现非常稳定的采集,支持CRD的Operator扩展方式,使用起来非常便捷,只需要部署一个yaml即可定义采集的数据源和目标存储,并且支持stdout、文件、宿主机、Journal等各种方式。详细的功能优势以及特点可以参考《直击痛点,详解 K8s 日志采集最佳实践》。
在Kubernetes中最常见的是使用stdout和文件的采集方式,相关的采集都可以通过CRD的方式来实现,详情操作方式可参考:
数据采集完毕后,SLS支持各类日志查看、分析、可视化以及监控方式,这里建议使用的功能如下:
- 问题排查时使用日志查询、LiveTail、上下文、日志聚类等功能;
- 配置可视化报表用户业务指标展示;
- 使用关键词告警功能,对日志中出现的Error、Exception等进行实时告警;
- 使用业务指标告警功能,对业务流量、延迟、错误率等关键指标进行实时告警。
总结
Kubernetes提供了强大的功能,让我们服务发布、运维管理复杂性大大降低,但由于整体架构多了一个编排层,所以需要监控方案针对Kubernetes进行单独的配置,最佳的方式还是部署一整套自底向上的监控系统。借助于SLS提供的各类模板和功能,可以快速搭建出适应于自己业务场景的Kubernetes监控。
大家在使用SLS过程中,如有任何问题, 可提工单, 或在用户群中反馈(见下放钉钉二维码), 也欢迎关注我们的微信公众号, 会推送实用的使用技巧和最佳实践哦~