面向云原生时代的日志可观测性栈

A Log Observability Stack for the Cloud Native Era

日志平台帮助您更深入地了解软件基础设施,并了解事物实际的工作方式。然而,传统的日志基础设施过于臃肿,即使要使其运行也需要大量的努力。

从云原生基础设施和应用程序中收集、聚合和分析日志是 IT 和 DevOps 团队必不可少的运营组成部分。随着微服务的激增和运营地点数量的增加,日志数量急剧增加。不仅如此,每个基础设施层和服务都有自己的日志。

结果是,故障排除已经从检查几个 TB 的数据变成了检查几个 PB 的数据(取决于应用程序基础设施的大小)来查明错误。

Kubernetes 在设计上将集群级日志记录的原生支持留给了外部平台,因为这涉及到巨大的规模和复杂性。但是,当前的解决方案对于容器化环境生成的大规模日志数据来说是不够的。

在这篇文章中,我们将探讨如何设置一个日志堆栈,帮助您在几分钟内统一来自 Kubernetes 基础设施的日志。整个堆栈是无 JVM 的,这意味着需要调整的旋钮更少,并且在第 2 天的运营中提供可靠、流畅的体验。

我们将使用 MinIO 和 Parseable 来构建我们的精简日志堆栈。Parseable 是一款轻量级、低延迟的云原生应用程序日志记录和可观察性工具。MinIO是一个高性能对象存储系统,从头开始构建,旨在实现高性能、可扩展性和云原生。作为全球最快的对象存储,MinIO 非常适合存储大量日志文件,并通过 API 公开它们以进行分析和 ML/AI 处理。

先决条件

  • Kubernetes 集群已启动并正在运行。版本 1.19 及以上。
  • 已安装 kubectl 并配置为指向您的 Kubernetes 集群。
  • 已安装 krew

设置 MinIO

MinIO 是整个设置的支柱。它充当 Parseable 发送的日志数据的 高性能、持久存储层。Parseable 编写的所有日志数据都保存在 Parquet 中,因此您可以使用 Apache/Parquet 生态系统中的其他数据分析工具来分析这些数据。

设置 MinIO 运算符

MinIO Kubernetes 运算符是推荐在 Kubernetes 上进行 MinIO 生产部署的方法。请按照以下步骤在您的 Kubernetes 集群上设置开发实例。对于高可用性生产 MinIO 部署,请参阅Kubernetes 文档

  1. 安装 kubectl minio 插件。此插件允许对 MinIO 运算符进行本机命令行访问。
kubectl krew update
kubectl krew install minio

2. 创建一个 MinIO 运算符实例。

kubectl minio init

3. 您现在应该会看到运算符和控制台 Pod 以及服务,处于运行状态。使用以下命令检查状态。

kubectl get all -n minio-operator

创建 MinIO 租户

现在让我们创建一个 MinIO 租户。我们将使用此租户作为 Parseable 日志数据的存储目标。请按照以下步骤创建 MinIO 租户。

Kubectl create ns tenant1
kubectl minio tenant create tenant1 --servers=1 --volumes=4 --capacity=4Gi --enable-prometheus=false --enable-audit-logs=false --disable-tls -n tenant1
kubectl minio tenant info tenant1

kubectl minio tenant create 命令会打印此租户的管理员凭据。**这些凭据将不会再次显示。**请记下它们,我们将在下一步中使用它们。
接下来,让我们将 MinIO 控制台公开到您的本地计算机,以便我们可以访问 UI。请注意,在某些情况下,您可能需要使用ingress-nginx 来访问服务

kubectl port-forward svc/tenant1-console 9090:9090 -n tenant1

现在,打开浏览器并访问 URL http://localhost:9090。使用 kubectl minio tenant create 命令打印的凭据登录。导航到创建存储桶并创建一个名为 parseable 的存储桶。

设置 Parseable

一旦 MinIO 设置并运行,下一步就是设置 Parseable。我们将以 s3-store 模式部署 Parseable,以便它使用MinIO 作为主要存储

首先,创建一个包含 Parseable 需要环境变量的文件。确保从前面的步骤更新访问密钥和密钥。下面,我们创建了文件 parseable-env-secret

cat << EOF > parseable-env-secret
s3.url=http://minio.tenant1.svc.cluster.local
s3.access.key=<tenant1 access key>
s3.secret.key=<tenant1 secret key>
s3.region=us-east-1
s3.bucket=parseable
addr=0.0.0.0:8000
staging.dir=./staging
fs.dir=./data
username=admin
password=admin
EOF

