tutorial-string

Bài 2: Hướng dẫn cài đặt Elasticsearch và Kibana với Docker

qfcnvfxqu0z0ghex0ckkeuo dnbzapkhgappj5twid2qfq1prxy3 wjubgyd3nq6ja4bkhmuxisnp6xuirsey wcaioyoyttjb5stjws xvxg2uib pzeokqsbbuan26jhiowopyrikoosbphbwsdt4

Trong bài viết trước, chúng ta đã cùng tìm hiểu về Elasticsearch cũng như các kiến thức cần biết khác liên quan tới nó. Kỳ này, và các bạn sẽ cùng nhau cài đặt một cluster Elasticsearch với 3 node và Kibana trên nền tảng Docker nhé.

1. Các bước chuẩn bị

Bước 1: Cài docker-compose cho môi trường thực hiện của mình

Để có thể thực hiện theo hướng dẫn trong bài viết này, bạn cần cài đặt sẵn docker-compose. Bạn có thể tìm hiểu và cài đặt docker-compose từ trang thông tin hướng dẫn chính thức của Docker.

Nếu bạn đang sử dụng Docker Desktop thì docker-compose đã được cài đặt sẵn trên máy của bạn rồi đó. Chú ý rằng, bạn luôn cần có tối thiểu 4GB RAM cho Docker sử dụng để đảm bảo việc cài đặt được thực hiện một cách trơn tru. Bạn có thể điều chỉnh lượng bộ nhớ Docker Desktop sử dụng bằng cách vào Settings > Resources.

Bước 2: Tạo một workspace để thực hiện project.

Bước 3: Tạo các file sau trong thư mục.

  • File .env
# Password for the 'elastic' user (at least 6 characters)
ELASTIC_PASSWORD=

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

# Version of Elastic products
STACK_VERSION={version}

# Set the cluster name
CLUSTER_NAME=docker-cluster

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

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

# Port to expose Kibana to the host
KIBANA_PORT=5601

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

Trong file này, chúng ta cần điền thông tin password vào ELASTIC_PASSWORD và biến KIBANA_PASSWORD. Các giá trị này phải là các ký tự chữ và không được chứa các ký tự đặc biệt như là ! hay @. Các file bash được bao gồm trong file docker-compose.yml chỉ hoạt động với các ký tự chữ.

Cũng trong file .env, điền thông tin STACK_VERSION và version Elasticsearch và Kibana muốn cài.

  • File setup.yml
version: "3.8"

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: es01n"
          "    dns:n"
          "      - es01n"
          "      - localhostn"
          "    ip:n"
          "      - 127.0.0.1n"
          "  - name: es02n"
          "    dns:n"
          "      - es02n"
          "      - localhostn"
          "    ip:n"
          "      - 127.0.0.1n"
          "  - name: es03n"
          "    dns:n"
          "      - es03n"
          "      - localhostn"
          "    ip:n"
          "      - 127.0.0.1n"
          > 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
volumes:
  certs:
    driver: local
  • File docker-compose.yml
version: "3.8"
services:
  es01:
    image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION}
    container_name: es01
    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}
    networks:
      - elastic-network
    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}
    container_name: es02
    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}
    networks:
      - elastic-network
    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}
    container_name: es03
    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}
    networks:
      - elastic-network
    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
networks:
  elastic-network:
    external: true
  • File kibana.yml
version: "3.8"
services:
  kibana:
    image: docker.elastic.co/kibana/kibana:${STACK_VERSION}
    container_name: kibana
    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
    networks:
      elastic-network:
    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
networks:
  elastic-network:
    external: true

2. Khởi chạy cluster Elasticsearch

Bước 1: Tạo network để sử dụng cho cluster

docker network create -d bridge elastic-network

Bước 2: Setup Elasticsearch và lấy certs

docker-compose -f setup.yml up -d

Bước 3: Sao chép lại folder certs mà container setup đã tạo ra máy host

docker cp setup_container:/usr/share/elasticsearch/config/certs .

