docker-compose方式部署elasticsearch8.7.0集群,使用官方示例,生成证书以及配置用户密码访问

官方示例 https://www.elastic.co/guide/en/elasticsearch/reference/8.8/docker.html

#1.docker-compose-es.yaml

version: "2.2"

services:
    setup:
    image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION}
    volumes:
        - certs:/usr/share/elasticsearch/config/certs
    user: "0"
    command: >
        bash -c '
        if [ x${ELASTIC_PASSWORD} == x ]; then
            echo "Set the ELASTIC_PASSWORD environment variable in the .env file";
            exit 1;
        elif [ x${KIBANA_PASSWORD} == x ]; then
            echo "Set the KIBANA_PASSWORD environment variable in the .env file";
            exit 1;
        fi;
        if [ ! -f config/certs/ca.zip ]; then
            echo "Creating CA";
            bin/elasticsearch-certutil ca --silent --pem -out config/certs/ca.zip;
            unzip config/certs/ca.zip -d config/certs;
        fi;
        if [ ! -f config/certs/certs.zip ]; then
            echo "Creating certs";
            echo -ne \
            "instances:\n"\
            "  - name: es01\n"\
            "    dns:\n"\
            "      - es01\n"\
            "      - localhost\n"\
            "    ip:\n"\
            "      - 127.0.0.1\n"\
            "  - name: es02\n"\
            "    dns:\n"\
            "      - es02\n"\
            "      - localhost\n"\
            "    ip:\n"\
            "      - 127.0.0.1\n"\
            "  - name: es03\n"\
            "    dns:\n"\
            "      - es03\n"\
            "      - localhost\n"\
            "    ip:\n"\
            "      - 127.0.0.1\n"\
            > config/certs/instances.yml;
            bin/elasticsearch-certutil cert --silent --pem -out config/certs/certs.zip --in config/certs/instances.yml --ca-cert config/certs/ca/ca.crt --ca-key config/certs/ca/ca.key;
            unzip config/certs/certs.zip -d config/certs;
        fi;
        echo "Setting file permissions"
        chown -R root:root config/certs;
        find . -type d -exec chmod 750 \{\} \;;
        find . -type f -exec chmod 640 \{\} \;;
        echo "Waiting for Elasticsearch availability";
        until curl -s --cacert config/certs/ca/ca.crt https://es01:9200 | grep -q "missing authentication credentials"; do sleep 30; done;
        echo "Setting kibana_system password";
        until curl -s -X POST --cacert config/certs/ca/ca.crt -u "elastic:${ELASTIC_PASSWORD}" -H "Content-Type: application/json" https://es01:9200/_security/user/kibana_system/_password -d "{\"password\":\"${KIBANA_PASSWORD}\"}" | grep -q "^{}"; do sleep 10; done;
        echo "All done!";
        '
    healthcheck:
        test: ["CMD-SHELL", "[ -f config/certs/es01/es01.crt ]"]
        interval: 1s
        timeout: 5s
        retries: 120

    es01:
    depends_on:
        setup:
        condition: service_healthy
    image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION}
    volumes:
        - certs:/usr/share/elasticsearch/config/certs
        - esdata01:/usr/share/elasticsearch/data
    ports:
        - ${ES_PORT}:9200
    environment:
        - node.name=es01
        - cluster.name=${CLUSTER_NAME}
        - cluster.initial_master_nodes=es01,es02,es03
        - discovery.seed_hosts=es02,es03
        - ELASTIC_PASSWORD=${ELASTIC_PASSWORD}
        - bootstrap.memory_lock=true
        - xpack.security.enabled=true
        - xpack.security.http.ssl.enabled=true
        - xpack.security.http.ssl.key=certs/es01/es01.key
        - xpack.security.http.ssl.certificate=certs/es01/es01.crt
        - xpack.security.http.ssl.certificate_authorities=certs/ca/ca.crt
        - xpack.security.transport.ssl.enabled=true
        - xpack.security.transport.ssl.key=certs/es01/es01.key
        - xpack.security.transport.ssl.certificate=certs/es01/es01.crt
        - xpack.security.transport.ssl.certificate_authorities=certs/ca/ca.crt
        - xpack.security.transport.ssl.verification_mode=certificate
        - xpack.license.self_generated.type=${LICENSE}
    mem_limit: ${MEM_LIMIT}
    ulimits:
        memlock:
        soft: -1
        hard: -1
    healthcheck:
        test:
        [
            "CMD-SHELL",
            "curl -s --cacert config/certs/ca/ca.crt https://localhost:9200 | grep -q 'missing authentication credentials'",
        ]
        interval: 10s
        timeout: 10s
        retries: 120

    es02:
    depends_on:
        - es01
    image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION}
    volumes:
        - certs:/usr/share/elasticsearch/config/certs
        - esdata02:/usr/share/elasticsearch/data
    environment:
        - node.name=es02
        - cluster.name=${CLUSTER_NAME}
        - cluster.initial_master_nodes=es01,es02,es03
        - discovery.seed_hosts=es01,es03
        - bootstrap.memory_lock=true
        - xpack.security.enabled=true
        - xpack.security.http.ssl.enabled=true
        - xpack.security.http.ssl.key=certs/es02/es02.key
        - xpack.security.http.ssl.certificate=certs/es02/es02.crt
        - xpack.security.http.ssl.certificate_authorities=certs/ca/ca.crt
        - xpack.security.transport.ssl.enabled=true
        - xpack.security.transport.ssl.key=certs/es02/es02.key
        - xpack.security.transport.ssl.certificate=certs/es02/es02.crt
        - xpack.security.transport.ssl.certificate_authorities=certs/ca/ca.crt
        - xpack.security.transport.ssl.verification_mode=certificate
        - xpack.license.self_generated.type=${LICENSE}
    mem_limit: ${MEM_LIMIT}
    ulimits:
        memlock:
        soft: -1
        hard: -1
    healthcheck:
        test:
        [
            "CMD-SHELL",
            "curl -s --cacert config/certs/ca/ca.crt https://localhost:9200 | grep -q 'missing authentication credentials'",
        ]
        interval: 10s
        timeout: 10s
        retries: 120

    es03:
    depends_on:
        - es02
    image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION}
    volumes:
        - certs:/usr/share/elasticsearch/config/certs
        - esdata03:/usr/share/elasticsearch/data
    environment:
        - node.name=es03
        - cluster.name=${CLUSTER_NAME}
        - cluster.initial_master_nodes=es01,es02,es03
        - discovery.seed_hosts=es01,es02
        - bootstrap.memory_lock=true
        - xpack.security.enabled=true
        - xpack.security.http.ssl.enabled=true
        - xpack.security.http.ssl.key=certs/es03/es03.key
        - xpack.security.http.ssl.certificate=certs/es03/es03.crt
        - xpack.security.http.ssl.certificate_authorities=certs/ca/ca.crt
        - xpack.security.transport.ssl.enabled=true
        - xpack.security.transport.ssl.key=certs/es03/es03.key
        - xpack.security.transport.ssl.certificate=certs/es03/es03.crt
        - xpack.security.transport.ssl.certificate_authorities=certs/ca/ca.crt
        - xpack.security.transport.ssl.verification_mode=certificate
        - xpack.license.self_generated.type=${LICENSE}
    mem_limit: ${MEM_LIMIT}
    ulimits:
        memlock:
        soft: -1
        hard: -1
    healthcheck:
        test:
        [
            "CMD-SHELL",
            "curl -s --cacert config/certs/ca/ca.crt https://localhost:9200 | grep -q 'missing authentication credentials'",
        ]
        interval: 10s
        timeout: 10s
        retries: 120

    kibana:
    depends_on:
        es01:
        condition: service_healthy
        es02:
        condition: service_healthy
        es03:
        condition: service_healthy
    image: docker.elastic.co/kibana/kibana:${STACK_VERSION}
    volumes:
        - certs:/usr/share/kibana/config/certs
        - kibanadata:/usr/share/kibana/data
    ports:
        - ${KIBANA_PORT}:5601
    environment:
        - SERVERNAME=kibana
        - ELASTICSEARCH_HOSTS=https://es01:9200
        - ELASTICSEARCH_USERNAME=kibana_system
        - ELASTICSEARCH_PASSWORD=${KIBANA_PASSWORD}
        - ELASTICSEARCH_SSL_CERTIFICATEAUTHORITIES=config/certs/ca/ca.crt
    mem_limit: ${MEM_LIMIT}
    healthcheck:
        test:
        [
            "CMD-SHELL",
            "curl -s -I http://localhost:5601 | grep -q 'HTTP/1.1 302 Found'",
        ]
        interval: 10s
        timeout: 10s
        retries: 120

