我是靠谱客的博主 危机电话,这篇文章主要介绍运用 Elastic Stack 收集 docker 容器日志安装从 Kibana 中查看容器日志,现在分享给大家,希望可以做个参考。

Elastic Stack 在收集日志方面有很多的方面的应用。在今天的文章中,我将使用 docker 来安装 Elastic Stack。我将演示如何使用 docker 安装 Filebeat 并收集容器的日志。

在我之前的文章 “Beats:为 Filebeat 配置 inputs”,我展示了如何使用 Filebeat 来收集 container 里的日志数据。在那篇文章中,Filebeat 的安装并不是 docker 安装的。在我的另外一篇文章 “Beats:在 Docker 里运行 Filebeat” 里,我详细地描述了如何使用 docker 来安装 Filebeat。在今天的展示中,我们的安装和那篇文章的安装有些相似。我们使用最新的 Elastic Stack 8.4.3 来进行展示。

我们使用的架构如上所示。在左边的 macOS 机器中,我们使用 docker-compose 来安装 Elasticsearch 及 Kibana,而在右边的 Ubuntu OS 机器中,我们将安装 Fiilebeat 和 Nginx。它们都是以 docker 的形式来进行部署的。我们将使用 Filebeat 来收集 Nginx 及 Filebeat 里的容器日志。

安装

Elasticsearch 及 Kibana

由于采取 docker-compose 的方式来进行部署,我们可以参考之前的文章 “Elasticsearch:使用 Docker compose 来一键部署 Elastic Stack 8.x”。由于我们只想部署一个节点的 Elasticsearch 集群,我们可以参考文章  “Elasticsearch:使用向量搜索来搜索图片及文字” 来部署单节点的 Elasticsearch 集群。为此,我们创建一个目录,并在该目录中创建如下的两个文件:

复制代码
1
2
3
4
5
6
7
8
$ pwd /Users/liuxg/data/containers $ ls -al total 24 drwxr-xr-x 4 liuxg staff 128 Oct 11 08:19 . drwxr-xr-x 164 liuxg staff 5248 Oct 11 08:48 .. -rw-r--r-- 1 liuxg staff 736 Oct 11 09:22 .env -rw-r--r-- 1 liuxg staff 4599 Oct 11 09:19 docker-compose.yml

其中 .env 文件的内容如下:

.env

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# Password for the 'elastic' user (at least 6 characters) ELASTIC_PASSWORD='changeme' # Password for the 'kibana_system' user (at least 6 characters) KIBANA_PASSWORD='changeme' # Version of Elastic products STACK_VERSION=8.4.3 # Set the cluster name CLUSTER_NAME=container_logs # Set to 'basic' or 'trial' to automatically start the 30-day trial LICENSE=basic #LICENSE=trial # Port to expose Elasticsearch HTTP API to the host ES_PORT=9200 #ES_PORT=127.0.0.1:9200 # Port to expose Kibana to the host KIBANA_PORT=5601 #KIBANA_PORT=80 # Increase or decrease based on the available host memory (in bytes) MEM_LIMIT=21474836480 # Project namespace (defaults to the current folder name if not set) COMPOSE_PROJECT_NAME=container_logs

在上面,我们定义 Elasticsearch 集群的密码已经 Elastic Stack 的版本。这个可以根据自己的要求进行修改。docker-compose.yml 的内容如下:

docker-compose.yml

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
version: "2.2" services: setup: image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION} volumes: - certs:/usr/share/elasticsearch/config/certs user: "0" command: > bash -c ' if [ x${ELASTIC_PASSWORD} == x ]; then echo "Set the ELASTIC_PASSWORD environment variable in the .env file"; exit 1; elif [ x${KIBANA_PASSWORD} == x ]; then echo "Set the KIBANA_PASSWORD environment variable in the .env file"; exit 1; fi; if [ ! -f config/certs/ca.zip ]; then echo "Creating CA"; bin/elasticsearch-certutil ca --silent --pem -out config/certs/ca.zip; unzip config/certs/ca.zip -d config/certs; fi; if [ ! -f config/certs/certs.zip ]; then echo "Creating certs"; echo -ne "instances:n" " - name: es01n" " dns:n" " - es01n" " - localhostn" " ip:n" " - 127.0.0.1n" > config/certs/instances.yml; bin/elasticsearch-certutil cert --silent --pem -out config/certs/certs.zip --in config/certs/instances.yml --ca-cert config/certs/ca/ca.crt --ca-key config/certs/ca/ca.key; unzip config/certs/certs.zip -d config/certs; fi; echo "Setting file permissions" chown -R root:root config/certs; find . -type d -exec chmod 750 {} ;; find . -type f -exec chmod 640 {} ;; echo "Waiting for Elasticsearch availability"; until curl -s --cacert config/certs/ca/ca.crt https://es01:9200 | grep -q "missing authentication credentials"; do sleep 30; done; echo "Setting kibana_system password"; until curl -s -X POST --cacert config/certs/ca/ca.crt -u elastic:${ELASTIC_PASSWORD} -H "Content-Type: application/json" https://es01:9200/_security/user/kibana_system/_password -d "{"password":"${KIBANA_PASSWORD}"}" | grep -q "^{}"; do sleep 10; done; echo "All done!"; ' healthcheck: test: ["CMD-SHELL", "[ -f config/certs/es01/es01.crt ]"] interval: 1s timeout: 5s retries: 120 es01: depends_on: setup: condition: service_healthy image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION} volumes: - certs:/usr/share/elasticsearch/config/certs - esdata01:/usr/share/elasticsearch/data ports: - ${ES_PORT}:9200 environment: - node.name=es01 - cluster.name=${CLUSTER_NAME} - cluster.initial_master_nodes=es01 - ELASTIC_PASSWORD=${ELASTIC_PASSWORD} - bootstrap.memory_lock=true - xpack.security.enabled=true - xpack.security.http.ssl.enabled=true - xpack.security.http.ssl.key=certs/es01/es01.key - xpack.security.http.ssl.certificate=certs/es01/es01.crt - xpack.security.http.ssl.certificate_authorities=certs/ca/ca.crt - xpack.security.http.ssl.verification_mode=certificate - xpack.security.transport.ssl.enabled=true - xpack.security.transport.ssl.key=certs/es01/es01.key - xpack.security.transport.ssl.certificate=certs/es01/es01.crt - xpack.security.transport.ssl.certificate_authorities=certs/ca/ca.crt - xpack.security.transport.ssl.verification_mode=certificate - xpack.license.self_generated.type=${LICENSE} mem_limit: ${MEM_LIMIT} ulimits: memlock: soft: -1 hard: -1 healthcheck: test: [ "CMD-SHELL", "curl -s --cacert config/certs/ca/ca.crt https://localhost:9200 | grep -q 'missing authentication credentials'", ] interval: 10s timeout: 10s retries: 120 kibana: depends_on: es01: condition: service_healthy image: docker.elastic.co/kibana/kibana:${STACK_VERSION} volumes: - certs:/usr/share/kibana/config/certs - kibanadata:/usr/share/kibana/data ports: - ${KIBANA_PORT}:5601 environment: - SERVERNAME=kibana - ELASTICSEARCH_HOSTS=https://es01:9200 - ELASTICSEARCH_USERNAME=kibana_system - ELASTICSEARCH_PASSWORD=${KIBANA_PASSWORD} - ELASTICSEARCH_SSL_CERTIFICATEAUTHORITIES=config/certs/ca/ca.crt mem_limit: ${MEM_LIMIT} healthcheck: test: [ "CMD-SHELL", "curl -s -I http://localhost:5601 | grep -q 'HTTP/1.1 302 Found'", ] interval: 10s timeout: 10s retries: 120 volumes: certs: driver: local esdata01: driver: local kibanadata: driver: local

上面是一个单节点的 Elasticsearch 集群。我们可以使用如下的命令来进行部署:

复制代码
1
docker-compose up

我们可以使用如下的命令来进行查看正在运行的容器:

复制代码
1
docker ps
复制代码
1
2
3
4
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d2439bcaf1d5 docker.elastic.co/kibana/kibana:8.4.3 "/bin/tini -- /usr/l…" 4 hours ago Up 4 hours (healthy) 0.0.0.0:5601->5601/tcp container_logs-kibana-1 24026fc580a2 docker.elastic.co/elasticsearch/elasticsearch:8.4.3 "/bin/tini -- /usr/l…" 4 hours ago Up 4 hours (healthy) 0.0.0.0:9200->9200/tcp, 9300/tcp container_logs-es01-1

等 Elasticsearch 及 Kibana 都安装好后,我们使用如下的命令来查看 Elasticsearch 是否已经运行起来了:

复制代码
1
curl -k -u elastic:changeme https://192.168.0.3:9200
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ curl -k -u elastic:changeme https://192.168.0.3:9200 { "name" : "es01", "cluster_name" : "container_logs", "cluster_uuid" : "dndqcPI3RfOeZwVd4Ak8iQ", "version" : { "number" : "8.4.3", "build_flavor" : "default", "build_type" : "docker", "build_hash" : "42f05b9372a9a4a470db3b52817899b99a76ee73", "build_date" : "2022-10-04T07:17:24.662462378Z", "build_snapshot" : false, "lucene_version" : "9.3.0", "minimum_wire_compatibility_version" : "7.17.0", "minimum_index_compatibility_version" : "7.0.0" }, "tagline" : "You Know, for Search" }

我们可以在 macOS 的电脑上,使用 elastic/changeme 来进行登录。如果我能进行登录,它表明我们的安装是成功的。

Nginx

我们接下来在 Ubuntu OS 上使用 docker 来安装 Nginx。如果你在 Ubuntu OS 上还没有安装好 docker,你可以参考链接 How to install Docker on Ubuntu 22.04 | 20.04 - Tutorials and How To - CloudCone 来进行安装。我们运行如下的命令安装 Nginx:

复制代码
1
2
docker run -d -p 8080:80 --name nginx nginx

我们可以使用如下的命令来查看 Nginx 的日志:

我们可以使用如下的命令来查看网页:

 

我们可以使用上面的命令 curl localhost:8080 来访问 web 服务器。我们可以在 Nginx 的屏幕上看一个多出来的日志:

 我们接下来安装 Filebeat 来把上面的日志添加到 Elasticsearch 中。

Filebeat

Filebeat 的安装也按照 docker 的方式来进行安装。我们可以参考之前的文章 “Beats:在 Docker 里运行 Filebeat”。我们首先按照如下的命令来进行安装。参考官方链接 Run Filebeat on Docker | Filebeat Reference [8.4] | Elastic。使用 setup 命令运行 Filebeat 将创建索引模式并加载可视化、仪表板和机器学习作业。

我们使用如下的命令来下拉镜像:

复制代码
1
docker pull docker.elastic.co/beats/filebeat:8.4.3

我们接下来运行 Filebeat setup。在进行下面的工作之前,我们需要把 Elasticsearch 配置的证书拷贝过来。我们在 macOS 机器的 terminal 中打入如下的命令:

复制代码
1
2
3
4
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d2439bcaf1d5 docker.elastic.co/kibana/kibana:8.4.3 "/bin/tini -- /usr/l…" 6 hours ago Up 6 hours (healthy) 0.0.0.0:5601->5601/tcp container_logs-kibana-1 24026fc580a2 docker.elastic.co/elasticsearch/elasticsearch:8.4.3 "/bin/tini -- /usr/l…" 6 hours ago Up 6 hours (healthy) 0.0.0.0:9200->9200/tcp, 9300/tcp container_logs-es01-1

 上面显示正在运行的 container。我们使用如下的命令来登录 Elasticsearch 的容器 container_logs-es01-1:

复制代码
1
docker exec -it container_logs-es01-1 /bin/bash

 我们可以使用如下的命令来把上面显示的 ca.crt 文件拷贝出来:

复制代码
1
docker cp container_logs-es01-1:/usr/share/elasticsearch/config/certs/ca/ca.crt .
复制代码
1
2
3
4
5
$ pwd /Users/liuxg/data/containers $ docker cp container_logs-es01-1:/usr/share/elasticsearch/config/certs/ca/ca.crt . $ ls ca.crt docker-compose.yml

我们可以使用 scp 命令把上面的 ca.crt 文件拷贝到 Ubunut OS 机器的一个目录中,比如 /home/parallels/filebeat:

复制代码
1
2
3
4
parallels@liuxg:~/filebeat$ pwd /home/parallels/filebeat parallels@liuxg:~/filebeat$ ls ca.crt

我们接下来参考文章 “Elastic Stack 8.0 安装 - 保护你的 Elastic Stack 现在比以往任何时候都简单” 中对 Beats 配置的要求:

我们在 Ubuntu OS 的 terminal 中使用如下的命令:

复制代码
1
2
3
4
5
6
7
8
9
docker run -v "$(pwd)/ca.crt":"/usr/share/filebeat/ca.crt" docker.elastic.co/beats/filebeat:8.4.3 setup -E setup.kibana.host="192.168.0.3:5601" -E output.elasticsearch.hosts=["192.168.0.3:9200"] -E output.elasticsearch.protocol="https" -E output.elasticsearch.username="elastic" -E output.elasticsearch.password="changeme" -E output.elasticsearch.ssl.certificate_authorities=["/usr/share/filebeat/ca.crt"]

