65.9K
CodeProject 正在变化。 阅读更多。
Home

将 OpenShift 和 Splunk 集成用于 Docker 容器日志记录

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2018 年 3 月 25 日

CPOL

5分钟阅读

viewsIcon

6603

如何在 Docker 容器编排环境中设置 OpenShift 以与 Splunk 集成进行日志记录。这些技术也可以轻松地应用于标准的 Kubernetes 安装!

Integrating OpenShift and Splunk for Docker Container Logging

在本文中,我将向您展示如何在 Docker 容器编排环境中设置 OpenShift 以与 Splunk 集成进行日志记录。

这些技术也可以轻松地应用于标准的 Kubernetes 安装!

Integrating OpenShift and Splunk for Docker Container Logging

本文使用的技术基于 Kubernetes 日志群集管理指南。我发现 Jason Poon 的文章 Kubernetes Logging with Splunk 也非常有帮助。

首先,克隆 Terraform AWS OpenShift 仓库

git clone git@github.com:dwmkerr/terraform-aws-openshift

此仓库可用于创建标准的 OpenShift 群集。我正在向该项目添加“配方”,允许您混合更多功能(但仍保持主代码库的清洁)。目前,让我们合并“splunk”配方

cd terraform-aws-openshift
git pull origin recipes/splunk

拉取此配方会添加设置 Splunk 所需的额外配置和脚本[1]

既然我们已经获取了代码,就可以开始着手了!

创建基础架构

要创建群集,您需要安装 AWS CLI 并登录,然后安装 Terraform

在继续之前,请注意:我们将在 AWS 上创建的机器每月运行成本约为 250 美元

Integrating OpenShift and Splunk for Docker Container Logging

使用 AWS CLI 登录后,只需运行

make infrastructure

系统会要求您指定一个区域

Integrating OpenShift and Splunk for Docker Container Logging

任何 AWS 区域 都可以正常工作,如果不确定,请使用 us-east-1

Terraform 构建所需基础架构大约需要 5 分钟,如下图所示

Integrating OpenShift and Splunk for Docker Container Logging

完成后,您将看到类似如下的消息

Integrating OpenShift and Splunk for Docker Container Logging

基础架构已准备就绪!一些最有用的参数将作为输出变量显示。如果您登录到 AWS,您将看到我们的新实例,以及 VPC、网络设置等。

Integrating OpenShift and Splunk for Docker Container Logging

安装 OpenShift

安装 OpenShift 非常简单

make openshift

此命令运行需要相当长的时间(有时长达 30 分钟)。完成后,您将看到类似如下的消息

Integrating OpenShift and Splunk for Docker Container Logging

您现在可以打开 OpenShift 控制台。使用主节点的公共地址(您可以使用 $(terraform output master-url) 获取),或者直接运行

make browse-openshift

默认用户名和密码是 admin123。您将看到我们有一个干净的安装,可以创建第一个项目了

Integrating OpenShift and Splunk for Docker Container Logging

暂时关闭控制台。

安装 Splunk

您可能已经猜到了这个模式……

make splunk

完成此命令后,您可以通过以下方式打开 Splunk 控制台

make browse-splunk

同样,用户名和密码是 admin123。您可以在登录时更改密码,也可以保留

Integrating OpenShift and Splunk for Docker Container Logging

您可以现在关闭 Splunk 控制台,我们稍后会回来。

演示 Splunk 和 OpenShift

要查看 Splunk 和 OpenShift 的实际运行情况,最好在群集中进行某种处理。您可以创建一个非常基本的示例项目,该项目将启动两个节点,它们每秒只写入一个计数器,以此作为运行一些东西的方法

make sample

这将创建一个简单的“counter”服务

Integrating OpenShift and Splunk for Docker Container Logging

我们可以在 OpenShift 中查看日志

Integrating OpenShift and Splunk for Docker Container Logging

几乎立即,您就可以在 Splunk 中看到数据了

Integrating OpenShift and Splunk for Docker Container Logging

