菜单
文档面包屑箭头 Grafana Loki面包屑箭头 发送数据面包屑箭头 Kubernetes 监控 Helm
开源 RSS

Kubernetes 监控 Helm 教程

Loki 的主要用例之一是收集并存储来自您的Kubernetes 集群的日志。这些日志分为三类

  1. Pod 日志:由集群中运行的 Pod 生成的日志。
  2. Kubernetes 事件:由 Kubernetes API 服务器生成的日志。
  3. 节点日志:由集群中的节点生成的日志。
Scraping Kubernetes Logs
抓取 Kubernetes 日志

在本教程中,我们将部署LokiKubernetes 监控 Helm Chart来收集其中两种日志类型:Pod 日志和 Kubernetes 事件。我们还将部署Grafana来可视化这些日志。

须知事项

开始之前,请了解以下几点

  • Loki:Loki 可以以单个二进制文件模式或分布式系统模式运行。在本教程中,我们将以单个二进制文件(也称为单体模式)部署 Loki。Loki 在此模式下可根据您收集的日志数量进行垂直扩展。Grafana Labs 建议在生产环境中采用分布式/微服务模式运行 Loki,以监控大量日志。
  • 部署:您将把 Loki、Grafana 和 Alloy(作为 Kubernetes 监控 Helm Chart 的一部分)部署到您 Kubernetes 集群的 meta 命名空间。请确保您拥有在该命名空间中创建资源的必要权限。这些 Pod 也需要资源才能运行,因此请考虑您的节点有多少可用容量。您也可以仅在集群内部署 Kubernetes 监控 Helm Chart(因为它资源占用很小),并将日志写入外部 Loki 实例或 Grafana Cloud。
  • 存储:在本教程中,Loki 将使用 Loki Helm Chart 中提供的默认对象存储后端;MinIO。您应该迁移到更适用于生产环境的存储后端,例如S3GCSAzure Blob Storage或 MinIO 集群,以用于生产环境。

先决条件

开始之前,您需要具备以下条件

  • 一个运行版本为 1.23 或更高版本的 Kubernetes 集群。
  • kubectl 安装在您的本地机器上。
  • Helm 安装在您的本地机器上。

提示

或者,您可以在我们的交互式学习环境中尝试此示例:使用 Loki 进行 Kubernetes 监控

这是一个完全配置好的环境,所有依赖项都已安装。

Interactive

请在Grafana Killercoda 仓库中提供反馈、报告错误和提出问题。

创建 metaprod 命名空间

K8s 监控 Helm Chart 将监控两个命名空间:metaprod

  • meta 命名空间:此命名空间将用于部署 Loki、Grafana 和 Alloy。
  • prod 命名空间:此命名空间将用于部署将生成日志的示例应用。

通过运行以下命令创建 metaprod 命名空间:

bash
kubectl create namespace meta && kubectl create namespace prod

添加 Grafana Helm 仓库

所有三个 Helm Chart(Loki、Grafana 和 Kubernetes 监控 Helm)都可在 Grafana Helm 仓库中获取。通过运行以下命令添加 Grafana Helm 仓库

bash
helm repo add grafana https://grafana.github.io/helm-charts && helm repo update

在将仓库添加到本地 Helm 列表的同时,您还应该运行 helm repo update 以确保您拥有最新版本的 Chart。

克隆教程仓库

通过运行以下命令克隆教程仓库

bash
git clone https://github.com/grafana/alloy-scenarios.git

然后将目录更改为 alloy-scenarios/k8s/logs 目录

bash
cd alloy-scenarios/k8s/logs

本教程的其余部分假定您位于 alloy-scenarios/k8s/logs 目录中。

部署 Loki

Grafana Loki 将用于存储我们收集的日志。在本教程中,我们将以最小的资源占用部署 Loki,并使用 Loki Helm Chart 提供的默认存储后端 MinIO。

通过运行以下命令部署 Loki

bash
helm install --values loki-values.yml loki grafana/loki -n meta

此命令将在 meta 命名空间中部署 Loki。该命令还包含一个 values 文件,用于指定 Loki 的配置。有关如何配置 Loki Helm Chart 的更多详细信息,请参阅 Loki Helm 文档

部署 Grafana

