华为云云原生钻石集训营 第九课:Kubernetes运维管理详解(下)

课程目标:

1.了解集群监控基本方法

2.了解常见集群组件故障排错分析方法

3.了解华为云CIE集群监控方案架构

目录:

1.集群可观测性详解

2.常见集群故障排错分析

3.华为云CIE集群监控方案架构详解

上一节课我们了解了应用在k8s生产环境中的最佳实践,包括应用更新与回滚,应用健康检查,弹性伸缩等特性。

本次课程将会带领大家深入理解K8S集群监控的最佳实践,帮助大家构建稳定、可靠的云原生应用服务。


1.集群可观测性详解

云原生应用特点:

应用架构:

    1.从单体应用向微服务过渡

    2.应用架构过渡为松耦合系统

    3.应用版本迭代更快、周期更短

基础设施层:

    1.容器化、应用自身快、轻、微

    2.Kubernetes成为运行容器的默认平台

    3.laaS、PaaS平台底层来承载Kubernetes平台

软件生命周期:

    1. 服务通过DevOps流水线持续部署

    2.服务变更低成本和低风险

    3.呈现高频率和全自动变更

K8S与云原生应用监控挑战

K8S架构复杂性:K8S架构包括控制节点和工作节点。各自包含一组相互通信的组件,比如kube-apiserver,etcd, kubelet等,

微服务架构:应用从单体到微服务架构的转变,导致应用数量激增,相互依赖关系复杂,出现了问题之后,如何快速定位到发生问题的根本原因.

动态性:应用的迭代更新更加便捷迅速,POD、Service等资源随时可能会销毁或重建,需要监控系统具备动态发现k8s资源的能力。

成本:微服务的规模和动态性使得监控数据规模和收集的成本大幅度提高。

云原生可观测性

为了应对云原生监控的挑战,社区引入了可观测性这一理念。可观测性系统主要基于Metrics、Traces、Logs三大数据类型构建。

Metrics:收集并存储海量指标,通过指标阈值等手段实现告警通知,从而告知有没有问题发生。

Traces:通过告警指标发现问题后,依据调用追踪分析,进一步明确是什么问题。

Logs:明确了问题发生的对象或者位置后,通过日志分析等手段实现为什么问题会发生,即找到问题的根因。

围绕着这三种数据类型,开源社区构建了多种多样的开源产品,像Prometheus, Cortex, node-problem-detector,Fluentd,ELK,Loki,Jaeger等。

指标监控与prometheus

指标监控:

指标(Metrics)是在许多个连续的时间周期里度量的KPI数值。

比如我们常常谈到的一个应用在过去十分钟、半小时内的CPU、内存占用率等。

一般情况下可以将指标进行如下分类:

系统指标:集群CPU使用率、磁盘使用率以及网络宽带情况等等。

应用指标:QPS、出错率、平均延时等。

业务指标:用户会话、订单数量和营业额等。

Prometheus简介:

Prometheus受启发于Google的Brogmon监控系统(相似的Kubernetes是从Google的Brog系统演变而来),从2012年开始由前Google前工程师在Soundcloud以开源软件的形式进行研发,并且于2015年早期对外发布早期版本。2016年5月继Kubernetes之后成为第二个正式加入CNCF基金会的项目。

目前,Prometheus已经成为云原生监控领域的事实标准。

常见的开源指标监控系统有Zabbix、Prometheus等;还有一些商业监控产品,比如sysdig、dynatrace等。

Prometheus架构

prometheus的主要特点:

自定义多维数据模型(时序列数据由metric名和一组key/value标签组成)。

非常高效的存储,平均一个采样数据占~3.5 bytes左右,320万的时间序列,每30秒采样,保存60天,消耗磁盘大概228G。

在多维度上灵活且强大的查询语言(promQL),支持sum,rate,max,min等大量的计算函数。

不依赖分布式存储,支持单节点工作。

基于pull方式采集时序数据。

可以通过push gateway进行时序列数据推送(pushing)。

可以通过服务发现或者静态配置去获取要采集的target。

社区支持大量的第三方exporter和client库。

基于Prometheus-operator集群监控

prometheus-operator:本质是一组CRD和controller的实现,prometheus operator提供如下几类CRD:

Prometheus:声明式创建和管理Prometheus Server实例;

ServiceMonitor:负责声明式的管理监控配置;

PrometheusRule:负责声明式的管理告警配置;

Alertmanager:声明式的创建和管理Alertmanager实例。

简言之,Prometheus Operator能够帮助用户自动化的创建以及管理Prometheus Server以及其相应的配置。

集群事件监控

k8s的Event事件是一种资源对象,用于展示集群内发生的情况,k8s系统中的各个组件会将运行时发生的各种事件上报给apiserver。可以通过kubectl get event或kubectl describe pod podName 命令显示事件,查看k8s集群中发生了哪些事件。

