• 运用 Elastic Stack 收集 docker 容器日志


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

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

    .env

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

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

    docker-compose.yml

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

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

    docker-compose up

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

    docker ps
    1. $ docker ps
    2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    3. 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
    4. 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 是否已经运行起来了:

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

    我们可以在 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:

    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 将创建索引模式并加载可视化、仪表板和机器学习作业。

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

    docker pull docker.elastic.co/beats/filebeat:8.4.3

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

    1. $ docker ps
    2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    3. 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
    4. 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:

    docker exec -it container_logs-es01-1 /bin/bash

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

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

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

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

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

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

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

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

    curl -L -O https://raw.githubusercontent.com/elastic/beats/8.4/deploy/docker/filebeat.docker.yml

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

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

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

    filebeat.docker.yml

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

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

    filebeat.docker.yml

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

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

    我们使用如下的命令:

    1. docker run -d \
    2. --name=filebeat \
    3. --user=root \
    4. --volume="$(pwd)/filebeat.docker.yml:/usr/share/filebeat/filebeat.yml:ro" \
    5. --volume="/var/lib/docker/containers:/var/lib/docker/containers:ro" \
    6. --volume="/var/run/docker.sock:/var/run/docker.sock:ro" \
    7. -v "$(pwd)/ca.crt":"/usr/share/filebeat/ca.crt" \
    8. 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 中打入如下的命令:

    curl http://192.168.0.8:8080

     

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

     

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

     

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

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

     

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

    docker logs -f nginx

     

    docker logs -f filebeat

     

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

  • 相关阅读:
    为什么推荐软件比自己动手更好?使用推荐软件的好处
    C和指针 第15章 输入/输出函数 15.10 格式化的行I/O
    car audio service详解
    设计一:51单片机流水灯控制
    使用 System.exit() 来优雅地终止 Spring Boot 项目
    数论——快速幂
    学习C语言第十五天
    SQL union ALL用法
    Spring+SpringMVC+Mybatis(开发必备技能)01、基础idea环境配置
    机器学习-数值特征
  • 原文地址:https://blog.csdn.net/UbuntuTouch/article/details/127264517