【问题标题】:Configure an ELK cluster in docker containers在 docker 容器中配置 ELK 集群
【发布时间】:2017-06-01 07:39:39
【问题描述】:

我正在尝试使用 2 个 docker 容器配置 ELK 集群。

我正在使用以下图片:

我使用docker-compose 为该图像创建了 2 个 docker 容器;每个都可以在独立模式下完美运行。

我想将 2 个 ELK 节点相互链接以创建集群,但我还没有找到合适的解决方案。 container1 中的 Elasticsearch 节点不与 container2 中的 Elasticsearch 节点通信。

这是两个docker-compose.yml

CONTAINER1:

version: '2'
services:
  elasticsearch01:
    image: sebp/elk:es241_l240_k461
    ports:
      - "5601:5601"
      - "9200:9200"
      - "9300:9300"
      - "5044:5044"
    volumes:
      - /opt/ELK1/logstash/conf.d:/etc/logstash/conf.d
    privileged: true

CONTAINER2:

version: '2'
services:
  elasticsearch02:
    image: sebp/elk:es241_l240_k461
    ports:
      - "5602:5601"
      - "9201:9200"
      - "9301:9300"
      - "5045:5044"
    volumes:
      - /opt/ELK2/logstash/conf.d:/etc/logstash/conf.d
    privileged: true

我已经以这种方式在 docker 容器中配置了elasticsearch.yml

CONTAINER1 中的节点:

cluster.name: elasticsearchcluster
node.name: node1
network.host: 0.0.0.0
network.bind_host: 0.0.0.0
discovery.zen.ping.unicast.hosts: ["127.0.0.1", "172.21.0.2"]
discovery.zen.minimum_master_nodes: 1

CONTAINER2 中的节点:

cluster.name: elasticsearchcluster
node.name: node2
network.host: 0.0.0.0
network.bind_host: 0.0.0.0
discovery.zen.ping.unicast.hosts: ["127.0.0.1", "172.22.0.2"]
discovery.zen.minimum_master_nodes: 1

关键是discovery.zen.ping.unicast.hosts参数:我没有真实IP地址,因为是docker容器。

我试过docker inspect elasticsearch01,我有以下"IPAddress"属性:

    "NetworkSettings": {
        ...
        "Networks": {
            "ELK1_default": {
                ...
                "Gateway": "172.22.0.1",
                "IPAddress": "172.22.0.2",
                ...
            }
        }
    }

但如果我设置了那个 IP 地址,它就不起作用了。

如何正确配置集群?

编辑

尝试主机ip地址和端口,节点1启动,节点2失败,没有错误。

discovery.zen.ping.unicast.hosts: ["127.0.0.1", "192.168.0.1:9300"] -> OK
discovery.zen.ping.unicast.hosts: ["127.0.0.1", "192.168.0.2:9300"] -> FAILS with no errors

【问题讨论】:

  • discovery.zen.ping.unicast.hosts: ["127.0.0.1", elasticsearch01, elasticsearch02] 不行吗?或者,只需在 docker-compose 中设置一个单独的 elasticsearch 容器,然后根据需要进行缩放。一个很好的例子在这里:hub.docker.com/r/itzg/elasticsearch
  • 不,我尝试使用名称而不是 IP 地址,但它不起作用。它似乎搜索容器内部的节点,而不是外部。显然我在每个容器中只有一个节点。
  • 你看过我发给你的链接了吗?这将是您问题的正确解决方案。
  • 是的,我看过了,但它指的是 Elasticsearch 的 1.3.5 版本。我用的是2.4.1版本。
  • 您必须使用2.4.1 还是可以是最新版本?

标签: elasticsearch docker-compose elastic-stack elasticsearch-2.0 docker-container


【解决方案1】:

您可以使用这样的东西,而不是使用准备好的带有 ELK 堆栈的 docker 文件:

version: '3'