apiserver会将Event事件存在etcd集群中,为避免磁盘空间被填满,故强制执行保留策略:在最后一次的事件发生后,删除1小时之前发生的事件。

集群日志监控(fluentd +ELK)

日志在K8S里面主要分为四个大的场景:

1.主机内核的日志:比如文件系统异常,kernelpanic,或者〇OM日志等。

2.Runtime日志:比较常见的是Docker的一些日志,我们可以通过docker的日志来排查类似像Pod Hang这一系列的问题。

3.核心组件日志:在K8s 里面核心组件包含了etcd,apiserver、kube-scheduler、controller-manger、kubelet 等等一系列的组件。这些组件的日志可以帮我们来看到整个K8s集群管控面是否有一些异常。

4.应用日志:可以通过应用的日志来查看业务层的一个状态。比如说可以看业务层有没有500的请求?有没有一些panic?有没有一些异常的错误访问?那这些其实都可以通过应用日志来进行查看的。

拓扑与调用链

当我将单体应用拆成多个微服务之后,如何监控服务之间的依赖关系和调用链,以判断应用在哪个服务环节出了问题,哪些地方可以优化?这就需要用到分布式追踪(Distributed Tracing)。

CNCF 提出了分布式追踪的标准OpenTracing,它提供用户厂商中立的API,并提供Go、Java、JavaScript、Python、Ruby、PHP、Objective-C、C++和C#这多种语言的库。

同时CNCF中还有个端到端的支持OpenTracingAPI的分布式追踪项目Jaeger。

2.常见集群故障排错分析

集群常见问题排障

k8s常用排错方法:

查看Kubernetes对象的当前运行时信息,特别是与对象关联的Event事件。这些事件记录了相关主题、发生时间、最近发生时间、发生次数及事件原因等,对排查故障非常有价值。

对于服务、容器方面的问题,可能需要深入容器内部进行故障诊断,此时可以通过查看容器的运行日志来定位具体问题。

对于某些复杂问题,例如Pod调度这种全局性的问题,可能需要结合集群中每个节点上的Kubernetes服务日志来排查。比如搜集Master上的kube-apiserver、kube-schedule、kube-controler-manager服务日志,以及各个Node上的kubelet、kube-proxy服务日志,通过综合判断各种信息来定位问题。

常见K8S问题举例:

1.无法下载镜像

2. POD持续重启

3.通过Service无法访问

3.华为云CIE集群监控方案架构详解

容器洞察引擎(Container Insight Engine)提供跨集群集中统一的云原生容器应用监控运维能力,支持多集群集中告警、事件管理,指标管理和分布式调用链跟踪能力。借助CIE,用户可以在华为云上获得容器化应用的全栈易用的可观测性能力。

架构特点:

1.全面兼容云原生技术

基于原生K8s+Prometheus的监控架构体系,增强了开箱即用的能力。从容应对容器生命周期动态变化、海量指标的挑战。

2.以应用为中心,聚焦业务指标

聚焦应用Golden Signal (RPS,Error,Duration)等,并适时关联资源指标。

3.Everything in One Place,快捷排障

应用全景视图和资源映射,可以无缝关联告警、事件、日志等信息。

分布式调用链和依赖拓扑,应对服务网格化,支持快速排障。

4.一键诊断,主动预测预警

一键式集群业务诊断,关键指标主动预测,提前预警

集中告警/事件/日志:具备多集群告警、事件、日志统一管理能力;

告警通知灵活:支持基于PromQL表达式的阈值告警,支持K8s事件转告警能力,告警可通过邮件,短信、webhook等通道及时通知给用户;

统一日志存储:支持多种日志存储方式,支持日志浏览、统计聚合;支持日志关键词告警;

本课总结:

Prometheus:云原生监控系统,云原生监控事实标准。

K8s Event:K8s Event是一种资源对象,用于展示集群内发生的情况,k8s系统中的各个组件会将运行时发生的各种事件上报给apiserver.

Fluentd:fluentd是一个针对日志的收集、处理、转发系统。通过丰富的插件系统,可以收集来自于各种系统或应用的日志,转化为用户指定的格式后,转发到用户所指定的日志存储系统之中。

Jaeger:Jaeger是Uber开源的分布式跟踪系统,现在已经成为CNCF的开源项目,其灵感来源于Google的Dapper和twitter的Zipkin

参考链接:

Prometheus官方文档: https://prometheus.io/docs/introduction/overview/

NodeProblemDetector代码仓库: https://github.com/kubernetes/node-problem-detector

kubernetes-event-exporter代码仓库: https://github.com/opsgenie/kubernetes-event-exporter

(完)