本文发表于一年多前。旧文章可能包含过时内容。请检查页面中的信息自发布以来是否已变得不正确。

使用 Kuberhealthy 监测 K8s KPI

基于 Kuberhealthy v2.0.0 继续发展

去年 11 月在 KubeCon San Diego 2019 大会上,我们宣布发布 Kuberhealthy 2.0.0 —— 将 Kuberhealthy 转型为用于合成监控的 Kubernetes Operator。这项新功能让开发人员能够创建自己的 Kuberhealthy 检查容器,以合成方式监控他们的应用程序和集群。社区很快采用了这项新功能,我们感谢所有在其集群中实施和测试 Kuberhealthy 2.0.0 的人。感谢所有在 #kuberhealthy Slack 频道中报告问题并参与讨论的人。我们迅速着手处理您的所有反馈,发布了 Kuberhealthy 的新版本。此外,我们创建了一份指南,介绍如何轻松安装和使用 Kuberhealthy,以捕获一些有用的合成 KPI

部署 Kuberhealthy

要安装 Kuberhealthy,请确保您已安装 Helm 3。如果尚未安装,您可以使用此 deploy 文件夹中生成的扁平规范文件。如果您不使用 Prometheus Operator,则应使用 kuberhealthy-prometheus.yaml;如果您使用 Prometheus Operator,则应使用 kuberhealthy-prometheus-operator.yaml。如果您完全不使用 Prometheus,仍然可以使用 Kuberhealthy,并通过 此规范使用 JSON 状态页面和/或 InfluxDB 集成。

使用 Helm 3 进行安装

1. 在所需的 Kubernetes 集群/上下文中创建命名空间 "kuberhealthy"
kubectl create namespace kuberhealthy
2. 将当前命名空间设置为 "kuberhealthy"
kubectl config set-context --current --namespace=kuberhealthy 
3. 将 kuberhealthy 仓库添加到 Helm
helm repo add kuberhealthy https://comcast.github.io/kuberhealthy/helm-repos
4. 根据您的 Prometheus 实现,使用适用于您集群的相应命令安装 Kuberhealthy
helm install kuberhealthy kuberhealthy/kuberhealthy --set prometheus.enabled=true,prometheus.enableAlerting=true,prometheus.enableScraping=true,prometheus.serviceMonitor=true
  • 如果您使用 Prometheus,但**不**使用 Prometheus Operator
helm install kuberhealthy kuberhealthy/kuberhealthy --set prometheus.enabled=true,prometheus.enableAlerting=true,prometheus.enableScraping=true

有关配置适当的抓取注解的更多详细信息,请参阅下面的Prometheus 集成详情部分。

  • 最后,如果您不使用 Prometheus
helm install kuberhealthy kuberhealthy/kuberhealthy

运行 Helm 命令应自动安装最新版本的 Kuberhealthy (v2.2.0) 以及一些基本检查。如果您运行 kubectl get pods,应该会看到两个 Kuberhealthy pod。这些 pod 用于创建、协调和跟踪测试 pod。这两个 Kuberhealthy pod 还提供一个 JSON 状态页面以及一个 /metrics 端点。您看到的其他所有创建的 pod 都是检查器 pod,用于执行并在完成后关闭。

配置附加检查

接下来,您可以运行 kubectl get khchecks。您应该会看到默认安装了三个 Kuberhealthy 检查:

  • daemonset:部署并拆除一个 daemonset,以确保集群中的所有节点都正常运行。
  • deployment:创建一个部署,然后触发滚动更新。测试部署是否可以通过服务访问,然后删除所有内容。此过程中的任何问题都会导致此检查报告失败。
  • dns-status-internal:验证内部集群 DNS 是否按预期运行。

要查看其他可用的外部检查,请查阅外部检查注册表,您可以在其中找到其他可应用于集群以启用各种检查的 yaml 文件。

Kuberhealthy 检查 pod 应在 Kuberhealthy 启动后不久(1-2 分钟)开始运行。此外,check-reaper cronjob 每隔几分钟运行一次,以确保同时没有超过 5 个已完成的检查器 pod 留下。

要获取这些检查的状态页视图,您需要通过编辑服务 kuberhealthy 并将 Type: LoadBalancer 设置为外部暴露 kuberhealthy 服务,或者使用 kubectl port-forward service/kuberhealthy 8080:80。查看时,服务终结点将显示一个 JSON 状态页,如下所示:

{
    "OK": true,
    "Errors": [],
    "CheckDetails": {
        "kuberhealthy/daemonset": {
            "OK": true,
            "Errors": [],
            "RunDuration": "22.512278967s",
            "Namespace": "kuberhealthy",
            "LastRun": "2020-04-06T23:20:31.7176964Z",
            "AuthoritativePod": "kuberhealthy-67bf8c4686-mbl2j",
            "uuid": "9abd3ec0-b82f-44f0-b8a7-fa6709f759cd"
        },
        "kuberhealthy/deployment": {
            "OK": true,
            "Errors": [],
            "RunDuration": "29.142295647s",
            "Namespace": "kuberhealthy",
            "LastRun": "2020-04-06T23:20:31.7176964Z",
            "AuthoritativePod": "kuberhealthy-67bf8c4686-mbl2j",
            "uuid": "5f0d2765-60c9-47e8-b2c9-8bc6e61727b2"
        },
        "kuberhealthy/dns-status-internal": {
            "OK": true,
            "Errors": [],
            "RunDuration": "2.43940936s",
            "Namespace": "kuberhealthy",
            "LastRun": "2020-04-06T23:20:44.6294547Z",
            "AuthoritativePod": "kuberhealthy-67bf8c4686-mbl2j",
            "uuid": "c85f95cb-87e2-4ff5-b513-e02b3d25973a"
        }
    },
    "CurrentMaster": "kuberhealthy-7cf79bdc86-m78qr"
}

此 JSON 页面显示集群中运行的所有 Kuberhealthy 检查。如果您的 Kuberhealthy 检查在不同的命名空间中运行,您可以通过在状态页 URL 上添加 GET 变量 namespace 参数来过滤它们:?namespace=kuberhealthy,kube-system

编写自己的检查

Kuberhealthy 旨在通过自定义检查容器进行扩展,任何人都可以编写这些容器来检查任何内容。只要这些检查被打包到容器中,就可以用任何语言编写。这使得 Kuberhealthy 成为创建您自己的合成检查的绝佳平台!

创建您自己的检查是验证您的客户端库、模拟真实用户工作流程并提高您的服务或系统正常运行时间信心的绝佳方式。

要了解有关编写您自己的检查的更多信息以及简单示例,请查阅自定义检查创建文档。

Prometheus 集成详情

启用 Prometheus(非 Operator)时,Kuberhealthy 服务会添加以下注解:

prometheus.io/path: /metrics
prometheus.io/port: "80"
prometheus.io/scrape: "true"

在您的 Prometheus 配置中,添加以下示例 scrape_config,它根据添加的 prometheus 注解抓取 Kuberhealthy 服务:

- job_name: 'kuberhealthy'
  scrape_interval: 1m
  honor_labels: true
  metrics_path: /metrics
  kubernetes_sd_configs:
  - role: service
    namespaces:
      names:
        - kuberhealthy
  relabel_configs:
    - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]
      action: keep
      regex: true

您还可以使用此示例作业指定要抓取的目标端点:

- job_name: kuberhealthy
  scrape_interval: 1m
  honor_labels: true
  metrics_path: /metrics
  static_configs:
    - targets:
      - kuberhealthy.kuberhealthy.svc.cluster.local:80

应用适当的 Prometheus 配置后,您应该能够看到以下 Kuberhealthy 指标:

  • kuberhealthy_check
  • kuberhealthy_check_duration_seconds
  • kuberhealthy_cluster_states
  • kuberhealthy_running

创建关键绩效指标

利用这些 Kuberhealthy 指标,我们的团队能够根据以下定义、计算和 PromQL 查询收集 KPI。

可用性

我们定义可用性为 K8s 集群控制平面正常运行并按预期工作。这通过我们能否在设定的时间内创建部署、进行滚动更新并删除部署来衡量。

我们通过衡量 Kuberhealthy 的部署检查的成功和失败来计算这一点。

  • 可用性 = 正常运行时间 / (正常运行时间 * 停机时间)

  • 正常运行时间 = 部署检查通过次数 * 检查运行间隔

  • 停机时间 = 部署检查失败次数 * 检查运行间隔

  • 检查运行间隔 = 检查运行的频率(在 KuberhealthyCheck 规范中设置的 runInterval

  • PromQL 查询(过去 30 天的可用性百分比)

    1 - (sum(count_over_time(kuberhealthy_check{check="kuberhealthy/deployment", status="0"}[30d])) OR vector(0)) / sum(count_over_time(kuberhealthy_check{check="kuberhealthy/deployment", status="1"}[30d]))
    

利用率

我们将利用率定义为用户对产品(k8s)及其资源(pod、服务等)的采用。这通过我们客户使用的节点、部署、有状态集、持久卷、服务、pod 和作业的数量来衡量。我们通过计算节点、部署、有状态集、持久卷、服务、pod 和作业的总数来计算这一点。

持续时间(延迟)

我们定义持续时间为控制平面的容量和吞吐量利用率。我们通过捕获 Kuberhealthy 部署检查运行的平均运行持续时间来计算这一点。

  • PromQL 查询(部署检查平均运行持续时间)
    avg(kuberhealthy_check_duration_seconds{check="kuberhealthy/deployment"}) 
    

错误/警报

我们将错误定义为所有 k8s 集群和 Kuberhealthy 相关警报。每次我们的 Kuberhealthy 检查失败时,我们都会收到此失败的警报。

谢谢!

再次感谢社区中所有人的贡献和帮助!我们很高兴看到您构建了什么。一如既往,如果您发现问题、有功能请求或需要提交拉取请求,请在 Github 项目上提出问题