简介:本文会介绍 Kubernetes 可观测性零碎的构建,以及基于阿里云云产品实现 Kubernetes 可观测零碎构建的最佳实际。
作者:佳旭 阿里云容器服务技术专家
引言
Kubernetes 在生产环境利用的遍及度越来越广、复杂度越来越高,随之而来的稳定性保障挑战也越来越大。
如何构建全面深刻的可观测性架构和体系,是晋升零碎稳定性的要害之因素一。ACK将可观测性最佳实际进行积淀,以阿里云产品性能的能力对用户透出,可观测性工具和服务成为基础设施,赋能并帮忙用户应用产品性能,晋升用户 Kubernetes 集群的稳定性保障和应用体验。
本文会介绍 Kubernetes 可观测性零碎的构建,以及基于阿里云云产品实现 Kubernetes 可观测零碎构建的最佳实际。
Kubernetes 零碎的可观测性架构
Kubernetes 零碎对于可观测性方面的挑战包含:
- K8s 零碎架构的复杂性。零碎包含管制面和数据面,各自蕴含多个互相通信的组件,管制面和数据间之间通过 kube-apiserver 进行桥接聚合。
- 动态性。Pod、Service 等资源动态创建以及调配 IP,Pod 重建后也会调配新的资源和 IP,这就须要基于动静服务发现来获取监测对象。
- 微服务架构。利用依照微服务架构分解成多个组件,每个组件正本数能够依据弹性进行主动或者人工控制。
针对 Kubernetes 零碎可观测性的挑战,尤其在集群规模快速增长的状况下,高效牢靠的 Kubernetes 零碎可观测性能力,是零碎稳定性保障的基石。
那么,如何晋升建设生产环境下的 Kubernetes 零碎可观测性能力呢?
Kubernetes 零碎的可观测性计划包含指标、日志、链路追踪、K8s Event 事件、NPD 框架等形式。每种形式能够从不同维度透视 Kubernetes 零碎的状态和数据。在生产环境,咱们通常须要综合应用各种形式,有时候还要使用多种形式联动观测,造成欠缺平面的可观测性体系,进步对各种场景的覆盖度,进而晋升 Kubernetes 零碎的整体稳定性。上面会概述生产环境下对 K8s 零碎的可观测性解决方案。
指标(Metrics)
Prometheus 是业界指标类数据采集计划的事实标准,是开源的零碎监测和报警框架,灵感源自 Google 的 Borgmon 监测零碎。2012 年,SoundCloud 的 Google 前员工发明了 Prometheus,并作为社区开源我的项目进行开发。2015 年,该我的项目正式公布。2016 年,Prometheus 退出 CNCF 云原生计算基金会。
Prometheus 具备以下个性:
- 多维的数据模型(基于工夫序列的 Key、Value 键值对)
- 灵便的查问和聚合语言 PromQL
- 提供本地存储和分布式存储
- 通过基于 HTTP 的 Pull 模型采集工夫序列数据
- 可利用 Pushgateway(Prometheus 的可选中间件)实现 Push 模式
- 可通过动静服务发现或动态配置发现指标机器
- 反对多种图表和数据大盘
Prometheus 能够周期性采集组件裸露在 HTTP(s) 端点的/metrics 上面的指标数据,并存储到 TSDB,实现基于 PromQL 的查问和聚合性能。
对于 Kubernetes 场景下的指标,能够从如下角度分类:
- 容器根底资源指标
采集源为 kubelet 内置的 cAdvisor,提供容器内存、CPU、网络、文件系统等相干的指标,指标样例包含:
容器以后内存应用字节数 container\_memory\_usage\_bytes;
容器网络接管字节数 container\_network\_receive\_bytes\_total;
容器网络发送字节数 container\_network\_transmit\_bytes\_total,等等。
- Kubernetes 节点资源指标
采集源为 node\_exporter,提供节点零碎和硬件相干的指标,指标样例包含:节点总内存 node\_memory\_MemTotal\_bytes,节点文件系统空间 node\_filesystem\_size\_bytes,节点网络接口 ID node\_network\_iface\_id,等等。基于该类指标,能够统计节点的 CPU/内存/磁盘使用率等节点级别指标。
- Kubernetes 资源指标
采集源为 kube-state-metrics,基于 Kubernetes API 对象生成指标,提供 K8s 集群资源指标,例如 Node、ConfigMap、Deployment、DaemonSet 等类型。以 Node 类型指标为例,包含节点 Ready 状态指标 kube\_node\_status\_condition、节点信息kube\_node\_info 等等。
- Kubernetes 组件指标
Kubernetes 零碎组件指标。例如 kube-controller-manager, kube-apiserver,kube-scheduler, kubelet,kube-proxy、coredns 等。
Kubernetes 运维组件指标。可观测类包含 blackbox\_operator, 实现对用户自定义的探活规定定义;gpu\_exporter,实现对 GPU 资源的透出能力。
Kubernetes 业务利用指标。包含具体的业务 Pod在/metrics 门路透出的指标,以便内部进行查问和聚合。
除了上述指标,K8s 提供了通过 API 形式对外透出指标的监测接口标准,具体包含 Resource Metrics,Custom Metrics 和 External Metrics 三类。
<span>监测接口标准</span> | <span>APIService 地址</span> | <span>接口应用场景形容</span> |
<span>Resource Metrics</span> | metrics.k8s.io<span class="lake-fontsize-11">http://metrics.k8s.io/</span> | <span>次要用于 Kubernetes 内置的生产链路,通常由 Metrcis-Server 提供。</span> |
<span>Custom Metrics</span> | custom.metrics.k8s.io<span class="lake-fontsize-11">http://custom.metrics.k8s.io/</span> | <span>次要的实现为 Prometheus,提供资源监测和自定义监测。</span> |
<span>External Metrics</span> | external.metrics.k8s.io<span class="lake-fontsize-11">http://external.metrics.k8s.io/</span> | <span>次要的实现为云厂商的 Provider,提供云资源的监测指标。</span> |
`
I0215 23:32:19.226433 1 trace.go:116] Trace[1528486772]: "Create" url:/api/v1/namespaces/default/configmaps,user-agent:kubectl/v1.18.8 (linux/amd64) kubernetes/d2f5a0f,client:39.x.x.10,request_id:a1724f0b-39f1-40da-b36c-e447933ef37e (started: 2021-02-15 23:32:09.485986411 +0800 CST m=+114176.845042584) (total time: 9.740403082s):Trace[1528486772]: [9.647465583s] [9.647465583s] About to convert to expected versionTrace[1528486772]: [9.660554709s] [13.089126ms] Conversion doneTrace[1528486772]: [9.660561026s] [6.317µs] About to store object in databaseTrace[1528486772]: [9.687076754s] [26.515728ms] Object stored in databaseTrace[1528486772]: [9.740403082s] [53.326328ms] ENDI0215 23:32:19.226568 1 httplog.go:102] requestID=a1724f0b-39f1-40da-b36c-e447933ef37e verb=POST URI=/api/v1/namespaces/default/configmaps latency=9.740961791s resp=201 UserAgent=kubectl/v1.18.8 (linux/amd64) kubernetes/d2f5a0f srcIP="10.x.x.10:59256" ContentType=application/json:`
上面解释一下RT与申请的具体内容以及集群规模有间接的关联。 在上述创立 configmap 的例子中,同样是创立 1MB 的 configmap,公网链路受网路带宽和时延影响,达到了 9s;而在内网链路的测试中,只须要 145ms,网络因素的影响是显著的。 所以 RT 与申请操作的资源对象、字节尺寸、网络等有关联关系,网络越慢,字节尺寸越大,RT 越大。 对于大规模 K8s 集群,全量 LIST(例如 pods,nodes 等资源)的数据量有时候会很大,导致传输数据量减少,也会导致 RT 减少。所以对于 RT 指标,没有相对的衰弱阈值,肯定须要联合具体的申请操作、集群规模、网络带宽来综合评定,如果不影响业务就能够承受。 对于小规模 K8s 集群,均匀 RT 45ms 到 100ms 是能够承受的;对于节点规模上 100 的集群,均匀 RT 100ms 到 200ms 是能够承受的。 然而如果 RT 继续达到秒级,甚至 RT 达到 60s 导致申请超时,少数状况下呈现了异样,须要进一步定位解决是否合乎预期。 这两个指标通过 APIServer /metrics 对外透出,能够执行如下命令查看 inflight requests,是掂量 APIServer 解决并发申请能力的指标。如果申请并发申请过多达到 APIServer 参数 max-requests-inflight和 max-mutating-requests-inflight 指定的阈值,就会触发 APIServer 限流。通常这是异常情况,须要疾速定位并解决。 ### QPS & Latency 该局部能够直观显示申请 QPS 以及 RT 依照 Verb、API 资源进行分类的状况,以便进行聚合剖析。还能够展现读、写申请的错误码分类,能够直观发现不同工夫点下申请返回的错误码类型。 ### Client Summary 该局部能够直观显示申请的客户端以及操作和资源。 QPS By Client 能够按客户端维度,统计不同客户端的QPS值。QPS By Verb + Resource + Client 能够按客户端、Verb、Resource 维度,统计单位工夫(1s)内的申请散布状况。 基于 ARMS Prometheus,除了 APIServer 大盘,ACK Pro 还提供了 Etcd 和 Kube Scheduler 的监测大盘;ACK 和 ACK Pro 还提供了 CoreDNS、K8s 集群、K8s 节点、Ingress 等大盘,这里不再一一介绍,用户能够查看 ARMS 的大盘。这些大盘联合了 ACK 和 ARMS 的在生产环境的最佳实际,能够帮忙用户以最短门路观测零碎、发现问题本源、进步运维效率。 ## 日志(Logging)可观测性计划 SLS 阿里云日志服务是阿里云规范的日志计划,对接各种类型的日志存储。 对于托管侧组件的日志,ACK 反对托管集群管制立体组件(kube-apiserver/kube-controller-manager/kube-scheduler)日志透出,将日志从 ACK 管制层采集到到用户 SLS 日志服务的 Log Project 中。 对于用户侧日志,用户能够应用阿里云的 logtail、log-pilot 技术计划将须要的容器、零碎、节点日志收集到 SLS 的 logstore,随后就能够在 SLS 中不便的查看日志。 ## 事件(Event)可观测性计划 + NPD 可观测性计划 Kubernetes 的架构设计基于状态机,不同的状态之间进行转换则会生成相应的事件,失常的状态之间转换会生成 Normal 等级的事件,失常状态与异样状态之间的转换会生成 Warning 等级的事件。 ACK 提供开箱即用的容器场景事件监测计划,通过 ACK 保护的 NPD(node-problem-detector)以及蕴含在 NPD 中的 kube-eventer 提供容器事件监测能力。 * NPD(node-problem-detector)是 Kubernetes 节点诊断的工具,能够将节点的异样,例如 Docker Engine Hang、Linux Kernel Hang、网络出网异样、文件描述符异样转换为 Node 的事件,联合 kube-eventer 能够实现节点事件告警的闭环。* kube-eventer 是 ACK 保护的开源 Kubernetes 事件离线工具,能够将集群的事件离线到钉钉、SLS、EventBridge 等零碎,并提供不同等级的过滤条件,实现事件的实时采集、定向告警、异步归档。 NPD 依据配置与第三方插件检测节点的问题或故障,生成相应的集群事件。而Kubernetes集群本身也会因为集群状态的切换产生各种事件。例如 Pod 驱赶,镜像拉取失败等异常情况。日志服务 SLS(Log Service)的 Kubernetes 事件核心实时汇聚 Kubernetes 中的所有事件并提供存储、查问、剖析、可视化、告警等能力。 # ACK可观测性瞻望 ACK 以及相干云产品对 Kubernetes 集群曾经实现了全面的观测能力,包含指标、日志、链路追踪、事件等。前面倒退的方向包含: * 开掘更多利用场景,将利用场景与可观测性关联,帮忙用户更好的应用K8s。例如监测一段时间内 Pod 中容器的内存/CPU 等资源水位,利用历史数据分析用户的Kubernets 容器资源 requests/limits 是否正当,如果不合理给出举荐的容器资源 requests/limits;监测集群 APIServer RT 过大的申请,主动剖析异样申请的起因以及解决倡议;* 联动多种可观测性技术计划,例如K8s事件和指标监测,提供更加丰盛和更多维度的可观测性能力。 咱们置信 ACK 可观测性将来的倒退方向会越来越广大,给客户带来越来越杰出的技术价值和社会价值!> 版权申明:本文内容由阿里云实名注册用户自发奉献,版权归原作者所有,阿里云开发者社区不领有其著作权,亦不承当相应法律责任。具体规定请查看《阿里云开发者社区用户服务协定》和《阿里云开发者社区知识产权爱护指引》。如果您发现本社区中有涉嫌剽窃的内容,填写侵权投诉表单进行举报,一经查实,本社区将立即删除涉嫌侵权内容。