这篇文章已发布一年多。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已不正确。

带有 Kuberhealthy 的 K8s KPI

从 Kuberhealthy v2.0.0 继续前进

去年 11 月在 2019 年圣地亚哥 KubeCon 大会上,我们宣布发布了 Kuberhealthy 2.0.0 - 将 Kuberhealthy 转换为用于合成监控的 Kubernetes 操作器。这种新能力使开发人员能够创建自己的 Kuberhealthy 检查容器,以合成方式监控其应用程序和集群。社区迅速采用了这个新功能,我们感谢在集群中实施和测试 Kuberhealthy 2.0.0 的每个人。感谢所有报告问题并在 #kuberhealthy Slack 频道上参与讨论的人。我们迅速着手通过更新版本的 Kuberhealthy 来解决您的所有反馈。此外,我们创建了一个关于如何轻松安装和使用 Kuberhealthy 的指南,以便捕获一些有用的合成 KPI

部署 Kuberhealthy

要安装 Kuberhealthy,请确保已安装 Helm 3。如果未安装,您可以使用此 deploy 文件夹中生成的平面规范文件。如果您不使用 Prometheus Operator,则应使用 kuberhealthy-prometheus.yaml;如果您使用,则应使用 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 分钟)开始运行。此外,检查器收割者 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(而不是操作器)时,Kuberhealthy 服务会添加以下注释

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

在您的 Prometheus 配置中,添加以下 example 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

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

- 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 项目上打开一个问题