elasticsearch,Docker,elasticsearch" /> elasticsearch,Docker,elasticsearch" />

如何使用docker swarm部署elasticsearch?

如何使用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

我创建了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   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部署一个副本,每个节点都是这样配置的

  • 使用部署模式:dnsrr。这将允许群中的所有容器通过服务名称访问节点

  • 使用
    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