我使用docker-machine
创建了3个虚拟机,分别是:
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
cluster - virtualbox Running tcp://192.168.99.101:2376 v18.09.5
cluster2 - virtualbox Running tcp://192.168.99.102:2376 v18.09.5
master - virtualbox Running tcp://192.168.99.100:2376 v18.09.5
然后我在master
机器中创建了一个Docker群:
docker-machine ssh master "docker swarm init ----advertise-addr 192.168.99.100"
以及在cluster
和cluster2
中加入master
:
docker-machine ssh cluster "docker swarm join --advertise-addr 192.168.99.101 --token xxxx 192.168.99.100:2377"
docker-machine ssh cluster2 "docker swarm join --advertise-addr 192.168.99.102 --token xxxx 192.168.99.100:2377"
docker node ls
信息:
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
r4a6y9wie4zp3pl4wi4e6wqp8 cluster Ready Active 18.09.5
sg9gq6s3k6vty7qap7co6eppn cluster2 Ready Active 18.09.5
xb6telu8cn3bfmume1kcektkt * master Ready Active Leader 18.09.5
存在已部署配置swarm.yml
:
version: "3.3"
services:
elasticsearch:
image: elasticsearch:7.0.0
ports:
- "9200:9200"
- "9300:9300"
environment:
- cluster.name=elk
- network.host=_eth1:ipv4_
- network.bind_host=_eth1:ipv4_
- network.publish_host=_eth1:ipv4_
- discovery.seed_hosts=192.168.99.100,192.168.99.101
- cluster.initial_master_nodes=192.168.99.100,192.168.99.101
- bootstrap.memory_lock=false
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
networks:
- backend
deploy:
mode: replicated
replicas: 3
#endpoint_mode: dnsrr
restart_policy:
condition: none
resources:
limits:
cpus: "1.0"
memory: "1024M"
reservations:
memory: 20M
networks:
backend:
# driver: overlay
# attachable: true
我把ElasticSearch图像拉到虚拟机:
docker-machine ssh master "docker image pull elasticsearch:7.0.0"
docker-machine ssh cluster "docker image pull elasticsearch:7.0.0"
docker-machine ssh cluster2 "docker image pull elasticsearch:7.0.0"
在运行之前,我运行这个命令修复了一些elasticearch引导错误:
docker-machine ssh master "sudo sysctl -w vm.max_map_count=262144"
docker-machine ssh cluster "sudo sysctl -w vm.max_map_count=262144"
docker-machine ssh cluster2 "sudo sysctl -w vm.max_map_count=262144"
然后我运行'docker stack deploy -c swarm.yml es,ElasticSearch集群就不能工作了。
docker-machine ssh master
docker service logs es_elasticsearch -f
显示:
es_elasticsearch.1.uh1x0s9qr7mb@cluster | {"type": "server", "timestamp": "2019-04-25T16:28:47,143+0000", "level": "WARN", "component": "o.e.c.c.ClusterFormationFailureHelper", "cluster.name": "elk", "node.name": "e8dba5562417", "message": "master not discovered yet, this node has not previously joined a bootstrapped (v7+) cluster, and this node must discover master-eligible nodes [192.168.99.100, 192.168.99.101] to bootstrap a cluster: have discovered []; discovery will continue using [192.168.99.100:9300, 192.168.99.101:9300] from hosts providers and [{e8dba5562417}{Jy3t0AAkSW-jY-IygOCjOQ}{z7MYIf5wTfOhCX1r25wNPg}{10.255.0.46}{10.255.0.46:9300}{ml.machine_memory=1037410304, xpack.installed=true, ml.max_open_jobs=20}] from last-known cluster state; node term 0, last-accepted version 0 in term 0" }
es_elasticsearch.2.swswlwmle9e9@cluster2 | {"type": "server", "timestamp": "2019-04-25T16:28:47,389+0000", "level": "WARN", "component": "o.e.c.c.ClusterFormationFailureHelper", "cluster.name": "elk", "node.name": "af5d88a04b42", "message": "master not discovered yet, this node has not previously joined a bootstrapped (v7+) cluster, and this node must discover master-eligible nodes [192.168.99.100, 192.168.99.101] to bootstrap a cluster: have discovered []; discovery will continue using [192.168.99.100:9300, 192.168.99.101:9300] from hosts providers and [{af5d88a04b42}{zhxMeNMAQN2evKDlsA33qA}{fpYPTvJ6STmyqrgxlMkD_w}{10.255.0.47}{10.255.0.47:9300}{ml.machine_memory=1037410304, xpack.installed=true, ml.max_open_jobs=20}] from last-known cluster state; node term 0, last-accepted version 0 in term 0" }
es_elasticsearch.3.x8ouukovhh80@master | {"type": "server", "timestamp": "2019-04-25T16:28:48,818+0000", "level": "WARN", "component": "o.e.c.c.ClusterFormationFailureHelper", "cluster.name": "elk", "node.name": "0e7e4d96b31a", "message": "master not discovered yet, this node has not previously joined a bootstrapped (v7+) cluster, and this node must discover master-eligible nodes [192.168.99.100, 192.168.99.101] to bootstrap a cluster: have discovered []; discovery will continue using [192.168.99.100:9300, 192.168.99.101:9300] from hosts providers and [{0e7e4d96b31a}{Xs9966RjTEWvEbuj4-ySYA}{-eV4lvavSHq6JhoW0qWu6A}{10.255.0.48}{10.255.0.48:9300}{ml.machine_memory=1037410304, xpack.installed=true, ml.max_open_jobs=20}] from last-known cluster state; node term 0, last-accepted version 0 in term 0" }
我想可能是网络配置错误导致的集群形成失败。我不知道如何修复它,我尝试了很多次修改配置,失败了又失败了。
6条答案
按热度按时间ffvjumwh1#
尝试,这是工作:)docker-compose.yml
n1bvdmb62#
尝试手动指定所有特定的IP和绑定是棘手的,因为群覆盖网络。相反,只需使您的ES节点可发现,并让Swarm处理节点发现和通信。为了使它们可发现,我们可以使用一个可预测的名称,如Swarm节点主机名。
尝试按如下所示更改
swarm.yml
文件中的环境设置:当然,这是假设我们已经知道了群集主机名,正如您在上面的屏幕截图中指出的那样。如果不知道这些值,我们将无法获得一组可预测的节点名来查找。在这种情况下,您可以创建一个具有特定节点名的ES节点条目,然后创建另一个引用第一个条目的节点名为
cluster.initial_master_nodes
的条目。l0oc07j23#
使用无端口的dnsrr模式。使用nginx暴露elasticsearch;)查看我的docker-compose.yml
nwwlzxa74#
根据我的经验,https://github.com/shazChaudhry/docker-elastic工作得很好,整个repo中的一个文件就足够了。我下载了https://github.com/shazChaudhry/docker-elastic/blob/master/docker-compose.yml并删除了logstash位,我不需要它。然后在
.bashrc
中添加了以下代码而
docker stack deploy --compose-file docker-compose.yml elastic
的工作原理。zte4gxcn5#
我从Ahmet Vehbi Olgaç的docker-compose.yml中收集到了一些想法,它对我很有用:
1.使用
deployment
/mode: global
。这将导致群为每个这样配置的节点部署一个副本到每个群工作机。1.使用
deployment
/endpoint_mode: dnsrr
。这将允许群中的所有容器通过服务名称访问节点。1.使用
hostname: {{.Node.Hostname}}
或类似的基于模板的表达式。这可确保每个部署的容器具有唯一的名称。1.使用
environment
/node.name={{.Node.Hostname}}
。同样,你可以改变模式。关键是每个es节点应该得到一个唯一的名称。1.使用
cluster.initial_master_nodes=*hostname1*,*hostname2*,...
。假设你知道你的docker worker机器的主机名。使用你在#3中使用的任何模式,但是替换掉整个主机名,并包括所有的主机名。如果您不知道自己的主机名,可以按照Andrew Cachia的答案进行操作:设置一个容器(不要复制它),使其单独充当主种子,并为其给予可预测的主机名,然后让所有其他节点将该节点作为主种子引用。但是,这会引入单点故障。
oiopk7p56#
ElasticSearch8.5.0答案。
出于我的需要,我不想添加反向代理/负载平衡器,但我确实想在运行Elasticsearch副本的swarm节点上公开端口9200(仅使用swarm),以便外部客户端可以访问Elasticsearch REST API。因此,我使用端点模式
dnsrr
(ref),并在运行副本的主机上公开端口9200。如果您不需要公开端口9200(即,没有任何东西会连接到swarm之外的
elasticsearch
副本),请从elasticsearch
服务中删除ports:
配置。我也只想让elasticsearch副本运行在我的一个swarm节点子集上(3个),我在这3个节点上创建了docker节点标签
elasticsearch
,然后mode: global
和约束node.labels.elasticsearch==True
将确保在每个节点上运行1个副本。我也在这3个节点之一上运行Kibana:swarm可以挑选哪一个,因为矶钓5601暴露在swarm入口覆盖网络上
您可能需要编辑的行使用
######
标记。第一个
部署:
下面是我创建Elasticsearch CA和证书的过程:
第一个
我如何创建Kibana证书不在此问题的范围之内。
我运行了一个Fluent Bit swarm服务(
mode: global
,docker networkelastic-net
)来向elasticsearch服务发送日志。主机
elasticsearch
将由Docker的DNS服务器解析为elasticsearch副本的三个IP地址,因此不存在单点故障。