接下来,创建 Parseable 命名空间和一个供 Parseable 部署使用的密钥。

kubectl create ns parseable
kubectl create secret generic parseable-env-secret --from-env-file=parseable-env-secret -n parseable
rm -rf parseable-env-secret

最后,部署 Parseable helm 图表。

helm repo add parseable https://charts.parseable.io
helm install parseable parseable/parseable -n parseable

设置 Vector

这将我们带到本教程的最后一步。Vector 是一款轻量级、超快速的构建可观察性管道的工具。它可以通过其本机 Kubernetes sink 从 Kubernetes 集群推送日志和遥测事件。

首先,添加 Vector helm 仓库并下载 Parseable 配置的 values.yaml 文件。

helm repo add vector https://helm.vector.dev
wget https://www.parseable.io/vector/values.yaml

然后在其自己的命名空间中安装 Vector。

helm install vector vector/vector --namespace vector --create-namespace --values values.yaml

在默认配置中,Vector 作为 DaemonSet 安装,并捕获每个 Pod 的日志。有关更多信息,请阅读Vector Kubernetes 源文档

Vector 需要一两分钟才能初始化。您可以查看 Vector 仪表板以确保它正在正确运行。

kubectl -n vector exec -it daemonset/vector -- vector top \
        --url http://127.0.0.1:8686/graphql

如果一切按预期运行,则应运行以下 Pod

测试是否一切正常

由于我们配置了 Vector 以收集所有 Pod 的日志,因此它将立即开始将 Pod 日志发送到 Parseable 流 k8slogs(在 Vector values.yaml 中设置)。

要进行验证,请将 Parseable 服务公开到本地计算机,并使用之前在 Parseable 密钥中设置的凭据登录到 Parseable UI(如果未配置这些凭据,则默认为 adminadmin)。

kubectl port-forward svc/parseable 8000:80 -n parseable

日志分析

现在我们已经完成了整个设置,让我们看看如何使用简单的 SQL 查询分析日志数据,甚至使用Parseable + Grafana 数据源插件构建仪表板。

SQL 查询

确保您在终端中运行了 Parseable 的 kubectl port-forward。然后在另一个终端中使用 curl 发送如下查询

curl --location --request POST 'http://localhost:8000/api/v1/query' \
--header 'Authorization: Basic YWRtaW46YWRtaW4=' \
--header 'Content-Type: application/json' \
--data-raw '{
    "query":"select * from k8slogs where kubernetes_container_name=’coredns’",
    "startTime":"2023-02-08T00:00:00+00:00",
    "endTime":"2023-02-08T23:59:00+00:00"

此查询将显示所有运行 CoreDNS 容器的 Pod 的所有日志。您可以通过这种方式运行标准 SQL 查询来对 k8slogs 流中的日志进行切片和切块。

注意:请确保将 startTimeendTime 更改为适当的时间戳。如果您在上面更改了 Parseable 凭据,请更新授权标头。

可视化

我们正在努力将可视化功能引入 Parseable 控制台,但在我们进行此操作的同时,我们目前建议使用我们的 Grafana 数据源插件。

如果您尚未安装 Grafana,请参阅使用 Prometheus 和 Grafana 进行多云监控和警报以获取裸机安装说明,或参阅在 Kubernetes 上部署 | Grafana Enterprise Logs 文档以获取 Kubernetes 安装说明。如果您已安装 Grafana,则可以从Grafana Marketplace安装 Parseable 插件或使用 grafana-cli 命令

grafana-cli plugins install parseable-datasource

安装插件后,添加 Parseable 数据源 Configuration > Data sources > Add Data source。然后使用 Parseable 数据源作为源创建一个新的仪表板。以下是使用 Parseable 数据源时的查询编辑器外观

您可以在文本框中添加 SQL 查询。Grafana 会负责添加相关时间戳。这是一个示例可视化

您还可以使用转换选项关联来自不同日志流的日志。

结论

这篇博文向您展示了如何使用 MinIO 和 Parseable 构建云原生日志堆栈。

来自云原生基础设施和应用程序的日志为 IT 和 DevOps 团队提供了关键的故障排除信息。当您在软件定义的基础设施上运行大量微服务时,每个组件都有自己的日志,因此您需要一种可行的方法来及时收集和搜索日志。

我们在这篇博文中演示的技术将帮助您统一日志收集、聚合、管理和分析,以便实时了解集群的运行情况和性能。

如果您对云原生日志记录有任何疑问,请加入我们的社区 Slack 频道,地址为https://slack.min.iohttps://launchpad.com/parseable