Kubernetes 监控 Helm 教程
Loki 的主要用例之一是收集并存储来自您的Kubernetes 集群的日志。这些日志分为三类
- Pod 日志:由集群中运行的 Pod 生成的日志。
- Kubernetes 事件:由 Kubernetes API 服务器生成的日志。
- 节点日志:由集群中的节点生成的日志。

在本教程中,我们将部署Loki和Kubernetes 监控 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。您应该迁移到更适用于生产环境的存储后端,例如S3、GCS、Azure Blob Storage或 MinIO 集群,以用于生产环境。
先决条件
开始之前,您需要具备以下条件
提示
或者,您可以在我们的交互式学习环境中尝试此示例:使用 Loki 进行 Kubernetes 监控。
这是一个完全配置好的环境,所有依赖项都已安装。
请在Grafana Killercoda 仓库中提供反馈、报告错误和提出问题。
创建 meta
和 prod
命名空间
K8s 监控 Helm Chart 将监控两个命名空间:meta
和 prod
meta
命名空间:此命名空间将用于部署 Loki、Grafana 和 Alloy。prod
命名空间:此命名空间将用于部署将生成日志的示例应用。
通过运行以下命令创建 meta
和 prod
命名空间:
kubectl create namespace meta && kubectl create namespace prod
添加 Grafana Helm 仓库
所有三个 Helm Chart(Loki、Grafana 和 Kubernetes 监控 Helm)都可在 Grafana Helm 仓库中获取。通过运行以下命令添加 Grafana Helm 仓库
helm repo add grafana https://grafana.github.io/helm-charts && helm repo update
在将仓库添加到本地 Helm 列表的同时,您还应该运行 helm repo update
以确保您拥有最新版本的 Chart。
克隆教程仓库
通过运行以下命令克隆教程仓库
git clone https://github.com/grafana/alloy-scenarios.git
然后将目录更改为 alloy-scenarios/k8s/logs
目录
cd alloy-scenarios/k8s/logs
本教程的其余部分假定您位于 alloy-scenarios/k8s/logs
目录中。
部署 Loki
Grafana Loki 将用于存储我们收集的日志。在本教程中,我们将以最小的资源占用部署 Loki,并使用 Loki Helm Chart 提供的默认存储后端 MinIO。
通过运行以下命令部署 Loki
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,请运行以下命令
helm install --values grafana-values.yml grafana grafana/grafana --namespace meta
与之前一样,该命令也包含一个 values
文件,用于指定 Grafana 的配置。需要注意以下两个重要的配置属性
adminUser
和adminPassword
:这些是您将用于登录 Grafana 的凭据。值分别为admin
和adminadminadmin
。推荐的最佳实践是使用 Kubernetes Secret 或让 Grafana 为您生成密码。有关如何配置 Grafana Helm Chart 的更多详细信息,请参阅 Grafana Helm 文档。datasources
:配置的此部分允许您定义 Grafana 应使用的数据源。在本教程中,您将定义一个 Loki 数据源。数据源定义如下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:80
。loki-gateway
服务由 Loki Helm Chart 创建,用于查询存储在 Loki 中的日志。如果您选择在不同的命名空间或使用不同的名称部署 Loki,则需要相应地更新 url
属性。
部署 Kubernetes 监控 Helm Chart
Kubernetes 监控 Helm Chart 用于收集、抓取并将 Kubernetes 遥测数据转发到 Grafana 技术栈。这包括收集指标、日志、追踪和持续分析数据的能力。本教程的范围是部署 Kubernetes 监控 Helm Chart 来收集 Pod 日志和 Kubernetes 事件。
通过运行以下命令部署 Kubernetes 监控 Helm Chart
helm install --values ./k8s-monitoring-values.yml k8s grafana/k8s-monitoring -n meta
在配置文件 k8s-monitoring-values.yml
中,我们定义了以下内容
---
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
:指定从哪些命名空间收集日志。在本例中,我们从meta
和prod
命名空间收集日志。
- 在本教程中禁用节点日志收集,因为它需要挂载
/var/log/journal
。这超出了本教程的范围。 - 最后,定义收集器的角色。Kubernetes 监控 Helm Chart 将只部署您所需的功能,不多不少。在本例中,我们告诉 Helm Chart 只部署具有日志收集能力的 Alloy。如果您需要收集 K8s 指标、追踪或持续分析数据,您可以启用相应的收集器。
访问 Grafana
要访问 Grafana,您需要将 Grafana 服务端口转发到本地机器。为此,请运行以下命令
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。默认凭据为 admin
和 adminadminadmin
。
您应该首先访问的页面之一是日志向下钻取(Logs Drilldown),它允许您无需编写查询即可自动可视化和探索日志:https://:3000/a/grafana-lokiexplore-app

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

向 prod
命名空间添加示例应用
最后,我们将在 prod
命名空间部署一个将生成一些日志的示例应用。要部署该示例应用,请运行以下命令
helm install tempo grafana/tempo-distributed -n prod
这将在 prod
命名空间部署默认版本的 Grafana Tempo。Tempo 是一个分布式追踪后端,用于存储和查询追踪数据。通常 Tempo 会与 Loki 和 Grafana 一起部署在 meta
命名空间中,但为了本教程的目的,我们将假定这是主要的应用日志生成器。
部署完成后,让我们再次暴露 Grafana
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 日志。

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