在 docker 个容器中配置 ELK 集群
Configure an ELK cluster in docker containers
我正在尝试使用 2 个 docker 容器配置 ELK 集群。
我正在使用以下图片:
- es241_l240_k461:Elasticsearch 2.4.1、Logstash 2.4.0 和 Kibana 4.6.1。 (参考:https://hub.docker.com/r/sebp/elk/)
我已经用 docker-compose
为该图像创建了 2 个 docker 容器;每个都在独立模式下完美运行。
我想link 2个ELK节点之间的方式创建集群,但我还没有找到合适的解决方案。
container1 中的 Elasticsearch 节点不与 container2.
中的 Elasticsearch 节点通信
这是两个 docker-compose.yml
:
容器 1:
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
容器 2:
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
:
容器 1 中的节点:
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
容器 2 中的节点:
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
除了使用带有 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
显示如下:
感谢 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 个元素:
- 容器elk1
- 容器elk2
- 网络elk_net
使用 docker network inspect elk_net
命令我们可以查看分配给 2 个容器的 (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
使用此配置,集群完美运行:两个节点正确合并,Http 到达每个 elasticsearch 服务器 returns 保存在 2 个节点中的所有文档。
我正在尝试使用 2 个 docker 容器配置 ELK 集群。
我正在使用以下图片:
- es241_l240_k461:Elasticsearch 2.4.1、Logstash 2.4.0 和 Kibana 4.6.1。 (参考:https://hub.docker.com/r/sebp/elk/)
我已经用 docker-compose
为该图像创建了 2 个 docker 容器;每个都在独立模式下完美运行。
我想link 2个ELK节点之间的方式创建集群,但我还没有找到合适的解决方案。 container1 中的 Elasticsearch 节点不与 container2.
中的 Elasticsearch 节点通信这是两个 docker-compose.yml
:
容器 1:
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
容器 2:
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
:
容器 1 中的节点:
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
容器 2 中的节点:
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
除了使用带有 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
显示如下:
感谢 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 个元素:
- 容器elk1
- 容器elk2
- 网络elk_net
使用 docker network inspect elk_net
命令我们可以查看分配给 2 个容器的 (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
使用此配置,集群完美运行:两个节点正确合并,Http 到达每个 elasticsearch 服务器 returns 保存在 2 个节点中的所有文档。