实用技能 使用Docker部署ELK

通过优锐课的java学习分享中,在本教程中,我们将了解如何使用这些工具来收集日志并通过Elasticsearch + Logstash + Kibana(又名ELK)对其进行管理。

java面试必备之JVM+GC教程

开发网络应用程序时,我喜欢参考十二要素应用程序建议。 他们处理应用程序日志的方法在第十一条“命令”中:
它不应尝试写入或管理日志文件。 而是,每个正在运行的进程将其未缓冲的事件流写入stdout。

似乎Docker的人们也阅读了此宣言,从而为我们提供了出色的工具来管理容器中应用程序生成的日志。 在本教程中,我们将了解如何使用这些工具来收集日志并通过Elasticsearch + Logstash + Kibana(又名ELK)对其进行管理。

你将学到什么

在这篇文章中,我将介绍:

ELK的简要说明。
如何在Exoscale帐户上创建所需的计算机:一台用于承载ELK堆栈,另一台用于承载演示Web应用程序。
如何使用Docker compose启动ELK。
如何使用Docker日志记录驱动程序将Web应用程序日志路由到ELK。

先决条件
Mac用户:您将需要最新的Docker工具箱。
Linux用户:您将需要Docker引擎,机器和组成。

在这两个系统上,您都需要安装Exoscale的CS工具,您可以使用Python生态系统的pip来获取它:

pip install cs

我们将使用docker-machine在Exoscale上创建所需的实例,然后使用CS修改安全组以允许连接到我们新安装的ELK堆栈。

cs和docker-machine都依赖于Exoscale API,因此他们将需要访问您的API凭据。
使用以下命令导出您外壳程序中的凭据:

export EXOSCALE_ACCOUNT_EMAIL=<your exoscale account email>
export CLOUDSTACK_ENDPOINT=https://api.exoscale.ch/compute
export CLOUDSTACK_KEY="<your exoscale API Key>"
export CLOUDSTACK_SECRET_KEY="<your exoscale Secret Key>"

最后,您需要一些我在git repo中提供的文件。 在本地克隆它:

git clone https://github.com/MBuffenoir/elk.git
cd elk

首先,什么是ELK?

ELK是由Elastic.co维护的开源工具的集合,该工具结合了以下内容:
Elasticsearch:我们将用于存储日志的索引器和搜索引擎。
Logstash:收集并解析日志,然后将其存储在Elasticsearch索引中的工具。
Kibana:一种工具,可查询Elasticsearch REST API以获取我们的数据,并有助于创建有洞察力的可视化效果。

创建实例

让我们使用docker-machine在Exoscale上创建一个将托管ELK的Ubuntu实例:

docker-machine create --driver exoscale \
    --exoscale-api-key $CLOUDSTACK_KEY \
    --exoscale-api-secret-key $CLOUDSTACK_SECRET_KEY \
    --exoscale-instance-profile small \
    --exoscale-disk-size 10 \
    --exoscale-security-group elk \
    elk
    

这将花费一些时间来运行,并且将为您提供类似于以下结果:

Running pre-create checks...
Creating machine...
(elk) Querying exoscale for the requested parameters...
(elk) Security group elk does not exist, create it
[...]
Setting Docker configuration on the remote daemon...
Checking connection to Docker...
Docker is up and running!

对于本演示,我主要使用默认参数,但是当然,您可以根据需要自定义此参数。 查看驱动程序文档以了解更多信息。 您还可以稍后扩展实例(通过Web界面手动或使用CS和Exoscale API手动扩展)。

此时,您应该能够使用以下命令连接到远程Docker守护程序:
eval $(docker-machine env elk)

让我们确保一切正常:

docker version
docker info

现在,让我们创建第二台计算机,在该计算机上运行演示应用程序:

docker-machine create --driver exoscale \
    --exoscale-api-key $CLOUDSTACK_KEY \
    --exoscale-api-secret-key $CLOUDSTACK_SECRET_KEY \
    --exoscale-instance-profile tiny \
    --exoscale-disk-size 10 \
    --exoscale-security-group demo \
    demo

docker-machine已经打开了所有必需的端口,供您连接到新的远程Docker守护程序。 您可以在新创建的麋鹿安全组中查看这些端口。

