使用 Kubernetes 监控来监控应用程序
引言
本教程展示了如何将一个已埋点的三层(数据层、应用逻辑层、负载均衡层)Web 应用程序部署到 Kubernetes 集群中,并利用 Grafana Cloud 的内置 Kubernetes 监控功能来监控该应用程序。
在本教程中,您将学习如何:
- 将 TNS 示例应用部署到您的 Kubernetes 集群中。
- 将预构建的仪表盘部署到您的 Grafana Cloud 实例中,以可视化应用程序的性能指标。
- 部署 Grafana Agent 以从 Kubernetes 集群收集指标、日志和事件。
- 配置这些 Agent 以从 TNS 应用收集指标、日志和追踪(包括Exemplars)。
- 学习如何使用 Grafana 强大的关联功能,在指标、追踪、日志之间来回导航。
- 学习如何使用 Kubernetes 集群导航器探索集群中运行的工作负载,从 Pod 跳转到仪表盘和日志。
开始之前
完成本教程需要访问以下资源:
- 一个 Kubernetes, K3s 或 OpenShift 集群
- 一个 Grafana Cloud Stack,可选启用Exemplar 支持。
部署和配置 Grafana Agent
按照此步骤将 Grafana Agent 部署到您的 Kubernetes 集群中。为了简化 Agent 部署,Grafana Cloud 提供了预配置的 Manifest 供您下载和修改。
部署 Grafana Agent
导航至您的 Grafana Cloud 实例。
点击左侧菜单中的 可观测性,然后选择 Kubernetes。
点击 开始发送数据,然后点击 安装仪表盘和告警规则 以安装预构建的 Kubernetes 仪表盘和告警集。
点击 Agent 配置说明 并检查 先决条件 下列出的各项是否满足。
在 指标和事件 下,将 命名空间 字段中的
default
替换为您的命名空间。Agent ConfigMap 已更新为您的命名空间。
点击 复制到剪贴板 并将 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 将 Exemplars 发送到 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 实例中启用 Exemplars。
将 ConfigMap 部署到您的集群中。
按照 Kubernetes 监控说明中的其余步骤,将以下内容部署到您指定的命名空间中:
- Agent StatefulSet
- kube-state-metrics
- 用于跟踪容器日志的 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 仓库包含用于部署应用所需组件的 Kubernetes Manifest(用 Jsonnet 编写)。您无需学习 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” %}} 如果您没有看到黄点(Exemplars),请确保 Exemplars 已启用。{{% /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 中,点击左侧菜单中的 可观测性,然后选择 Kubernetes。
此时显示命名空间视图,您可以在其中导航集群。
点击特定的命名空间以开始探索工作负载。
在这里,您可以看到任何触发的警报、运行中的 Pod 的健康状况,并可以进一步深入查看给定的 ReplicaSet。
点击一个 Pod,快速查看更多 Pod 信息、其日志以及最新的 Kubernetes 集群事件。
点击屏幕右上方的 View compute resources(查看计算资源),快速跳转到 Pod 的资源使用仪表盘
总结
您无需从终端复制粘贴 Pod 名称和标签并运行 kubectl get
、kubectl describe
和 kubectl logs
,现在可以直接在 Grafana Cloud 中导航并跳转到相关的可观测性数据。
要了解更多关于 Grafana Cloud Kubernetes 监控的信息,请参阅Grafana Kubernetes 监控文档。