使用 Kubernetes 监控器监控应用程序

简介

本教程演示如何将一个带有仪表的、三层(数据层、应用程序逻辑层、负载均衡层)Web 应用程序 部署到 Kubernetes 集群中,并利用 Grafana Cloud 内置的 Kubernetes 监控功能来监控该应用程序。

在本教程中,您将

  • TNS 示例应用程序 部署到您的 Kubernetes 集群中。
  • 将预构建的仪表盘部署到您的 Grafana Cloud 实例中,以可视化应用程序的性能指标。
  • 推出 Grafana Agent 以收集来自 Kubernetes 集群的指标、日志和事件。
  • 配置这些 Agent 以从 TNS 应用程序收集指标、日志和追踪(包括示例)。
  • 了解如何使用 Grafana 的强大关联功能在指标、日志和追踪之间导航。
  • 了解如何使用 Kubernetes 集群导航器来探索集群正在运行的工作负载,从 Pod 跳转到仪表盘和日志。

开始之前

要完成本教程,您需要访问

  • Kubernetes、K3s 或 OpenShift 集群
  • 一个 Grafana Cloud 堆栈,可以选择启用示例 支持。

部署和配置 Grafana Agent

请按照此步骤将 Grafana Agent 推送到您的 Kubernetes 集群中。为了使 Agent 部署更轻松,Grafana Cloud 提供了预配置的清单供您下载和修改。

要部署 Grafana Agent

  1. 导航到您的 Grafana Cloud 实例。

  2. 点击左侧菜单中的**可观察性**,然后选择**Kubernetes**。

  3. 点击**开始发送数据**,然后点击**安装仪表盘和警报规则**以安装预构建的 Kubernetes 仪表盘和警报集。

  4. 点击**Agent 配置说明**并检查**先决条件**下列出的项目是否已满足。

  5. 在**指标和事件**下,将**命名空间**字段中的default替换为您的命名空间。

    Agent ConfigMap 将使用您的命名空间进行更新。

  6. 点击**复制到剪贴板**并将 Agent ConfigMap 粘贴到编辑器中。

    默认情况下,ConfigMap 仅抓取集群指标端点,例如/cadvisor/kubelet端点。您需要按照下一步配置 ConfigMap 以抓取集群中部署的 Pod 的/metrics端点。

  7. 在 ConfigMap 中,添加以下抓取作业片段

    yaml
    . . .
              relabel_configs:
                  - action: keep
                    regex: kube-state-metrics
                    source_labels:
                      - __meta_kubernetes_pod_label_app_kubernetes_io_name
            # New scrape job below
            - job_name: integrations/kubernetes/pod-metrics
              kubernetes_sd_configs:
                - role: pod
              relabel_configs:
                - action: drop
                  regex: kube-state-metrics
                  source_labels:
                    - __meta_kubernetes_pod_label_app_kubernetes_io_name
                - action: labelmap
                  regex: __meta_kubernetes_pod_label_(.+)
                - source_labels: [__meta_kubernetes_namespace]
                  action: replace
                  target_label: namespace
                - source_labels: [__meta_kubernetes_pod_name]
                  action: replace
                  target_label: pod
                - source_labels: ['__meta_kubernetes_namespace', '__meta_kubernetes_pod_label_name']
                  action: 'replace'
                  separator: '/'
                  target_label: 'job'
                  replacement: '$1'
                - source_labels: ['__meta_kubernetes_pod_container_name']
                  action: 'replace'
                  target_label: 'container'
    . . .

    此抓取作业尝试在/metrics处抓取集群中运行的所有容器(和端口),删除所有 kube-state-metrics(因为您已在另一个抓取作业中获取这些指标),并执行一些重新标记(设置jobpodnamespace等标签)。

    要了解有关配置抓取作业的更多信息,请参阅 Prometheus 抓取配置文档。您可以调整此通用的万能片段,以使用不同的配置指令将抓取限制到给定的命名空间、工作负载标签、删除其他指标等等。

  8. 配置 Grafana Agent 以将示例 发送到 Grafana Cloud。为此,请将以下内容添加到 ConfigMap 中

    yaml
    . . .
          configs:
          - name: integrations
            remote_write:
            - url: <your_prometheus_metrics_endpoint>
              basic_auth:
                username: <your_prometheus_metrics_user>
                password: <your_prometheus_metrics_api_key>
              # Add the following line
              send_exemplars: true
    . . .

您必须联系支持团队才能在您的 Grafana Cloud 实例中启用示例

  1. 将 ConfigMap 部署到您的集群中。

  2. 按照 K8s 监控说明中的其余步骤,将以下内容部署到您指定的命名空间中

    • 一个 Agent StatefulSet
    • kube-state-metrics
    • 一个 Agent ConfigMap 和 DaemonSet 以跟踪容器日志
  3. 按照使用 Grafana Agent 发送 Kubernetes 追踪指南部署 Agent 以收集追踪。

    请务必填写所需的remote_write凭据。您的 Tempo 端点 URL 应类似于tempo-us-central1.grafana.net:443

    重要提示:如果没有 Agent 收集追踪,演示应用程序将无法启动,因此请确保完成此步骤。

    完成遥测收集器的部署后,您正在运行的 K8s Pod 应如下所示

    bash

    NAME                                      READY   STATUS    RESTARTS   AGE
    grafana-agent-0                           1/1     Running   0          3m
    grafana-agent-logs-lcpjd                  1/1     Running   0          2m44s
    grafana-agent-logs-pc9sp                  1/1     Running   0          2m44s
    grafana-agent-logs-qtjzq                  1/1     Running   0          2m44s
    grafana-agent-traces-7775575d6d-qcrmq     1/1     Running   0          21s
    ksm-kube-state-metrics-58ccd7456c-487c9   1/1     Running   0          2m50s