接下来,我们将把 Grafana 部署到 meta 命名空间。您将使用 Grafana 来可视化存储在 Loki 中的日志。要部署 Grafana,请运行以下命令

bash
helm install --values grafana-values.yml grafana grafana/grafana --namespace meta

与之前一样,该命令也包含一个 values 文件,用于指定 Grafana 的配置。需要注意以下两个重要的配置属性

  1. adminUseradminPassword:这些是您将用于登录 Grafana 的凭据。值分别为 adminadminadminadmin。推荐的最佳实践是使用 Kubernetes Secret 或让 Grafana 为您生成密码。有关如何配置 Grafana Helm Chart 的更多详细信息,请参阅 Grafana Helm 文档

  2. datasources:配置的此部分允许您定义 Grafana 应使用的数据源。在本教程中,您将定义一个 Loki 数据源。数据源定义如下

    yaml
     datasources:
       datasources.yaml:
             apiVersion: 1
             datasources:
             - name: Loki
               type: loki
               access: proxy
               orgId: 1
               url: http://loki-gateway.meta.svc.cluster.local:80
               basicAuth: false
               isDefault: false
               version: 1
               editable: false

此配置定义了一个名为 Loki 的数据源,Grafana 将使用它来查询存储在 Loki 中的日志。url 属性指定了 Loki 网关的 URL。Loki 网关是一个位于 Loki API 前的服务,提供用于摄取和查询日志的单个端点。URL 格式为 http://loki-gateway.<NAMESPACE>.svc.cluster.local:80loki-gateway 服务由 Loki Helm Chart 创建,用于查询存储在 Loki 中的日志。如果您选择在不同的命名空间或使用不同的名称部署 Loki,则需要相应地更新 url 属性。

部署 Kubernetes 监控 Helm Chart

Kubernetes 监控 Helm Chart 用于收集、抓取并将 Kubernetes 遥测数据转发到 Grafana 技术栈。这包括收集指标、日志、追踪和持续分析数据的能力。本教程的范围是部署 Kubernetes 监控 Helm Chart 来收集 Pod 日志和 Kubernetes 事件。

通过运行以下命令部署 Kubernetes 监控 Helm Chart

bash
helm install --values ./k8s-monitoring-values.yml k8s grafana/k8s-monitoring -n meta

在配置文件 k8s-monitoring-values.yml 中,我们定义了以下内容

yaml
---
cluster:
  name: meta-monitoring-tutorial

destinations:
  - name: loki
    type: loki
    url: http://loki-gateway.meta.svc.cluster.local/loki/api/v1/push


clusterEvents:
  enabled: true
  collector: alloy-logs
  namespaces:
    - meta
    - prod

nodeLogs:
  enabled: false

podLogs:
  enabled: true
  gatherMethod: kubernetesApi
  collector: alloy-logs
  labelsToKeep: ["app_kubernetes_io_name","container","instance","job","level","namespace","service_name","service_namespace","deployment_environment","deployment_environment_name"]
  structuredMetadata:
    pod: pod  # Set structured metadata "pod" from label "pod"
  namespaces:
    - meta
    - prod

# Collectors
alloy-singleton:
  enabled: false

alloy-metrics:
  enabled: false

alloy-logs:
  enabled: true
  # Required when using the Kubernetes API to pod logs
  alloy:
    mounts:
      varlog: false
    clustering:
      enabled: true

alloy-profiles:
  enabled: false

alloy-receiver:
  enabled: false

配置文件解析

  • 将集群名称定义为 meta-monitoring-tutorial。这是一个静态标签,将附加到 Kubernetes 监控 Helm Chart 收集的所有日志上。
  • 定义一个名为 loki 的目标,用于将日志转发到 Loki。url 属性指定了 Loki 网关的 URL。如果您选择在不同的命名空间或完全不同的位置部署 Loki,则需要相应地更新 url 属性。
  • 启用集群事件和 Pod 日志收集
    • collector:指定用于收集日志的收集器。在本例中,我们使用 alloy-logs 收集器。
    • labelsToKeep:指定收集日志时要保留的标签。请注意,这并不会丢弃日志。当您不想应用高基数标签时,这很有用。在本例中,我们已从保留标签中移除了 pod
    • structuredMetadata:指定要收集的结构化元数据。在本例中,我们设置了结构化元数据 pod,以便在查询时保留 Pod 名称。虽然它不需要作为标签进行索引。
    • namespaces:指定从哪些命名空间收集日志。在本例中,我们从 metaprod 命名空间收集日志。
  • 在本教程中禁用节点日志收集,因为它需要挂载 /var/log/journal。这超出了本教程的范围。
  • 最后,定义收集器的角色。Kubernetes 监控 Helm Chart 将只部署您所需的功能,不多不少。在本例中,我们告诉 Helm Chart 只部署具有日志收集能力的 Alloy。如果您需要收集 K8s 指标、追踪或持续分析数据,您可以启用相应的收集器。

