使用 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 的步骤:
导航到您的 Grafana Cloud 实例。
在左侧菜单中点击 可观测性(Observability),然后选择 Kubernetes。
点击 开始发送数据(Start sending data),然后点击 安装仪表盘和告警规则(Install dashboards and alert rules)以安装预构建的 Kubernetes 仪表盘和告警集。
点击 Agent 配置说明(Agent configuration instructions),并检查 前提条件(Prerequisites)下列出的项目是否满足。
在 指标与事件(Metrics & Events)下,将
default
在 命名空间(Namespace)字段中替换为您自己的命名空间。Agent ConfigMap 将更新为您的命名空间。
点击 复制到剪贴板(Copy to clipboard)并将 Agent ConfigMap 粘贴到编辑器中。
默认情况下,ConfigMap 只抓取集群指标端点,例如
/cadvisor
和/kubelet
端点。您需要按照下一步骤配置 ConfigMap 以抓取部署在集群中的 Pod 的/metrics
端点。在 ConfigMap 中,添加以下抓取作业节段:
. . . 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(因为您已在另一个抓取作业中收集这些),并执行一些重新标记(设置job
、pod
、namespace
等标签)。要了解更多关于配置抓取作业的信息,请参阅 Prometheus 抓取配置文档。您可以使用不同的配置指令调整此通用节段,以限制抓取到给定的命名空间、工作负载标签,丢弃额外的指标等等。
配置 Grafana Agent 以发送 Exemplar 到 Grafana Cloud。为此,请将以下内容添加到 ConfigMap:
. . . 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。
将 ConfigMap 部署到您的集群中。
按照 K8s 监控说明中的其余步骤,将以下内容部署到您指定的命名空间中:
- Agent StatefulSet
- kube-state-metrics
- 用于 tail 容器日志的 Agent ConfigMap 和 DaemonSet
按照使用 Grafana Agent 发送 Kubernetes 追踪指南部署 Agent 以收集追踪。
确保填写所需的
remote_write
凭据。您的 Tempo 端点 URL 应该类似于tempo-us-central1.grafana.net:443
。重要提示:如果没有收集追踪的 Agent,演示应用程序将无法启动,因此务必完成此步骤。
完成遥测收集器的部署后,您的运行中的 K8s Pod 应该如下所示:
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 应用程序的步骤:
要部署应用程序,请运行以下命令:
kubectl apply -f https://raw.githubusercontent.com/grafana/tns/main/production/k8s-yamls-cloud/app-full.yaml
您可以在将应用程序部署到集群中之前检查 YAML Manifest 文件。这将应用程序的 Pod 和 Service 部署到集群的
tns-cloud
命名空间中,如果该命名空间不存在,则会创建它。使用
kubectl
检查部署状态:kubectl get all -n tns-cloud
将端口转发到本地 Web 浏览器:
kubectl port-forward -n tns-cloud service/app 8080:80
在您的 Web 浏览器中导航到
https://:8080
以查看演示应用程序的运行情况。
随着已植入代码的演示应用程序和负载生成器启动并运行,您现在可以导航到 Grafana Cloud 查询应用程序日志、可视化其指标并检查其追踪数据。
关联指标、日志和追踪
此时,演示应用程序和负载生成器已植入代码并启动运行,您的遥测收集器正在将指标、日志、追踪和事件数据转发到 Grafana Cloud。在探索 Grafana Cloud 的一些内置功能之前,请安装一个自定义的预构建应用程序仪表盘,该仪表盘演示了一些 Grafana 的核心功能。
关联遥测数据的步骤:
在您的 Grafana 实例中,点击 仪表盘(Dashboards)。
点击 新建(New)并在下拉菜单中选择 导入(Import)。
在 ID 字段中输入
16491
,然后点击 加载(Load)。点击 导入(Import)以导入仪表盘。
导航到仪表盘。
以下仪表盘显示:
{{% admonition type=“note” %}} 如果您没有看到黄色点(Exemplar),请确保已启用 Exemplar。{{% /admonition %}} 有关更多信息,请参阅配置 Grafana Agent。
点击一个 Exemplar 可跳转到针对某个特别慢的请求的追踪。
从这里,跳转到日志以查看有问题的 Span。
点击日志行上的 显示上下文(Show context)以查看周围的日志上下文。
在指标、日志和追踪之间导航
从指标跳转到追踪、再到日志以及反向跳转的能力是一个非常强大的功能,可以帮助您快速解决生产问题并减少平均恢复时间 (MTTR)。您还可以使用 Explore 视图从指标跳转到日志。
在指标、日志和追踪之间导航的步骤:
输入以下 PromQL 查询,确保选择正确的 Prometheus 数据源:
sum by (status_code) (rate(tns_request_duration_seconds_count{job=~"tns-cloud/app.*"}[$__rate_interval]))
以下图表显示:
点击窗口顶部的 拆分(Split),并在下拉菜单中选择正确的 Loki 数据源。
Grafana 会沿用在 PromQL 查询中选择的标签,并使用相同的标签预填充 LogQL 查询,这样您就可以快速从 Prometheus 指标查询跳转到与您正在分析的指标图表相关的相应 Loki 日志数据。
要了解更多关于这些功能的信息,请观看以下视频:
导航集群工作负载
另一种探索 Kubernetes 工作负载的方法是使用集群导航功能。
导航集群工作负载的步骤:
在 Grafana 中,点击左侧菜单中的 可观测性(Observability)并选择 Kubernetes。
将显示命名空间视图,您可以在其中导航集群。
点击特定命名空间即可开始探索工作负载。
从这里,您可以查看所有触发的告警、运行中 Pod 的健康状况,并可以进一步深入查看给定的 ReplicaSet。
点击一个 Pod 可以快速查看附加的 Pod 信息、其日志以及最新的 Kubernetes 集群事件。
点击屏幕右上方的“查看计算资源(View compute resources)”可以快速跳转到 Pod 的资源使用仪表盘。
总结
您现在无需从终端复制粘贴 Pod 名称和标签并运行 kubectl get
、kubectl describe
和 kubectl logs
,而可以直接在 Grafana Cloud 中导航并跳转到相关的可观测性数据。
要了解更多关于 Grafana Cloud Kubernetes 监控的信息,请参阅Grafana Kubernetes 监控文档。