部署 TNS 应用程序

随着遥测收集器启动并运行,您现在可以将 TNS 演示应用程序部署到您的 Kubernetes 集群中。TNS 的 GitHub 仓库 包含 Kubernetes 清单文件(使用 Jsonnet 编写),用于部署应用程序所需的组件。您无需学习 Jsonnet 即可遵循本指南,并在部署组件之前检查清单文件和代码。该仓库还包含有关应用程序以及如何对其进行检测以与 Grafana Cloud 协同工作的更多信息。它还包含应用程序源代码。

部署 TNS 应用程序

  1. 要部署应用程序,请运行以下命令

    bash

    kubectl apply -f https://raw.githubusercontent.com/grafana/tns/main/production/k8s-yamls-cloud/app-full.yaml

    您可以在将应用程序部署到集群之前检查 YAML 清单文件。这会将应用程序 Pod 和服务部署到集群的 tns-cloud 命名空间中,如果该命名空间不存在则会创建它。

  2. 使用 kubectl 检查部署状态

    bash

     kubectl get all -n tns-cloud
  3. 将端口转发到本地 Web 浏览器

    bash

    kubectl port-forward -n tns-cloud service/app 8080:80
  4. 在您的 Web 浏览器中导航到 https://127.0.0.1:8080 以查看演示应用程序的运行情况。

随着已检测的演示应用程序和负载生成器启动并运行,您现在可以导航到 Grafana Cloud 以查询应用程序日志、可视化其指标并检查其跟踪数据。

关联指标、日志和追踪

此时,演示应用程序和负载生成器已检测并正在运行,您的遥测收集器正在将指标、日志、跟踪和事件数据转发到 Grafana Cloud。在探索 Grafana Cloud 的一些内置功能之前,请安装一个自定义预构建的 应用程序仪表板,该仪表板演示了一些核心 Grafana 功能。

关联遥测数据

  1. 在您的 Grafana 实例中,点击**仪表板**。

  2. 点击**新建**,然后在下拉菜单中选择**导入**。

  3. 在 ID 字段中输入**16491**,然后点击**加载**。

  4. 点击**导入**以导入仪表板。

  5. 导航到仪表板。

    以下仪表板显示

    TNS Dashboard

    {{% admonition type=“note” %}} 如果您没有看到黄色点 (示例),请确保已启用示例。 {{% /admonition %}} 有关更多信息,请参阅 配置 Grafana Agent

  6. 点击示例以跳转到特定缓慢请求的跟踪

    Exemplar

    Trace

  7. 从这里跳转到日志以查看有问题的跨度

    Trace to logs

    Logs

  8. 点击日志行上的**显示上下文**以查看周围的日志上下文。

能够在指标、跟踪、日志之间跳转并返回,是一个非常强大的功能,可以帮助您快速解决生产问题并减少平均恢复时间 (MTTR)。您还可以使用**探索**视图从指标跳转到日志。

在指标、日志和跟踪之间导航

  1. 输入以下 PromQL 查询,确保您选择了正确的 Prometheus 数据源

    sum by (status_code) (rate(tns_request_duration_seconds_count{job=~"tns-cloud/app.*"}[$__rate_interval]))

    以下图表显示

    PromQL Query

  2. 点击窗口顶部的**拆分**,然后在下拉菜单中选择正确的 Loki 数据源

    Loki Dropdown

    Grafana 会将 PromQL 查询中选择的标签传递过来,并使用相同的标签预填充 LogQL 查询,以便您可以快速从 Prometheus 指标查询跳转到与您正在分析的指标图表相关的相应 Loki 日志数据

    Logs Result

要了解有关这些功能的更多信息,请观看以下视频

探索 Kubernetes 工作负载的另一种方法是使用集群导航功能。

导航集群工作负载

  1. 在 Grafana 中,点击左侧菜单中的**可观测性**,然后选择**Kubernetes**。

    命名空间视图显示,您可以在其中导航集群。

    Cluster nav

  2. 点击特定的命名空间开始探索工作负载。

    Workload nav

    从这里,您可以查看任何触发的警报、正在运行的 Pod 的运行状况,并可以进一步深入到给定的 ReplicaSet。

    ReplicaSet nav

  3. 点击 Pod 以快速查看其他 Pod 信息、其日志和最新的 Kubernetes 集群事件。

    Pod view

  4. 点击屏幕右上角的查看计算资源以快速跳转到 Pod 的资源使用情况仪表板

    Pod dashboard

总结

现在,您可以直接在 Grafana Cloud 中导航并跳转到相关的可观测性数据,而不是从终端复制粘贴 Pod 名称和标签并运行 kubectl getkubectl describekubectl logs

要了解有关 Grafana Cloud Kubernetes 监控的更多信息,请参阅 Grafana Kubernetes 监控文档