菜单
开源 RSS

在 AWS EKS 上运行 Promtail 客户端

在本教程中,我们将了解如何在 EKS 上设置 Promtail。Amazon Elastic Kubernetes Service (Amazon EKS) 是一项全托管的 Kubernetes 服务,使用 Promtail,我们将能够全面了解我们的集群日志。我们将首先转发 Pod 日志,然后是节点服务日志,最后是 Kubernetes 事件日志。

注意

Promtail 已被弃用,并将在长期支持 (LTS) 下持续到 2026 年 2 月 28 日。Promtail 将于 2026 年 3 月 2 日达到生命周期结束 (EOL)。您可以在此处找到迁移资源。

完成本教程后,您将能够使用 Grafana 在一个地方查询所有日志。

要求

开始之前,您需要

  • 已配置 AWS CLI (运行 aws configure)。
  • 已安装 kubectleksctl
  • 已配置 Grafana Loki 数据源的 Grafana 实例,您可以使用 GrafanaCloud 免费试用版。

为简单起见,我们将使用 GrafanaCloud Loki 和 Grafana 实例,您可以在我们的网站上获取本教程的免费账户,但如果您运行自己的开源版本 Loki 和 Grafana 实例,所有步骤都是相同的。

设置集群

在本教程中,我们将使用 eksctl,这是一个用于在 Amazon EKS 上创建和管理 Kubernetes 集群的简单命令行工具。AWS 需要创建许多资源,例如 IAM 角色、安全组和网络,使用 eksctl 可以简化所有这些操作。

注意

我们不打算使用 Fargate 集群。请注意,如果您想使用 Fargate,则不允许使用 DaemonSet;使用 EKS Fargate 发送日志的唯一方法是使用 fluentd 或 fluentbit 或 Promtail 作为 Sidecar 运行,并将日志输出到文件。有关如何操作的更多信息,您可以阅读此[博客文章][blog ship log with fargate]。

bash
eksctl create cluster --name loki-promtail --managed

这通常需要大约 15 分钟。完成后,您应该已配置 kubectl context 来与新创建的集群通信。要验证,请运行以下命令

bash
kubectl version

您应该看到类似以下的输出

bash
Client Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.5", GitCommit:"e6503f8d8f769ace2f338794c914a96fc335df0f", GitTreeState:"clean", BuildDate:"2020-07-04T15:01:15Z", GoVersion:"go1.14.4", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"16+", GitVersion:"v1.16.8-eks-fd1ea7", GitCommit:"fd1ea7c64d0e3ccbf04b124431c659f65330562a", GitTreeState:"clean", BuildDate:"2020-05-28T19:06:00Z", GoVersion:"go1.13.8", Compiler:"gc", Platform:"linux/amd64"}

添加 Promtail DaemonSet

为了发送您的所有 Pod 日志,我们将在集群中将 Promtail 设置为 DaemonSet。这意味着它将在集群中的每个节点上运行,然后我们将配置它来查找主机上的容器日志。

Promtail 的优点在于它使用与 Prometheus 相同的服务发现机制,您应该确保 Promtail 的 scrape_configs 与 Prometheus 的匹配。这不仅配置起来更简单,而且意味着 Metrics(指标)和 Logs(日志)将具有由 Prometheus 服务发现附加的相同元数据(标签)。在查询 Grafana 时,您将能够非常快速地关联指标和日志,您可以在我们的博客文章中了解更多信息。

让我们添加 Loki 仓库并列出所有可用的 Chart。要添加仓库,请运行以下命令

bash
helm repo add grafana https://grafana.github.io/helm-charts
helm upgrade -i promtail grafana/promtail

您应该看到以下消息。

bash
"loki" has been added to your repositories

要列出可用的 Chart,请运行以下命令

bash
helm search repo

您应该看到类似以下的输出

bash
NAME                   CHART VERSION   APP VERSION     DESCRIPTION
loki/fluent-bit 0.3.0           v1.6.0          Uses fluent-bit Loki go plugin for gathering lo...
loki/loki       0.31.0          v1.6.0          Loki: like Prometheus, but for logs.
loki/loki-stack 0.40.0          v1.6.0          Loki: like Prometheus, but for logs.
loki/promtail   0.24.0          v1.6.0          Responsible for gathering logs and sending them...

如果您想将 Loki、Grafana、Prometheus 和 Promtail 全部安装在一起,可以使用 loki-stack Chart,但现在我们将专注于 Promtail。让我们创建一个新的 Helm value 文件,我们将获取默认文件并在此基础上进行修改

bash
curl https://raw.githubusercontent.com/grafana/helm-charts/main/charts/promtail/values.yaml > values.yaml

首先,我们将告诉 Promtail 将日志发送到我们的 Loki 实例,下面的示例展示了如何将日志发送到 GrafanaCloud,请替换您的凭据。如果您正在使用 loki-chart 仓库,默认值将发送到您自己的 Loki 和 Grafana 实例。

yaml
loki:
  serviceName: "logs-prod-us-central1.grafana.net"
  servicePort: 443
  serviceScheme: https
  user: <userid>
  password: <grafancloud apikey>

准备就绪后,让我们创建一个新的命名空间 monitoring 并将 Promtail 添加到其中。要创建命名空间,请运行以下命令