由于日志文件的命名方式,我们甚至可以提取 namespacepodcontainerid

Integrating OpenShift and Splunk for Docker Container Logging

就是这样!您已经运行了 OpenShift,设置了 Splunk,并且可以自动转发所有容器日志。尽情享用!

工作原理

我尽量保持设置尽可能简单。它是这样工作的。

日志文件的写入方式

Docker Engine 有一个 日志驱动程序,它决定如何处理容器日志[2]。它默认使用 json-file 驱动程序,这意味着日志被写入为 JSON 文件到

/var/lib/docker/containers/{container-id}/{container-id}-json.log

或者从视觉上看

Integrating OpenShift and Splunk for Docker Container Logging

通常,我们不会修改此文件,理论上,它应该用于内部[1:1],并且我们会使用 docker logs <container-id>

理论上,我们只需要使用 Splunk Forwarder 将此文件发送到我们的索引器。唯一的问题是我们只能从文件名中获取容器 ID,要找到您容器的正确容器 ID 可能很麻烦。但是,我们在 Kubernetes 上运行,这意味着情况有所不同……

日志文件在 Kubernetes 上的写入方式

在 Kubernetes 上运行时,情况有所不同。在带有 systemd 的机器上,Docker Engine 的日志驱动程序设置为 journald(请参阅 Kubernetes - 日志架构)。

虽然可以将 journald 转发到 Splunk,但只能通过将其流式传输到文件,然后转发该文件。鉴于我们需要使用文件作为中间媒介,直接将驱动程序改回 json-file 并转发它似乎更简单。

因此,我们首先将 Docker Engine 配置为使用 json-file(请参阅 此文件

sed -i '/OPTIONS=.*/c\OPTIONS="--selinux-enabled 
--insecure-registry 172.30.0.0/16 --log-driver=json-file 
--log-opt max-size=1M --log-opt max-file=3"' /etc/sysconfig/docker

在这里,我们只需将选项更改为默认使用 json-file 驱动程序,最大文件大小为 1MB(最多三个文件,这样我们就不会耗尽主机上的所有空间)。

现在,Kubernetes 的酷之处在于它会为日志文件创建符号链接,这些符号链接具有更具描述性的名称

Integrating OpenShift and Splunk for Docker Container Logging

我们仍然拥有原始的容器日志,位于同一位置。但我们还有一个 pod 容器日志(它是容器日志的符号链接)以及另一个容器日志,它是 pod 容器日志的符号链接。

这意味着我们可以读取容器日志,并从文件名中提取一些非常有用的信息。容器日志文件的格式如下

/var/log/containers/{container-id}/{container-id}-json.log

日志文件的读取方式

现在我们已将日志文件写入了定义明确的位置,读取它们就很简单了。下图显示了我们如何使用 splunk-forwarder 来完成整个流程

Integrating OpenShift and Splunk for Docker Container Logging

首先,我们创建一个 DaemonSet,它确保我们在每个节点上运行一个特定的 pod。

DaemonSet 以一个具有“any id”特权的新帐户运行,允许它以 root 身份运行。然后我们将日志文件夹挂载到容器中(这些文件夹归 root 所有,这就是为什么我们的容器需要这些额外的权限来读取文件)。

该 pod 包含一个 splunk-forwarder 容器,该容器配置为监视 /var/log/containers 文件夹。它还监视 Docker 套接字,使我们能够看到 Docker 事件。Forwarder 还配置了 Splunk Indexer 的 IP 地址。

脚注

  1. 作为参考,您还可以查看配方 pull 请求,了解从“标准”安装到添加 Splunk 的更改:Splunk Recipe Pull Request ↩︎ ↩︎

  2. 检查 Docker 的日志驱动程序文档很有用。请参阅 Configure Logging DriversDocker Log Driver Plugins。可以创建自定义日志驱动程序。但是,在撰写本文时,只有 journald 和 json-file 日志驱动程序才能与 OpenShift 中的集成日志视图一起使用。↩︎

© . All rights reserved.