作者|段超

来源|尔达 Erda 公众号

背景

我们是一家做商业软件的公司,从一开始我们就把软件交付流程做的非常标准且简单,所有的软件都是基于我们的企业数字化平台 Erda(现已开源)来交付,底层基于 Kubernetes,为企业提供 DevOps、微服务治理、多云管理以及快数据管理等云厂商无绑定的 IT 服务。

随着我们服务的客户数量越来越多,如今我们管理着相当规模数量的 Kubernetes 集群,集群的稳定性决定了服务质量以及对外口碑,很长一段时间内我们在这件事情上都显得很被动,经常会出现 Erda 支持同学或者客户将问题反馈到我们说:有业务出现了问题,需要我们协助查询一下是不是平台导致的,然后我们上去一顿操作最后解决问题,答复客户。看似专业且厉害,急用户之所急,实则无章无法,一地鸡毛。

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

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

Kubeprober

项目介绍

项目地址: https://github.com/erda-project/kubeprober

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

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

其核心架构如下:



区别于监控系统,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,这个 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 的资源中。

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

目前的 Probe 还比较少,我们还在继续完善,也希望跟大家一起共建。

自定义 Probe

对比其他诊断工具

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

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

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

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

如何使用

kubeprober 主要解决大规模 Kubernetes 集群的诊断问题,通常我们选择其中一个集群作为 master 集群,部署 probe-master,其他集群作为被纳管集群,部署 probe-agent。

安装 probe-master

probe-master 使用了 webhook,webhook 的运行需要校验证书,需要先部署一下 cert-manager 的服务:

kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.3.1/cert-manager.yaml

然后安装 probe-master:

APP=probe-master make deploy

安装 probe-agent

在逻辑上,一个 cluster 资源对应一个 probe-agent,在部署 probe-agent 之前,需要先创建一个 cluster 资源,probe-master 会给每一个 cluster 生成一个 secreykey,用于跟 probe-master 交互的唯一凭证。

kubectl apply -f config/samples/kubeprobe_v1_cluster.yaml
kubectl get cluster -o wide #可以获取到集群的secretkey

部署 probe-agent 前,需要先修改 probe-agent 的 configmap:

vim config/manager-probe-agent/manager.yaml
---
apiVersion: v1
kind: ConfigMap
metadata:
name: probeagent
namespace: system
data:
probe-conf.yaml: |
probe_master_addr: http://kubeprober-probe-master.kubeprober.svc.cluster.local:8088
cluster_name: moon
secret_key: 2f5079a5-425c-4fb7-8518-562e1685c9b4

最后安装 probe-agent:

APP=probe-agent make deploy

安装好 probeagent 后我们就可以在 master 集群中看到 cluster 信息。

配置 probe

有了 cluster,我们还需要在 master 集群中创建 probe 资源,比如:

kubectl apply -f config/samples/kubeprobe_v1_cron_probe.yaml

使用 kubectl get probe 来查看 probe 列表,使用 kubectl label 来将一个 probe 跟 cluster 关联起来,则对用的 probe-agent 会在本集群内执行相关的诊断项。

kubectl label cluster moon probe/probe-link-test1=true
kubectl label cluster moon probe/probe-cron-sample=true

最后,我们可以在被诊断的集群中使用 kubectl get probestatus 来查看诊断本集群的诊断结果。



欢迎参与开源

当前 kubeprobe 已经发布了第一个版本 0.0.1,还有许多功能不太完善,probe-master 的管理能力还可以进一步的被放大挖掘,probe 的编写也需要更加的简单易用。我们希望跟社区一起共建,共同打造一个大规模 Kubernetes 集群的管理神器。欢迎大家关注、贡献代码和 Star!