volumes:
    certs:
    driver: local
    esdata01:
    driver: local
    esdata02:
    driver: local
    esdata03:
    driver: local
    kibanadata:
    driver: local

#2. 配置文件

root@debian:/home/summer/xsw/elasticsearch# cat .env 
# Password for the 'elastic' user (at least 6 characters)
ELASTIC_PASSWORD=elasticsearch

# Password for the 'kibana_system' user (at least 6 characters)
KIBANA_PASSWORD=elasticsearch

# Version of Elastic products
STACK_VERSION=8.7.0

# Set the cluster name
CLUSTER_NAME=docker-cluster

# Set to 'basic' or 'trial' to automatically start the 30-day trial
LICENSE=basic
#LICENSE=trial

# Port to expose Elasticsearch HTTP API to the host
ES_PORT=9200
#ES_PORT=127.0.0.1:9200

# Port to expose Kibana to the host
KIBANA_PORT=5601
#KIBANA_PORT=80

# Increase or decrease based on the available host memory (in bytes)
MEM_LIMIT=1073741824

# Project namespace (defaults to the current folder name if not set)
#COMPOSE_PROJECT_NAME=myproject


#3. 启动容器

root@debian:/home/summer/xsw/elasticsearch# docker-compose -f docker-compose-es.yml up -d
Creating network "elasticsearch_default" with the default driver
Creating volume "elasticsearch_certs" with local driver
Creating volume "elasticsearch_esdata01" with local driver
Creating volume "elasticsearch_esdata02" with local driver
Creating volume "elasticsearch_esdata03" with local driver
Creating volume "elasticsearch_kibanadata" with local driver
WARNING: Found orphan containers (es8-kibana, es8-es02, es8-es03, es8-es01) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.
Pulling setup (docker.elastic.co/elasticsearch/elasticsearch:8.7.0)...
8.7.0: Pulling from elasticsearch/elasticsearch
Digest: sha256:9fe38a4dc00ce101630e70a966aad1a195b56bceb779748e6c399ceeb45cffab
Status: Downloaded newer image for docker.elastic.co/elasticsearch/elasticsearch:8.7.0
Pulling kibana (docker.elastic.co/kibana/kibana:8.7.0)...
8.7.0: Pulling from kibana/kibana
Digest: sha256:14e0574d043eab9078e2ca64487334ad1dca2215d710b7321027e9f63c34449b
Status: Downloaded newer image for docker.elastic.co/kibana/kibana:8.7.0
Creating elasticsearch_setup_1 ... done
Creating elasticsearch_es01_1  ... done
Creating elasticsearch_es02_1  ... done
Creating elasticsearch_es03_1  ... done
Creating elasticsearch_kibana_1 ... done
root@debian:/home/summer/xsw/elasticsearch# docker-compose -f docker-compose-es.yml ps
            Name                       Command                       State                        Ports              
------------------------------------------------------------------------------------------------------------------
elasticsearch_es01_1     /bin/tini -- /usr/local/bi ...   Up (healthy)            0.0.0.0:9200->9200/tcp, 9300/tcp
elasticsearch_es02_1     /bin/tini -- /usr/local/bi ...   Up (healthy)            9200/tcp, 9300/tcp              
elasticsearch_es03_1     /bin/tini -- /usr/local/bi ...   Up (healthy)            9200/tcp, 9300/tcp              
elasticsearch_kibana_1   /bin/tini -- /usr/local/bi ...   Up (health: starting)   0.0.0.0:5601->5601/tcp          
elasticsearch_setup_1    /bin/tini -- /usr/local/bi ...   Exit 0