bash
kubectl create namespace monitoring

您应该看到以下消息。

bash
namespace/monitoring created

要添加 Promtail,请运行以下命令

bash
helm install promtail --namespace monitoring loki/promtail -f values.yaml

您应该看到类似以下的输出

bash
NAME: promtail
LAST DEPLOYED: Fri Jul 10 14:41:37 2020
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Verify the application is working by running these commands:
  kubectl --namespace default port-forward daemonset/promtail 3101
  curl http://127.0.0.1:3101/metrics

验证 Promtail Pod 是否正在运行。您应该只看到两个,因为我们正在运行一个双节点集群。

bash
kubectl get -n monitoring pods

您应该看到类似以下的输出

bash
NAME             READY   STATUS    RESTARTS   AGE
promtail-87t62   1/1     Running   0          35s
promtail-8c2r4   1/1     Running   0          35s

您可以访问您的 Grafana 实例并开始探索您的日志。例如,如果您想查看 monitoring 命名空间中的所有日志,请使用 {namespace="monitoring"},您还可以展开单行日志以发现来自 Kubernetes 服务发现的所有可用标签。

grafana logs namespace

使用 systemd 获取 kubelet 日志

到目前为止,我们正在抓取容器的日志,但如果您想获得更多可见性,您还可以从每台机器抓取 systemd 日志。这意味着您也可以访问 kubelet 日志。

让我们再次编辑我们的 values 文件,并修改 extraScrapeConfigs 以添加 systemd 作业

yaml
extraScrapeConfigs:
  - job_name: journal
    journal:
      path: /var/log/journal
      max_age: 12h
      labels:
        job: systemd-journal
    relabel_configs:
      - source_labels: ['__journal__systemd_unit']
        target_label: 'unit'
      - source_labels: ['__journal__hostname']
        target_label: 'hostname'

请随意更改 relabel_configs 以匹配您自己环境中的使用情况。

现在我们需要添加一个卷来访问 systemd 日志

yaml
extraVolumes:
  - name: journal
    hostPath:
      path: /var/log/journal

并在 Promtail 中添加一个新的卷挂载

yaml
extraVolumeMounts:
  - name: journal
    mountPath: /var/log/journal
    readOnly: true

现在我们准备好了,可以更新 Promtail deployment 了

bash
helm upgrade  promtail loki/promtail -n monitoring -f values.yaml

让我们回到 Grafana,输入以下查询以获取与 Kubelet 中的 Volume 相关的所有日志

logql
{unit="kubelet.service"} |= "Volume"

过滤表达式在 LogQL 中非常强大,它们可以帮助您扫描日志,在此例中,它将过滤掉所有不包含 Volume 单词的 kubelet 日志。

工作流程很简单,您总是首先选择一组标签匹配器,这样可以减少计划扫描的数据量(例如应用程序、命名空间甚至集群)。然后,您可以应用一组过滤器来查找所需的日志。

Promtail 还支持 syslog。

添加 Kubernetes 事件

Kubernetes 事件 (kubectl get events -n monitoring) 是调试和排查 Kubernetes 集群问题的绝佳方法。事件包含节点重启、OOMKiller 和 Pod 故障等信息。

我们将部署由 Heptio 创建的 eventrouter 应用程序,该应用程序将这些事件记录到 stdout

但首先我们需要配置 Promtail,我们希望解析命名空间,并将其作为标签从内容中添加,这样我们就可以快速按命名空间访问事件。

让我们更新我们的 pipelineStages 来解析 eventrouter 的日志

yaml
pipelineStages:
- docker:
- match:
    selector: '{app="eventrouter"}'
    stages:
    - json:
        expressions:
          namespace: event.metadata.namespace
    - labels:
        namespace: ""

管道阶段是解析日志内容并创建标签(可被索引)的绝佳方法,如果您想配置更多,请查阅管道文档。

现在再次更新 Promtail

bash
helm upgrade  promtail loki/promtail -n monitoring -f values.yaml

并使用以下命令部署 eventrouter

bash
kubectl create -f https://raw.githubusercontent.com/grafana/loki/main/docs/sources/send-data/promtail/cloud/eks/eventrouter.yaml

您应该看到类似以下的输出

bash
serviceaccount/eventrouter created
clusterrole.rbac.authorization.k8s.io/eventrouter created
clusterrolebinding.rbac.authorization.k8s.io/eventrouter created
configmap/eventrouter-cm created
deployment.apps/eventrouter created

让我们进入 Grafana Explore 并使用 {app="eventrouter",namespace="monitoring"} 查询新的 monitoring 命名空间中的事件。

有关 eventrouter 的更多信息,请务必阅读 Goutham 的博客文章

总结

就是这样!如果需要,您可以下载最终完整的values.yaml

您的 EKS 集群现在已准备就绪,您所有当前和将来的应用程序日志现在都将通过 Promtail 发送到 Loki。您还可以探索 kubelet 和 Kubernetes 事件。由于我们使用了 DaemonSet,当您扩展节点时,将自动抓取所有节点日志。

如果您想进一步深入,可以查看 Joe 的博客文章,了解如何在部署新的 Kubernetes 应用程序时使用 Loki 自动创建 Grafana 仪表盘注解。

如果您需要删除集群,只需运行 eksctl delete cluster --name loki-promtail