云原生时代的日志可观察性堆栈

云原生时代的日志可观察性堆栈

日志记录平台可帮助您更深入地了解您的软件基础设施,并了解事情的实际运作情况。然而,传统的日志记录基础架构非常臃肿,甚至需要付出巨大的努力才能达到运行状态。

收集、聚合和分析来自云原生基础架构和应用程序的日志是 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 Operator 是在 Kubernetes 上进行 MinIO 生产部署的推荐方法。按照以下步骤在 Kubernetes 集群上设置开发实例。对于高可用性生产 MinIO 部署,请参阅Kubernetes 文档

  1. 安装kubectl minio插件。此插件允许本机命令行访问 MinIO 操作员。

kubectl krew update
kubectl krew install minio

2. 创建一个 MinIO Operator 实例。

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.


pasted image 0 (5).png


设置可解析

一旦 MinIO 设置并运行,下一步就是设置 Parseable。我们将部署 Parseables3-store模式,因此它使用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 chart。

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

设置向量

这将我们带到了本教程的最后一步。Vector 是一种用于构建可观察性管道的轻量级超快速工具。它可以通过其本机 Kubernetes 接收器从 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 运行:


Screenshot 2023-01-31 at 1.47.03 PM.png


测试是否一切正常

由于我们将 Vector 配置为从所有 pod 收集日志,它会立即开始将 pod 日志发送到 Parseable 流k8slogs(在 Vector 中设置values.yaml)。

要验证,请将 Parseable 服务暴露给本地机器并使用我们之前创建的 Parseable 秘密中设置的凭据登录到 Parseable UI(如果未配置这些,则默认为 和adminadmin

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


Screenshot 2023-01-31 at 1.48.22 PM.png


日志分析

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

查询

确保kubectl port-forward在终端中运行 for Parseable。然后在另一个终端中使用 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

注意:确保将startTime和更改endTime为适当的时间戳。如果您更改了上面的 Parseable 凭证,还要更新 Authorization 标头。

可视化

我们正在努力为 Parseable 控制台带来可视化,但在我们努力的同时,我们目前推荐我们的 Grafana 数据源插件。

如果您尚未安装 Grafana,请参阅使用 Prometheus 和 Grafana 进行多云监控和警报以进行裸机安装或在 Kubernetes 上部署 | Kubernetes 安装的Grafana 企业日志文档。如果您已经安装了 Grafana,则可以从Grafana Marketplace安装 Parseable 插件或使用以下grafana-cli命令:

grafana-cli plugins install parseable-datasource

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


pasted image 0 (6).png


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


Untitled (8).png
Untitled (9).png


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


Screenshot 2023-02-09 at 1.10.08 PM.png


结论

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

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

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

如果您对云原生日志记录有疑问,请加入我们的社区 Slack 频道


上一篇 下一篇