如何使用docker swarm部署elasticsearch?
我创建了3个虚拟机使用如何使用docker swarm部署elasticsearch?,docker,
elasticsearch,Docker,
elasticsearch,我创建了3个虚拟机使用docker machine,有: NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS cluster - virtualbox Running tcp://192.168.99.101:2376 v18.09.5 cluster2 - virtualbox
docker machine
,有:
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
machine中创建了一个docker swarm:
docker-machine ssh master "docker swarm init ----advertise-addr 192.168.99.100"
在集群
和集群2
中加入主节点
:
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节点ls
info:
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"
在运行之前,我运行此命令修复一些ElasticSearch引导错误:
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
展示:
我猜群集形成失败可能是由于网络配置错误。我不知道如何修复它,我尝试了很多次修改配置,失败了又失败了 由于swarm覆盖网络,尝试手动指定所有特定的IP和绑定非常棘手。 相反,只需使ES节点可发现,并让Swarm负责节点发现和通信。为了使它们可被发现,我们可以使用一个可预测的名称,如Swarm节点主机名 尝试在
swarm.yml
文件中更改环境设置,如下所示:
环境:
-network.host=0.0.0.0
-discovery.seed_hosts=elasticsearch#服务名称,让Swarm处理发现
-cluster.initial_master_nodes=主机、群集、群集2#群集节点主机名
-node.name={{.node.Hostname}}#创建可预测的节点名
当然,这假设我们已经知道swarm主机名,您在上面的屏幕截图中指出了这一点。如果不知道这些值,我们就无法找到一组可预测的节点名称。在这种情况下,您可以创建一个具有特定节点名称的ES节点条目,然后创建另一个条目,该条目将第一个条目的节点名称引用为
集群。初始\u主\u节点
使用不带端口的dnsrr模式。使用nginx公开elasticsearch;)
请参阅我从Ahmet Vehbi Olgaç的docker-compose.yml中收集的想法,它对我有用:
部署
/模式:全局
。这将导致swarm为每个swarm worker部署一个副本,每个节点都是这样配置的hostname:{{.Node.hostname}
或类似的基于模板的表达式。这确保了每个部署的容器都有一个唯一的名称environment
/node.name={{{.node.Hostname}
。同样,您可以改变模式。关键是每个es节点都应该有一个唯一的名称集群。初始\u主节点=*主机名1*,*主机名2*,…
。假设您知道docker worker机器的主机名。使用#3中使用的任何模式,但替换掉整个主机名,并包括所有主机名。如果您不知道自己的主机名,您可以按照Andrew Cachia的回答做:设置一个容器(不要复制它)作为主种子,并给它一个可预测的主机名,然后让所有其他节点将该节点称为主种子。但是,这会导致单点故障
.bashrc
export ELASTICSEARCH_HOST=$(hostname)
export ELASTICSEARCH_PASSWORD=foobar
export ELASTICSEARCH_USERNAME=elastic
export ELASTIC_VERSION=7.4.2
export INITIAL_MASTER_NODES=$ELASTICSEARCH_HOST
和
docker stack deploy——编写文件docker-compose.yml elastic
起作用。为什么不创建一个docker网络
并将其分配给容器,更简单;)否则,这里有一个很好的模板:这太棒了,我非常感谢你!不过,作为StackOverflow答案,最好将相关信息复制到此处。下次,请编辑您先前存在的答案,而不是重新发布。我已以此为基础,尝试使用Open Distro解决此问题。我能够在群中获得服务。如果我将shell放入运行elastic search的容器中,我就能够运行curl-XGEThttps://localhost:9200 -u admin:admin--不安全
,但如果在主机系统上执行此操作,则会得到`错误:1408F10B:SSL例程:ssl3\u get\u记录:错误的版本号。只有http,我得到了带有502坏网关的html。
version: "3.7"
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.2.0
hostname: "{{.Node.Hostname}}"
environment:
- node.name={{.Node.Hostname}}
- cluster.name=my-cluster
- "ES_JAVA_OPTS=-Xms2g -Xmx2g"
- discovery.seed_hosts=elasticsearch
- cluster.initial_master_nodes=node1,node2,node3
- node.ml=false
- xpack.ml.enabled=false
- xpack.monitoring.enabled=false
- xpack.security.enabled=false
- xpack.watcher.enabled=false
- bootstrap.memory_lock=false
volumes:
- elasticsearch-data:/usr/share/elasticsearch/data
deploy:
mode: global
endpoint_mode: dnsrr
resources:
limits:
memory: 4G
nginx:
image: nginx:1.17.1-alpine
ports:
- 9200:9200
deploy:
mode: global
command: |
/bin/sh -c "echo '
user nobody nogroup;
worker_processes auto;
events {
worker_connections 1024;
}
http {
client_max_body_size 4g;
resolver 127.0.0.11 ipv6=off;
server {
listen *:9200;
location / {
proxy_set_header Connection keep-alive;
set $$url http://elasticsearch:9200;
proxy_pass $$url;
proxy_set_header Host $$http_host;
proxy_set_header X-Real-IP $$remote_addr;
proxy_set_header X-Forwarded-For $$proxy_add_x_forwarded_for;
}
}
}' | tee /etc/nginx/nginx.conf && nginx -t && nginx -g 'daemon off;'"
volumes:
elasticsearch-data:
export ELASTICSEARCH_HOST=$(hostname)
export ELASTICSEARCH_PASSWORD=foobar
export ELASTICSEARCH_USERNAME=elastic
export ELASTIC_VERSION=7.4.2
export INITIAL_MASTER_NODES=$ELASTICSEARCH_HOST