面对大规模 K8s 集群,这款诊断利器必须要“粉一波”!的更多相关文章

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

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

  2. 大规模 K8s 集群管理经验分享 · 上篇

    11 月 23 日,Erda 与 OSCHINA 社区联手发起了[高手问答第 271 期 -- 聊聊大规模 K8s 集群管理],目前问答活动已持续一周,由 Erda SRE 团队负责人骆冰利为大家解答 ...

  3. 【转载】浅谈大规模k8s集群关于events的那些坑

    原文链接:一流铲屎官二流程序员[浅谈大规模k8s集群关于events的那些坑] 背景 随着k8s集群规模的增加,集群内的object数量也与日俱增,那么events的数量也会伴随其大量增加,那么当用户 ...

  4. 备战双 11!蚂蚁金服万级规模 K8s 集群管理系统如何设计?

    作者 | 蚂蚁金服技术专家 沧漠 关注『阿里巴巴云原生』公众号,回复关键词"1024",可获取本文 PPT. 前言 Kubernetes 以其超前的设计理念和优秀的技术架构,在容器 ...

  5. Prometheus神器之监控K8s集群

    Prometheus 简介 Prometheus是SoundCloud开源的一款开源软件.它的实现参考了Google内部的监控实现,与源自Google的Kubernetes结合起来非常合适.另外相比i ...

  6. 万级K8s集群背后etcd稳定性及性能优化实践

    背景与挑战 随着腾讯自研上云及公有云用户的迅速增长,一方面,腾讯云容器服务TKE服务数量和核数大幅增长, 另一方面我们提供的容器服务类型(TKE托管及独立集群.EKS弹性集群.edge边缘计算集群.m ...

  7. 万级K8s集群背后 etcd 稳定性及性能优化实践

    1背景与挑战随着腾讯自研上云及公有云用户的迅速增长,一方面,腾讯云容器服务TKE服务数量和核数大幅增长, 另一方面我们提供的容器服务类型(TKE托管及独立集群.EKS弹性集群.edge边缘计算集群.m ...

  8. k8s集群Job Pod 容器可能因为多种原因失效,想要更加稳定的使用Job负载,有哪些需要注意的地方?

    k8s集群Job Pod 容器可能因为多种原因失效,想要更加稳定的使用Job负载,有哪些需要注意的地方? 面试官:"计数性Job默认完成模式是什么?Indexed模式如何发布自定义索引呢?& ...

  9. 基于Docker一键部署大规模Hadoop集群及设计思路

    一.背景: 随着互联网的发展.互联网用户的增加,互联网中的数据也急剧膨胀.每天产生的数据量数以万计,本地文件系统和单机CPU已无法满足存储和计算要求.Hadoop分布式文件系统(HDFS)是海量数据存 ...

随机推荐

  1. [个人开源]vue-code-view:一个在线编辑、实时预览的代码交互组件

    组件简介 vue-code-view是一个基于 vue 2.x.轻量级的代码交互组件,在网页中实时编辑运行代码.预览效果的代码交互组件. 使用此组件, 不论 vue 页面还是 Markdown 文档中 ...

  2. Tarjan算法 求 有向图的强连通分量

    百度百科 https://baike.baidu.com/item/tarjan%E7%AE%97%E6%B3%95/10687825?fr=aladdin 参考博文 http://blog.csdn ...

  3. Pycharm的安装简介

    Pycharm 1. Pycharm简介 PyCharm是由JetBrains打造的一款Python IDE,VS2010的重构插件Resharper就是出自JetBrains之手.同时支持Googl ...

  4. 后台管理系统:vue&node&MongoDB(一)

    后台管理系统 使用工具: Vue    Node     Mongodb   Element-ui 一.后台(Node+Mongodb) 前期准备: 需要下载的包: mongooes -------- ...

  5. 微信小程序(六)

    MINA 框架: 启动: 冷启动,热启动 加载: 生命周期 路由: 事件: 事件时视图层到逻辑层的通信方式 事件可以将用户的行为反馈到逻辑层进行处理 事件可以绑定在组件上,触发事件后就会执行逻辑层对应 ...

  6. pg_probackup

    [1] https://postgrespro.com/docs/enterprise/13/app-pgprobackup PITR依赖continuous WAL archiving: Makin ...

  7. C#练习3

    using System; class Test { static void F(params int[]args) { Console.WriteLine("# of argument:{ ...

  8. [noi712]练级

    先考虑一个联通块,可以发现这个联通快内不会存在两个偶数的点证明:如果存在,那么这两个点的某一条路径上的边全部反过来,可以使答案+2,即答案为点数或点数-1同时,发现答案的奇数点数一定与边数同奇偶,那么 ...

  9. [loj3180]天桥

    考虑将所有交点作为关键点来建图跑最短路,但图上的关键点数量最坏为$o(nm)$,需要优化 当$s=0$且$g=n-1$的部分分,有以下结论: 1.对于一段天桥$([l,r],y)$,不会从$(r,y) ...

  10. Redis | 第一部分:数据结构与对象 中篇《Redis设计与实现》

    目录 前言 1. 跳跃表 1.1 跳跃表与其节点的定义 1.2 跳跃表的API 2. 整数集合 2.1 整数集合的实现 2.2 整数集合的类型升级 2.3 整数集合的API 3. 压缩列表 3.1 压 ...