Bước 4: Khởi chạy cluster Elasticsearch

docker-compose up -d

Ta có thể kiểm tra trạng thái hoạt động của cluster với các lệnh sau:

  • Kiểm tra logs của một node bất kỳ
docker logs –details -f es01

qfcnvfxqu0z0ghex0ckkeuo dnbzapkhgappj5twid2qfq1prxy3 wjubgyd3nq6ja4bkhmuxisnp6xuirsey

  • Xem trạng thái các container

xr4 u uz72mrcz7791zs0imtpzw2usu5c8jqtjtstit97fie gytv0l47xyaaybbakthljke43knyobw rcc4i2rqgqod5wnx7iehdngg0hnu67gerhdewkqsu 4afcnftv67rfdtlegayxghg du

>>> Xem thêm bài viết:

– DevSecOps là gì? Kiến thức cơ bản về DevSecOps

– Giới thiệu về GridFS trong MongoDB

– Hướng dẫn cài đặt K8s Kubenertes Cluster

3. Cài đặt Kibana

Bước 1: Khởi chạy Kibana

docker-compose -f kibana.yml up -d

Bước 2: Kiểm tra trạng thái Kibana

docker ps | grep kibana

Kết quả hiện ra console sẽ có dạng như sau:

8bccc41963b0   docker.elastic.co/kibana/kibana:8.10.4                 “/bin/tini  /usr/l…”   About a minute ago   Up About a minute (healthy)   0.0.0.0:5601->5601/tcp             kibana

Truy cập Kibana:

pbk95ef4aw do2ndb6om4hkvryn honona0u z0h7gucwetjmtdj5vjnnca7ubejdicwxtwgn6advqslpnd7w9nfqj3mz q1icaeghb gkj tzzvvsedehgm5c5dyqku3mv1vfjucbq0ja21txjd ck

Sau cùng, đăng nhập vào bằng tài khoản Elastic đã tạo và chúng ta đã có thể truy cập vào Kibana:

rdxqw8lp6uicjluhldotmckqyb6jhsgyck9zh6iqrsrqafzuxdspo8ptnywpycjkvycc fbsjnrhlezu2387soq5uji9gm8asxeu ks6lnlflt

Kết bài

Trên đây là hướng dẫn của chúng tôi về cách cài đặt cluster Elasticsearch cùng với Kibana, chúc các bạn thành công. sẽ còn ra thêm nhiều bài viết trong chùm bài về Elasticsearch, quý bạn đọc hãy cùng đón chờ nhé.


Cộng Đồng Linux là giải pháp cung cấp các tính năng giao tiếp như gọi thoại, gọi video, tin nhắn chat, SMS hay tổng đài CSKH cho phép tích hợp trực tiếp vào ứng dụng/website của doanh nghiệp nhanh chóng. Nhờ đó giúp tiết kiệm đến 80% thời gian và chi phí cho doanh nghiệp bởi thông thường nếu tự phát triển các tính năng này có thể mất từ 1 – 3 năm.

Bộ API giao tiếp của hiện đang được tin dùng bởi các doanh nghiệp ở mọi quy mô, lĩnh vực ngành nghề như TPBank, VOVBacsi24, VNDirect, Shinhan Finance, Ahamove, Logivan, Homedy,  Adavigo, bTaskee…

Quý bạn đọc quan tâm xin mời đăng ký bài viết mới:

fvpof0tz24yhivumolvddagkaxl66yftnonsufpscnkxma ibgnufp3porhzyri3wijxhwxysceckzynhmrgzk 82 oqoxfvvymp38ntrx0faujoqx5dgqd5otfdaj1rwypnthmdgxtnnyxk70to 4

Đăng ký liền tay Nhận Ngay Bài Mới

Subscribe ngay

Cám ơn bạn đã đăng ký !

Lỗi đăng ký !

Add Comment

Click here to post a comment

Đăng ký liền tay
Nhận Ngay Bài Mới

Subscribe ngay

Cám ơn bạn đã đăng ký !

Lỗi đăng ký !