接下来,我们来按照 Run Filebeat on Docker | Filebeat Reference [8.4] | Elastic 链接,下载如下的一个例子 filebeat.yml 文件:

复制代码
1
curl -L -O https://raw.githubusercontent.com/elastic/beats/8.4/deploy/docker/filebeat.docker.yml

这样我们的当前目录下的文件如下:

复制代码
1
2
3
4
parallels@liuxg:~/filebeat$ pwd /home/parallels/filebeat parallels@liuxg:~/filebeat$ ls ca.crt filebeat.docker.yml

我们接下来配置 filebeat.docker.yml 文件。它的内容非常简单:

filebeat.docker.yml

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
filebeat.config: modules: path: ${path.config}/modules.d/*.yml reload.enabled: false filebeat.autodiscover: providers: - type: docker hints.enabled: true processors: - add_cloud_metadata: ~ output.elasticsearch: hosts: '${ELASTICSEARCH_HOSTS:elasticsearch:9200}' username: '${ELASTICSEARCH_USERNAME:}' password: '${ELASTICSEARCH_PASSWORD:}'

根据我们的配置,我们需要做如下的调整:

filebeat.docker.yml

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
filebeat.config: modules: path: ${path.config}/modules.d/*.yml reload.enabled: false filebeat.autodiscover: providers: - type: docker hints.enabled: true processors: - add_cloud_metadata: ~ output.elasticsearch: hosts: '${ELASTICSEARCH_HOSTS:192.168.0.3:9200}' protocol: "https" username: 'elastic' password: 'changeme' ssl.certificate_authorities: ["/usr/share/filebeat/ca.crt"]

请注意上面的 certificate_authorities 里的证书配置。这个是需要我们在运行命令式拷贝到 container 里的。 Autodiscover 允许你跟踪它们并在发生变化时调整设置。 通过定义配置模板,自动发现子系统可以在服务开始运行时对其进行监控。也就是说它可以自动帮我们查找 Filebeat 及 Nginx 的日志,而不需要我们都为它们去分别配置。

我们使用如下的命令:

复制代码
1
2
3
4
5
6
7
8
docker run -d --name=filebeat --user=root --volume="$(pwd)/filebeat.docker.yml:/usr/share/filebeat/filebeat.yml:ro" --volume="/var/lib/docker/containers:/var/lib/docker/containers:ro" --volume="/var/run/docker.sock:/var/run/docker.sock:ro" -v "$(pwd)/ca.crt":"/usr/share/filebeat/ca.crt" docker.elastic.co/beats/filebeat:8.4.3 filebeat -e --strict.perms=false

在上面,相比之前的 setup 指令,我们省去了 output.elasticsearch 的配置,这是因为我们已经在 filbeat.docker.yml 文件里已经配置好了。我们运行上面的命令:

 

我们可以看到两个 docker 正在运行。它表明我们的 docker 启动是正常的。

从 Kibana 中查看容器日志

我们接下来去 Kibana 中查看我们在 Ubuntu OS 中的容器 filebeat 及 nginx 的日志信息:

 

在上面,我们可以看到共有 64 个日志信息。我们可以通过搜索来分别查看 nginx 和 filebeat 的日志:

 

我们点击上面的链接来展开 nginx 的日志:

 

我们可以在 macOS 的机器的 terminal 中打入如下的命令:

复制代码
1
curl http://192.168.0.8:8080

 

上面的命令将为 nginx 容器生成一个日志。我捎等一会儿,再到 Kibana 中进行查看:

 

相比之前的截图,我们可以看到一条新增加的日志信息。点击上面的展开链接:

 

我们可以清楚地看到这个请求是从 macOS 的机器发出来的。

同样地,我们可以查看从 filebeat 容器发出的日志:

 

这些个日志和我们在 terminal 中打入如下的命令的结果是一样的:

复制代码
1
docker logs -f nginx

 

复制代码
1
docker logs -f filebeat

 

好了,今天的分享就到这里。希望大家学到知识了! 

最后

以上就是危机电话最近收集整理的关于运用 Elastic Stack 收集 docker 容器日志安装从 Kibana 中查看容器日志的全部内容,更多相关运用内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(73)

评论列表共有 0 条评论

立即
投稿
返回
顶部