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

简介

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

在本教程中,您将学习如何:

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

开始之前

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

  • Kubernetes、K3s 或 OpenShift 集群
  • 一个 Grafana Cloud Stack,可选择启用 Exemplar 支持。

部署和配置 Grafana Agent

按照此步骤将 Grafana Agent 部署到您的 Kubernetes 集群中。为了简化 Agent 的部署,Grafana Cloud 提供了预配置的 Manifest 文件供您下载和修改。

部署 Grafana Agent 的步骤:

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

  2. 在左侧菜单中点击 可观测性(Observability),然后选择 Kubernetes

  3. 点击 开始发送数据(Start sending data),然后点击 安装仪表盘和告警规则(Install dashboards and alert rules)以安装预构建的 Kubernetes 仪表盘和告警集。

  4. 点击 Agent 配置说明(Agent configuration instructions),并检查 前提条件(Prerequisites)下列出的项目是否满足。

  5. 指标与事件(Metrics & Events)下,将 default命名空间(Namespace)字段中替换为您自己的命名空间。

    Agent ConfigMap 将更新为您的命名空间。

  6. 点击 复制到剪贴板(Copy to clipboard)并将 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 以发送 Exemplar 到 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 实例中启用 Exemplar

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

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

    • Agent StatefulSet
    • kube-state-metrics
    • 用于 tail 容器日志的 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 仓库包含用 Jsonnet 编写的 Kubernetes Manifest 文件,用于部署应用程序所需的组件。您无需学习 Jsonnet 即可按照本指南操作,并在部署组件之前检查 Manifest 文件和代码。该仓库还包含有关应用程序及其如何植入代码以与 Grafana Cloud 配合使用的更多信息。它还包含应用程序的源代码。

部署 TNS 应用程序的步骤:

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

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

    您可以在将应用程序部署到集群中之前检查 YAML Manifest 文件。这将应用程序的 Pod 和 Service 部署到集群的 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://:8080 以查看演示应用程序的运行情况。

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

关联指标、日志和追踪

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

关联遥测数据的步骤:

  1. 在您的 Grafana 实例中,点击 仪表盘(Dashboards)

  2. 点击 新建(New)并在下拉菜单中选择 导入(Import)

  3. 在 ID 字段中输入 16491,然后点击 加载(Load)

  4. 点击 导入(Import)以导入仪表盘。

  5. 导航到仪表盘。

    以下仪表盘显示:

    TNS Dashboard

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

  6. 点击一个 Exemplar 可跳转到针对某个特别慢的请求的追踪。

    Exemplar

    Trace

  7. 从这里,跳转到日志以查看有问题的 Span。

    Trace to logs

    Logs

  8. 点击日志行上的 显示上下文(Show context)以查看周围的日志上下文。

从指标跳转到追踪、再到日志以及反向跳转的能力是一个非常强大的功能,可以帮助您快速解决生产问题并减少平均恢复时间 (MTTR)。您还可以使用 Explore 视图从指标跳转到日志。

在指标、日志和追踪之间导航的步骤:

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

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

    以下图表显示:

    PromQL Query

  2. 点击窗口顶部的 拆分(Split),并在下拉菜单中选择正确的 Loki 数据源。

    Loki Dropdown

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

    Logs Result

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

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

导航集群工作负载的步骤:

  1. 在 Grafana 中,点击左侧菜单中的 可观测性(Observability)并选择 Kubernetes

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

    Cluster nav

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

    Workload nav

    从这里,您可以查看所有触发的告警、运行中 Pod 的健康状况,并可以进一步深入查看给定的 ReplicaSet。

    ReplicaSet nav

  3. 点击一个 Pod 可以快速查看附加的 Pod 信息、其日志以及最新的 Kubernetes 集群事件。

    Pod view

  4. 点击屏幕右上方的“查看计算资源(View compute resources)”可以快速跳转到 Pod 的资源使用仪表盘。

    Pod dashboard

总结

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

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