首页 理论教育 Swarm集群内容器的日志转发:微服务运维实战

Swarm集群内容器的日志转发:微服务运维实战

时间:2023-11-06 理论教育 版权反馈
【摘要】:可以利用名为logspout的项目来发送所有容器中的日志LogSpout是在Docker中运行的Docker容器的日志路由器。由于我们希望将其转发给已经连接到elk网络的LogStash,所以也应该将LogSpout接入同一网络。该服务需要知道目的地是名为logstash的服务,并且logstash监听51415端口。最后,LogSpout的一个要求是主机的Docker套接字要连接在服务容器内,LogSpout将用其监控日志。这已经是集群中使用API的第二个产品。现在来测试logspout服务是否确实将所有日志发送到了LogStash。

Swarm集群内容器的日志转发:微服务运维实战

不管日志在哪里运行,如何转发所有容器中的日志?一种可能的解决方案是配置日志驱动程序(https://docs.docker.com/engine/admin/logging/overview/)。可以使用--log-driver参数为每个服务指定一个驱动程序。该驱动程序可以是syslog或任何其他支持的选项。这会解决我们的日志传送问题。但为每个服务都配置参数是枯燥的,更重要的是,我们可能很容易忘记给某一两个服务指定参数,只有在遇到问题并需要日志之后才发现这个疏忽。让我们看看是否有另一种方法来实现相同的结果。

可以在每个节点上指定一个日志驱动程序作为Docker守护进程的配置选项。这肯定会让设置更加容易,毕竟,服务器的数量会比服务的数量少。如果要选择是在创建服务时设置驱动还是将驱动作为守护进程的配置,那么我会选择后者。但是,我们要设法在不改变默认守护进程配置的情况下达到目标,我们更希望能够继续工作而不涉及任何特殊的配置工具。幸运的是,我们还有别的选择。

可以利用名为logspout的项目来发送所有容器中的日志(https://github.com/ gliderlabs/logspout)

LogSpout是在Docker中运行的Docker容器的日志路由器。它会连接主机上的所有容器,然后在任何我们想要的地方路由容器的日志,它也有一个可扩展的模块系统。这是一个几乎无状态的日志工具。它不是用来管理日志文件或查看历史记录,它只是一个工具,让你的日志出现在该出现的地方。

如果你阅读项目文档,就会发现里面没有关于如何将其作为Docker服务运行的说明。不过这不重要,因为到目前为止,你可以把自己当成创建服务的专家。

一个服务需要提供什么样的能力才能够转发集群内全部节点上所有容器中的日志呢?由于我们希望将其转发给已经连接到elk网络的LogStash,所以也应该将LogSpout接入同一网络。我们需要该服务从所有节点发送日志,因此它应该是全局的。该服务需要知道目的地是名为logstash的服务,并且logstash监听51415端口。最后,LogSpout的一个要求是主机的Docker套接字要连接在服务容器内,LogSpout将用其监控日志。

创建满足所有这些目标和要求的服务的命令如下。

给Windows用户的说明

为了能够让以下命令中的mount参数正常工作,你需要阻止Git Bash修改文件系统路径。设置环境变量

我们创建了一个名为logspout的服务,将它连接到elk网络,设置为全局服务,并挂载Docker套接字。容器创建后会执行的命令是syslog://logstash:51415,这告诉了LogSpout我们想要使用syslog协议将日志发送到在端口51415上运行的logstash。

该项目是Docker Remote API用途的一个例子。logspout容器将使用API来获取所有当前正在运行的容器的列表并流式传输其日志。这已经是集群中使用API的第二个产品(第一个是Docker Flow Swarm Listener(https://github.com/vfarcic/ docker-flow-swarm-listener))。

让我们看看刚创建的服务的状态:(www.xing528.com)

输出如下(为简洁起见,删除了IDs和ERROR PORTS列):

该服务以全局模式运行,因此每个节点内都有一个实例。

现在来测试logspout服务是否确实将所有日志发送到了LogStash。所要做的就是创建一个服务来生成一些日志,并从LogStash的输出中观察它们。可以使用registry来测试到目前为止所做的设置:

在检查LogStash日志之前,应该等到registry运行:

如果当前状态仍未运行,请稍等片刻。

现在可以查看logstash日志,并确认logspout把由registry生成的日志条目发送给了它:

输出中的一个条目如下所示:

和之前使用logger测试LogStash输入时一样,我们看到了消息、时间戳、主机和其他一些syslog字段,还得到了保存生成日志的容器ID的logsource以及保存容器名称的program。在排查哪个服务和容器产生错误时,两者都会很有用。

如果回头看我们用来创建logstash服务的命令,你会注意到环境变量LOGSPOUT=ignore。它告诉LogSpout要忽略该服务,或者更确切地说,构成该服务的所有容器(的日志)。如果没有定义它,LogSpout会将所有logstash日志转发到logstash,从而产生一个无限循环。正如我们已经讨论过的,在生产中不应该将LogStash条目输出到stdout。我们只是为了更好地理解它是如何工作的。如果将stdout输出从logstash配置中移除,则不需要环境变量LOGSPOUT=ignore。logstash日志也将存储在ElasticSearch中。

现在将所有日志发送到了LogStash,然后再到ElasticSearch,接下来将探讨如何查看日志。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