用更云原生的方式做诊断|大规模 K8s 集群诊断利器深度解析

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 随着数字化的逐渐发展,企业 IT 架构也变得越来越复杂,如何在复杂环境中保证业务连续性及稳定性?

背景

通常而言,集群的稳定性决定了一个平台的服务质量以及对外口碑,当一个平台管理了相当规模数量的 Kubernetes 集群之后,在稳定性这件事上也许会“稍显被动”。

我们可能经常会遇到这样的场景:客户一个电话,火急火燎地说业务出现问题了,你们平台快帮忙查询一下是不是哪里出了问题呀?技术同学连忙放下手头工作,上去一通操作加安抚客户……看似专业且厉害,急用户之所急,细想之后实则无章无法,一地鸡毛。

通常我们依赖监控系统来提前发现问题,但是监控数据作为一个正向链路,很难覆盖到所有场景,经常会有因为集群配置的不一致性或者一些更底层资源的异常,即使监控数据完全正常,但是整个系统依然会有一些功能不可用。对此,我们做了一套巡检系统,针对系统中一些薄弱点以及一致性做诊断,但是这套系统的扩展性不是很好,对集群跟巡检项的管理也相对粗暴了一点。

最后我们决定做一个更加云原生的诊断工具,使用 operator 实现集群跟诊断项的管理,抽象出集群跟诊断项的资源概念,以此来解决大规模 Kubernetes 集群的诊断问题,通过在中心下发诊断项到其他集群,并统一收集其他集群的诊断结果,实现任何时刻都可以从中心获取到其他所有集群的运行状态,做到对大规模 Kubernetes 集群的有效管理以及诊断。

Talk is cheap, show me the demo:

Demo

Kubeprober

项目介绍

项目地址: https://github.com/erda-project/kubeprober
官网地址: https://k.erda.cloud

Kubeprober 是一个针对大规模 Kubernetes 集群设计的诊断工具,用于在 Kubernetes 集群中执行诊断项以证明集群的各项功能是否正常,Kubeprober 有如下特点:

  • 支持大规模集群
    支持多集群管理,支持在管理端配置集群跟诊断项的关系以及统一查看所有集群的诊断结果;
  • 云原生
    核心逻辑采用 operator 来实现,提供完整的 Kubernetes API 兼容性;
  • 可扩展
    支持用户自定义巡检项。

其核心架构如下:

image.png

区别于监控系统,Kubeprober 从巡检的角度来验证集群的各项功能是否正常,监控作为正向链路,无法覆盖系统中的所有场景,即使系统中各个环境的监控数据都正常,也无法保证系统是 100% 可用的,因此我们就需要一个工具从反向来证明系统的可用性,根本上做到先于用户发现集群中不可用的点,比如:

  • 集群中的所有节点是否均可以被调度,有没有特殊的污点存在等;
  • pod 是否可以正常的创建,销毁,验证从 Kubernetes,Kubelet 到 Docker 的整条链路;
  • 创建一个 service,并测试连通性,验证 kube-proxy 的链路是否正常;
  • 解析一个内部或者外部的域名,验证 CoreDNS 是否正常工作;
  • 访问一个 ingress 域名,验证集群中的 ingress 组件是否正常工作;
  • 创建并删除一个 namespace,验证相关的 webhook 是否正常工作;
  • 对 Etcd 执行 put/get/delete 等操作,用于验证 Etcd 是否正常运行;
  • 通过 mysql-client 的操作来验证 MySQL 是否正常运行;
  • 模拟用户对业务系统进行登录,操作,验证业务的主流程是否正常;
  • 检查各个环境的证书是否过期;
  • 云资源的到期检查;
  • ……

组件介绍

Kubeprober 整体采用 Operator 来实现核心逻辑,集群之间的管理使用 remotedialer 来维持被纳管集群跟管理集群之间的心跳链接,被纳管集群通过 RBAC 赋予 probe-agent 最小所需权限并且通过心跳链接实时上报被纳管集群元信息以及访问 apiserver 的 token,实现在管理集群可以对被管理集群的相关资源进行操作的功能。

probe-master