services:

  elasticsearch:
    image: elasticsearch:2.4.1
    ports:
      - 9200:9200
    networks:
      - elk

  elasticsearch_slave:
    image: elasticsearch:2.4.1
    networks:
      - elk
    depends_on:
      - elasticsearch
    command: elasticsearch --discovery.zen.ping.unicast.hosts=elasticsearch

  logstash:
    image: logstash:2.3.3
    hostname: logstash
    networks:
      - elk
    volumes:
      - ./logstash.conf:/config/logstash.conf
    depends_on:
      - elasticsearch
    ports:
      - 5044:5044
    command: logstash -f /config/logstash.conf

  kibana:
    image: kibana:4.5.1
    hostname: kibana
    networks:
      - elk
    depends_on:
      - elasticsearch
      - logstash
    ports:
      - 5601:5601

networks:

  elk:
    driver: bridge

使用docker-compose up -d 启动映像后,您可以使用以下命令docker-compose scale elasticsearch_slave=5 扩展从站

完成后 - 您将拥有 5 个从属节点 + 客户端节点,这些节点打开端口 9200 作为整个集群的网关。

例如,在这样做之后,http://localhost:9200/_cat/nodes?v 会显示以下内容:

【讨论】:

  • 谢谢,我可以试一试,但这样我就没有独特堆栈的优势了。
  • @AlessandroC 您在这里可能还有其他一些优势。 :)
  • 看我的解决方案!它也适用于堆栈。再次感谢您的帮助!
  • @AlessandroC 很高兴你成功了 :)
  • 您好@EvaldasBuinauskas 与您的解决方案,我想将我的容器放在集群上的不同节点(不同实例)中是否可能?
【解决方案2】:

感谢 Evaldas Buinauskas,我找到了堆栈的解决方案!

首先,我们只需要一个 docker-compose.yml。 在该文件中,我们需要配置两个服务(每个容器创建一个),以及两个服务之间共享的一个网络

这是新的docker-compose.yml

version: '2'
services:
  elk1:
    environment:
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms2048m -Xmx2048m"
    image: sebp/elk:es241_l240_k461
    networks:
      - elk_net
    ports:
      - "5601:5601"
      - "9200:9200"
      - "9300:9300"
      - "5044:5044" 
    volumes:
      - /opt/elk/logstash/conf.d:/etc/logstash/conf.d
    privileged: true
  elk2:
    environment:
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms2048m -Xmx2048m"
    image: sebp/elk:es241_l240_k461
    networks:
      - elk_net
    ports:
      - "5602:5601"
      - "9201:9200"
      - "9301:9300"
      - "5045:5044"
    depends_on:
      - elk1  
    volumes:
      - /opt/elk/logstash/conf.d:/etc/logstash/conf.d
    privileged: true  
networks:
  elk_net:
    driver: bridge

docker-compose up 命令将创建 3 个元素:

  1. 容器elk1
  2. 容器elk2
  3. 网络elk_net

使用docker network inspect elk_net 命令,我们可以查看分配给这两个容器的(docker)IP 地址。

elasticsearch.yml 文件必须配置如下:

cluster.name: elasticsearchcluster
node.name: node1
network.host: 0.0.0.0
network.bind_host: 0.0.0.0
network.publish_host: ${IP_ADDRESS_ELK1}
discovery.zen.ping.unicast.hosts: ["${IP_ADDRESS_ELK2}"]
discovery.zen.minimum_master_nodes: 1

cluster.name: elasticsearchcluster
node.name: node2
network.host: 0.0.0.0
network.bind_host: 0.0.0.0
network.publish_host: ${IP_ADDRESS_ELK2}
discovery.zen.ping.unicast.hosts: ["${IP_ADDRESS_ELK1}"]
discovery.zen.minimum_master_nodes: 1

通过这个配置,集群完美运行:两个节点正确合并,每个elasticsearch服务器的Http get返回两个节点保存的所有文档。

【讨论】:

  • 嗨@Alessandro 与您的解决方案,我想将我的容器放在集群上的不同节点(不同实例)中是否可能?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-22
  • 1970-01-01
  • 2017-07-29
  • 2015-04-17
  • 1970-01-01
  • 2019-02-16
相关资源
最近更新 更多