访问 Grafana

要访问 Grafana,您需要将 Grafana 服务端口转发到本地机器。为此,请运行以下命令

bash
export POD_NAME=$(kubectl get pods --namespace meta -l "app.kubernetes.io/name=grafana,app.kubernetes.io/instance=grafana" -o jsonpath="{.items[0].metadata.name}") && \
kubectl --namespace meta port-forward $POD_NAME 3000 --address 0.0.0.0

提示

这将使您的终端无法使用,直到您停止端口转发进程。要停止该进程,请按 Ctrl + C

此命令将把 Grafana 服务端口转发到本地机器的端口 3000

您现在可以通过浏览器访问https://:3000来访问 Grafana。默认凭据为 adminadminadminadmin

您应该首先访问的页面之一是日志向下钻取(Logs Drilldown),它允许您无需编写查询即可自动可视化和探索日志:https://:3000/a/grafana-lokiexplore-app

Logs Drilldown view of K8s logs
K8s 日志的日志向下钻取视图

(可选)查看 Alloy UI

Kubernetes 监控 Helm Chart 部署 Grafana Alloy 来收集和转发 Kubernetes 集群的遥测数据。Helm Chart 的设计旨在让您无需手动创建 Alloy 配置文件。但是,如果您想了解 pipeline,可以查看 Alloy UI。要访问 Alloy UI,您需要将 Alloy 服务端口转发到本地机器。为此,请运行以下命令

bash
export POD_NAME=$(kubectl get pods --namespace meta -l "app.kubernetes.io/name=alloy-logs,app.kubernetes.io/instance=k8s" -o jsonpath="{.items[0].metadata.name}") && \
kubectl --namespace meta port-forward $POD_NAME 12345 --address 0.0.0.0

提示

这将使您的终端无法使用,直到您停止端口转发进程。要停止该进程,请按 Ctrl + C

此命令将把 Alloy 服务端口转发到本地机器的端口 12345。您可以通过浏览器访问https://:12345来访问 Alloy UI。

Grafana Alloy UI
Grafana Alloy UI

prod 命名空间添加示例应用

最后,我们将在 prod 命名空间部署一个将生成一些日志的示例应用。要部署该示例应用,请运行以下命令

bash
helm install tempo grafana/tempo-distributed -n prod

这将在 prod 命名空间部署默认版本的 Grafana Tempo。Tempo 是一个分布式追踪后端,用于存储和查询追踪数据。通常 Tempo 会与 Loki 和 Grafana 一起部署在 meta 命名空间中,但为了本教程的目的,我们将假定这是主要的应用日志生成器。

部署完成后,让我们再次暴露 Grafana

bash
export POD_NAME=$(kubectl get pods --namespace meta -l "app.kubernetes.io/name=grafana,app.kubernetes.io/instance=grafana" -o jsonpath="{.items[0].metadata.name}") && \
kubectl --namespace meta port-forward $POD_NAME 3000 --address 0.0.0.0

并导航到https://:3000/a/grafana-lokiexplore-app查看 Grafana Tempo 日志。

Label view of Tempo logs
Tempo 日志的标签视图

结论

在本教程中,您学习了如何部署 Loki、Grafana 和 Kubernetes 监控 Helm Chart,以收集并存储来自 Kubernetes 集群的日志。我们部署了这些 Helm Chart 的最小测试版本,以演示如何快速开始使用 Loki。现在值得更详细地探索这些 Helm Chart,以了解如何扩展它们来满足您的生产需求