运行在管理集群上的 operator 维护着两个 CRD:一个是 Cluster,用于管理被纳管的集群;另一个是 Probe,用于管理内置的以及用户自己编写的诊断项。probe-master 通过 watch 这两个 CRD,将最新的诊断配置推送到被纳管的集群,同时 probe-master 提供接口用于查看被纳管集群的诊断结果。

probe-agent

运行在被纳管集群上的 operator,这个 operator 维护两个 CRD:一个是跟 probe-master 完全一致的 Probe,probe-agent 按照 probe 的定义去执行该集群的诊断项;另一个是 ProbeStatus,用于记录每个 Probe 的诊断结果,用户可以在被纳管的集群中通过 kubectl get probestatus 来查看本集群的诊断结果。

什么是 Probe

Kubeprobe 中运行的诊断计划我们称之为 Probe,一个 Probe 为一个诊断项的集合,我们建议将统一场景下的诊断项作为一个 Probe 来运行,probe-agent 组件会 watch probe 资源,执行 Probe 中定义的诊断项,并且将结果写在 ProbeStatus 的资源中。

image.png

我们期望有一个输出可以清晰地看到当前集群的运行状态,因此我们建议所有的 Probe 都尽可能属于应用、中间件、Kubernetes 以及基础设置这四大场景,这样我们可以在展示状态的时候,清晰且自上而下地查看究竟是系统中哪个层面引起的问题。

目前的 Probe 还比较少,我们还在继续完善,也希望跟大家一起共建。欢迎广大爱好者一起来共建:
自定义 Probe

image.png

对比其他诊断工具

目前社区已经有 Kuberhealthy 以及 Kubeeye 来做 Kubernetes 集群诊断这件事情。

Kuberheathy 提供一套比较清晰的框架可以让你轻松编写自己的诊断项,将诊断项 CRD 化,可以轻松地使用Kubernetes 的方式来对单个 Kubernetes 进行体检。

Kubeeye 同样是针对单个集群,主要通过调用 Kubernetes 的 event api 以及 Node-Problem-Detector 来检测集群控制平面以及各种节点问题,同时也支持自定义诊断项。

其实,Kubeprober 做的也是诊断 Kubernetes 集群这件事情,提供框架来编写自己的诊断项。除此之外,Kubeprober 主要解决了大规模 Kubernetes 集群的诊断问题,通过中心化的思路,将集群跟诊断项抽象成 CRD,可以实现在中心 Kubernetes 集群管理其他 Kubernetes 诊断项配置,诊断结果收集,未来也会解决大规模 Kubernetes 集群的运维问题。

image.png

如何使用

Kubeprober 主要解决大规模 Kubernetes 集群的诊断问题,通常我们选择其中一个集群作为 master 集群,部署probe-master,其他集群作为被纳管集群,部署 probe-agent,详细的使用说明可参考官方文档

可视化

Kubeprober 在多集群中根据 probe 的策略执行诊断项,会产生大量的诊断事件。由此,对这些诊断项进行可视化的展示就显得尤为重要,此时如果有一个全局的 dashboard 对大规模集群的海量诊断项进行统一查看分析,将会更有利于我们掌握这些集群的运行状态。

Kubeprober 支持将诊断项事件写入 influxdb,通过 grafana 配置图表来统一展示诊断结果,比如:我们将 ERROR 事件统一展示出来作为最高优先级进行关注。

image.png

同时,我们也可以通过扩展 probe-agent 上报的集群信息,展示一张详尽的集群列表:

image.png

结语

随着数字化的逐渐发展,企业的 IT 架构也变得越来越复杂,如何在复杂环境中保证业务连续性及稳定性?相信这是每一个 IT 从业者都会面临的问题,如果大家对稳定性的话题或者是对 Kuberprober 项目感兴趣,欢迎联系我们一起深入探讨,同时也欢迎广大开源爱好者一起参与,共同打造一个大规模的 Kubernetes 集群的管理神器。Contributing to Kubeprober