现在,您需要打开访问正在运行的应用程序并使它们相互通信所需的端口。
让我们使用cs来做到这一点。 我们首先打开端口以连接到Kibana:

cs authorizeSecurityGroupIngress protocol=TCP startPort=5600 endPort=5600 securityGroupName=elk cidrList=0.0.0.0/0

现在,让我们的应用程序将其日志发送到Logstash:

cs authorizeSecurityGroupIngress protocol=UDP startPort=5000 endPort=5000 securityGroupName=elk 'usersecuritygrouplist[0].account'=$EXOSCALE_ACCOUNT_EMAIL 'usersecuritygrouplist[0].group'=demo

最后,我们将打开演示Web服务器的端口80:

cs authorizeSecurityGroupIngress protocol=TCP startPort=80 endPort=80 securityGroupName=demo cidrList=0.0.0.0/0

启动ELK

现在我们的实例和安全组已准备就绪,可以启动ELK了。
首先,您将需要上传ELK所需的配置文件。 我们将这样做:

docker-machine scp -r conf-files/ elk:

请注意,此处使用的证书是自签名的。 如果愿意,可以用以下方法替换或重新生成它:

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ./kibana-cert.key -out ./kibana-cert.crt

现在,您可以连接到远程Docker守护程序,并使用以下命令启动ELK:


eval $(docker-machine env elk)
docker-compose -f docker-compose-ubuntu.yml up -d

享受出色完成的工作的美妙之处:

docker-compose -f docker-compose-ubuntu.yml ps

哪个应该给您类似于此的输出:
Name Command State Ports

elasticdata     /docker-entrypoint.sh chow ...   Exit 0
elasticsearch   /docker-entrypoint.sh elas ...   Up       9200/tcp, 9300/tcp
kibana          /docker-entrypoint.sh kibana     Up       5601/tcp
logstash        /docker-entrypoint.sh -f / ...   Up       0.0.0.0:5000->5000/udp
proxyelk        nginx -g daemon off;             Up       443/tcp, 0.0.0.0:5600->5600/tcp, 80/tcp

你可以在此处看到构成ELK堆栈的三个应用程序和用于保护它们的反向NGINX代理。
运行演示Web服务器并将其日志发送到ELK

让我们再次使用Docker运行一个简单的NGINX Web服务器,该服务器将模拟典型的Web应用程序:

eval $(docker-machine env demo)
docker run -d --name nginx-with-syslog --log-driver=syslog --log-opt syslog-address=udp://$(docker-machine ip elk):5000 -p 80:80 nginx:alpine

使用以下命令确保您的Web服务器正常运行:

docker ps

使用您喜欢的Web浏览器或使用curl连接到它:

curl http://$(docker-machine ip demo)

使用Kibana查看日志
现在是您一直在等待的时刻!
浏览到您的ELK安装:https:// <elk实例ip>:5600
默认的用户名和密码为admin / Kibana05。
由于这是您第一次连接到它,因此将需要几秒钟来进行设置。
准备就绪后,点击绿色的创建按钮,然后点击发现标签来创建第一个索引。 现在,您应该能够看到您的NGINX演示Web服务器的日志:

结论
在这里,我们已经看到了使用ELK和Docker收集日志的最低要求。
下一步可能是增强Logstash配置,以检测日志中的特殊字段,还可能删减一些敏感信息,并且当然要在Kibana中创建漂亮的可视化文件。 我们可以再来看一次。
完美收集日志!

喜欢这篇文章的可以点个赞,欢迎大家留言评论,记得关注我,每天持续更新技术干货、职场趣事、海量面试资料等等
如果你对java技术很感兴趣也可以+ qq群:907135806 交流学习,共同学习进步。
不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代

文章写道这里,欢迎完善交流。最后奉上近期整理出来的一套完整的java架构思维导图,分享给大家对照知识点参考学习。有更多JVM、Mysql、Tomcat、Spring Boot、Spring Cloud、Zookeeper、Kafka、RabbitMQ、RockerMQ、Redis、ELK、Git等Java干货加vx:ddmsiqi 领取啦
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章