运用 Elastic Stack 收集 docker 容器日志

这篇具有很好参考价值的文章主要介绍了运用 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 来进行展示。

运用 Elastic Stack 收集 docker 容器日志

运用 Elastic Stack 收集 docker 容器日志

我们使用的架构如上所示。在左边的 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 集群。为此,我们创建一个目录,并在该目录中创建如下的两个文件:

$ 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

# 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

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: es01\n"\
          "    dns:\n"\
          "      - es01\n"\
          "      - localhost\n"\
          "    ip:\n"\
          "      - 127.0.0.1\n"\
          > 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 集群。我们可以使用如下的命令来进行部署:

docker-compose up

运用 Elastic Stack 收集 docker 容器日志

运用 Elastic Stack 收集 docker 容器日志

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

docker ps
$ 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 是否已经运行起来了:

curl -k -u elastic:changeme https://192.168.0.3:9200
$ 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"
}

运用 Elastic Stack 收集 docker 容器日志

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

运用 Elastic Stack 收集 docker 容器日志

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

 运用 Elastic Stack 收集 docker 容器日志

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

运用 Elastic Stack 收集 docker 容器日志

 我们接下来安装 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

运用 Elastic Stack 收集 docker 容器日志

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

$ 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:

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

运用 Elastic Stack 收集 docker 容器日志

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

docker cp container_logs-es01-1:/usr/share/elasticsearch/config/certs/ca/ca.crt .
$ 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:

parallels@liuxg:~/filebeat$ pwd
/home/parallels/filebeat
parallels@liuxg:~/filebeat$ ls
ca.crt

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

运用 Elastic Stack 收集 docker 容器日志

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

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"]

运用 Elastic Stack 收集 docker 容器日志

接下来,我们来按照 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

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

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

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

filebeat.docker.yml

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

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 的日志,而不需要我们都为它们去分别配置。

我们使用如下的命令:

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 文件里已经配置好了。我们运行上面的命令:

运用 Elastic Stack 收集 docker 容器日志 

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

从 Kibana 中查看容器日志

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

运用 Elastic Stack 收集 docker 容器日志

运用 Elastic Stack 收集 docker 容器日志 

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

运用 Elastic Stack 收集 docker 容器日志 

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

运用 Elastic Stack 收集 docker 容器日志 

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

curl http://192.168.0.8:8080

运用 Elastic Stack 收集 docker 容器日志 

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

运用 Elastic Stack 收集 docker 容器日志 

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

运用 Elastic Stack 收集 docker 容器日志 

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

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

运用 Elastic Stack 收集 docker 容器日志 

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

docker logs -f nginx

 运用 Elastic Stack 收集 docker 容器日志

docker logs -f filebeat

运用 Elastic Stack 收集 docker 容器日志 

好了,今天的分享就到这里。希望大家学到知识了! 文章来源地址https://www.toymoban.com/news/detail-405002.html

到了这里,关于运用 Elastic Stack 收集 docker 容器日志的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Elastic Stack 和 Docker-Compose 入门

    作者:Eddie Mitchell 随着 Elastic Stack 多年来的发展和功能集的增加,在本地开始或尝试概念验证 (POC) 的复杂性也越来越高。 虽然 Elastic Cloud 仍然是开始使用 Elastic 最快、最简单的方式,但对本地开发和测试的需求仍然非常丰富。 作为开发人员,我们被吸引到快速设置和快速开

    2024年02月07日
    浏览(44)
  • Elastic Stack 和 Docker Compose 入门:第 2 部分

    作者:Eddie Mitchell 欢迎阅读 Elastic® Stack 和 Docker Compose 入门的第二部分。 在第一部分博客中,我们了解了 Docker Compose 的基础知识以及如何将单节点集群建立为本地游乐场,其中包括 Elasticsearch®、Kibana®、Logstash®、Metricbeat 和 Filebeat。 如果你还没有阅读第一篇博客,你可能需

    2024年02月07日
    浏览(26)
  • Elasticsearch:使用 Docker-Compose 启动单节点 Elastic Stack

    首先必须指出的是,在我之前的文章 “Elasticsearch:使用 Docker compose 来一键部署 Elastic Stack 8.x”,我有详述根据官方文档如何创建一个带有三个节点的安全 Elasticsearch 集群。本文基于著名的 Deviatony 存储库和 Elastic 的官方说明。 建议先通读这些说明,如果你已经可以根据这些

    2024年02月05日
    浏览(53)
  • k8s容器日志收集方案

        log-pilot安装            

    2024年02月16日
    浏览(28)
  • K8S:容器日志收集与管理

    Kubernetes 里面对容器日志的处理方式,都叫作 cluster-level-logging,即:这个日志处理系统,与容器、Pod 以及 Node 的生命周期都是完全无关的。这种设计当然是为了保证,无论是容器挂了、Pod 被删除,甚至节点宕机的时候,应用的日志依然可以被正常获取到。 而对于一个容器来

    2024年02月15日
    浏览(28)
  • 收集K8S容器的标准输出日志实践

    参考文章 k8s日志文件说明 一般情况下,容器中的日志在输出到标准输出 (stdout) 时,会以  *-json.log   的命名方式保存在 /var/lib/docker/containers 目录中。 这里能看到,有这么个文件:  /data/docker/containers/container id/*-json.log ,然后k8s默认会在  /var/log/containers   和  /var/log/pods 目

    2024年02月11日
    浏览(30)
  • 容器技术—docker stack

    在之前的几篇文章中,我们介绍了Docker Compose,它是用来进行一个完整的应用程序相互依赖的多个容器的编排的,但是缺点是不能在分布式多机器上使用;我们也介绍了Docker swarm,它构建了docker集群,并且可以通过docker service在不同集群节点上运行容器服务,但是缺点是不能同

    2024年02月05日
    浏览(30)
  • Elastic Stack(1):Elastic Stack简介

    1 简介 ELK是一个免费开源的日志分析架构技术栈总称,官网https://www.elastic.co/cn。包含三大基础组件,分别是Elasticsearch、Logstash、Kibana。但实际上ELK不仅仅适用于日志分析,它还可以支持其它任何数据搜索、分析和收集的场景,日志分析和收集只是更具有代表性。并非唯一性。

    2024年01月19日
    浏览(40)
  • Kibana-elastic--Elastic Stack--ELK Stack

    Kibana 是什么? | Elastic 将数据转变为结果、响应和解决方案 使用 Kibana 针对大规模数据快速运行数据分析,以实现可观测性、安全和搜索。对来自任何来源的任何数据进行全面透彻的分析,从威胁情报到搜索分析,从日志到应用程序监测,不一而足。 虫瞻图(英语:worm\\\'s-eye

    2024年02月15日
    浏览(29)
  • 使用 Docker Swarm(集群) 和Docker Stack(堆栈)部署容器化应用

    说到集群,第一个想到的就是k8s,但docker官方也提供了集群和编排解决方案,它允许你将多个 Docker 主机连接在一起,形成一个“群集”(Swarm),并可以在这个 Swarm 上运行和管理你的服务。 与Kubernetes相比,Docker Swarm的群集管理功能相对简单,Swarm更适合于小型到中型的容器

    2024年04月25日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包