我们致力于决社区用户在实际生产环境中反馈的问题和需求,
如果您有任何疑问或建议,
欢迎关注【尔达Erda】公众号给我们留言,
加入 Erda 用户群参与交流或在 Github 上与我们讨论!

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
3月前
|
Kubernetes API 调度
Kubernetes 架构解析:理解其核心组件
【8月更文第29天】Kubernetes(简称 K8s)是一个开源的容器编排系统,用于自动化部署、扩展和管理容器化应用。它提供了一个可移植、可扩展的环境来运行分布式系统。本文将深入探讨 Kubernetes 的架构设计,包括其核心组件如何协同工作以实现这些功能。
258 0
|
6天前
|
人工智能 Cloud Native Java
云原生技术深度解析:从IO优化到AI处理
【10月更文挑战第24天】在当今数字化时代,云计算已经成为企业IT架构的核心。云原生作为云计算的最新演进形态,旨在通过一系列先进的技术和实践,帮助企业构建高效、弹性、可观测的应用系统。本文将从IO优化、key问题解决、多线程意义以及AI处理等多个维度,深入探讨云原生技术的内涵与外延,并结合Java和AI技术给出相应的示例。
27 1
|
18天前
|
存储 缓存 监控
深入解析:Elasticsearch集群性能调优策略与最佳实践
【10月更文挑战第8天】Elasticsearch 是一个分布式的、基于 RESTful 风格的搜索和数据分析引擎,它能够快速地存储、搜索和分析大量数据。随着企业对实时数据处理需求的增长,Elasticsearch 被广泛应用于日志分析、全文搜索、安全信息和事件管理(SIEM)等领域。然而,为了确保 Elasticsearch 集群能够高效运行并满足业务需求,需要进行一系列的性能调优工作。
39 3
|
6天前
|
运维 Cloud Native 持续交付
云原生技术解析:从IO出发,以阿里云原生为例
【10月更文挑战第24天】随着互联网技术的不断发展,传统的单体应用架构逐渐暴露出扩展性差、迭代速度慢等问题。为了应对这些挑战,云原生技术应运而生。云原生是一种利用云计算的优势,以更灵活、可扩展和可靠的方式构建和部署应用程序的方法。它强调以容器、微服务、自动化和持续交付为核心,旨在提高开发效率、增强系统的灵活性和可维护性。阿里云作为国内领先的云服务商,在云原生领域有着深厚的积累和实践。
25 0
|
8天前
|
存储 Kubernetes 监控
深度解析Kubernetes在微服务架构中的应用与优化
【10月更文挑战第18天】深度解析Kubernetes在微服务架构中的应用与优化
30 0
|
22天前
|
SQL 分布式计算 大数据
大数据-97 Spark 集群 SparkSQL 原理详细解析 Broadcast Shuffle SQL解析过程(一)
大数据-97 Spark 集群 SparkSQL 原理详细解析 Broadcast Shuffle SQL解析过程(一)
33 0
|
22天前
|
SQL 分布式计算 算法
大数据-97 Spark 集群 SparkSQL 原理详细解析 Broadcast Shuffle SQL解析过程(二)
大数据-97 Spark 集群 SparkSQL 原理详细解析 Broadcast Shuffle SQL解析过程(二)
61 0
|
3月前
|
运维 Cloud Native JavaScript
云端新纪元:云原生技术深度解析深入理解Node.js事件循环及其在异步编程中的应用
【8月更文挑战第27天】随着云计算技术的飞速发展,云原生已成为推动现代软件开发和运维的关键力量。本文将深入探讨云原生的基本概念、核心价值及其在实际业务中的应用,帮助读者理解云原生如何重塑IT架构,提升企业的创新能力和市场竞争力。通过具体案例分析,我们将揭示云原生技术背后的哲学思想,以及它如何影响企业决策和操作模式。
|
3月前
|
人工智能 运维 Kubernetes
智能化运维:KoPylot为k8S带来AI监控诊断
智能化运维:KoPylot为k8S带来AI监控诊断
|
3月前
|
Kubernetes 负载均衡 网络协议
在K8S中,DNS组件有什么特性?
在K8S中,DNS组件有什么特性?

热门文章

最新文章

推荐镜像

更多