No menu items!
No menu items!
More

    [ELK] Triển khai cụm ELK bằng Docker Compose

    1. ELK Stack là gì?

    ELK Stack là tập hợp 3 phần mềm đi chung với nhau, phục vụ cho công việc logging. Ba phần mềm này lần lượt là:

    • Elasticsearch: Cơ sở dữ liệu để lưu trữ, tìm kiếm và query log
    • Logstash: Tiếp nhận log từ nhiều nguồn, sau đó xử lý log và ghi dữ liệu và Elasticsearch
    • Kibana: Giao diện để quản lý, thống kê log. Đọc thông tin từ Elasticsearch

    Cơ chế hoạt động của ELK Stack cũng khá đơn giản, các bạn xem hình sẽ hiểu:

    Cơ chế hoạt động của ELK như sau:

    1. Đầu tiên, log sẽ được đưa đến Logstash. (Thông qua nhiều con đường, ví dụ như server gửi UDP request chứa log tới URL của Logstash, hoặc Beat đọc file log và gửi lên Logstash)
    2. Logstash sẽ đọc những log này, thêm những thông tin như thời gian, IP, parse dữ liệu từ log (server nào, độ nghiêm trọng, nội dung log) ra, sau đó ghi xuống database là Elasticsearch.
    3. Khi muốn xem log, người dùng vào URL của Kibana. Kibana sẽ đọc thông tin log trong Elasticsearch, hiển thị lên giao diện cho người dùng query và xử lý.

    2. Triển khai ELK bằng Docker Compose.

    Tạo file elk.yaml.

    vi /home/elk.yaml

    Điền vào nội dung như dưới và nếu muốn thì bạn hãy thay đổi các thông số theo ý muốn của bạn.

    version: '2.2'
    services:
      es01:
        image: docker.elastic.co/elasticsearch/elasticsearch:7.13.2
        container_name: es01
        environment:
          - node.name=es01
          - cluster.name=es-docker-cluster
          - discovery.seed_hosts=es02,es03
          - cluster.initial_master_nodes=es01,es02,es03
          - bootstrap.memory_lock=true
          - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
        ulimits:
          memlock:
            soft: -1
            hard: -1
        volumes:
          - data01:/usr/share/elasticsearch/data
        ports:
          - 9200:9200
        networks:
          - elastic
    
      es02:
        image: docker.elastic.co/elasticsearch/elasticsearch:7.13.2
        container_name: es02
        environment:
          - node.name=es02
          - cluster.name=es-docker-cluster
          - discovery.seed_hosts=es01,es03
          - cluster.initial_master_nodes=es01,es02,es03
          - bootstrap.memory_lock=true
          - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
        ulimits:
          memlock:
            soft: -1
            hard: -1
        volumes:
          - data02:/usr/share/elasticsearch/data
        networks:
          - elastic
    
      es03:
        image: docker.elastic.co/elasticsearch/elasticsearch:7.13.2
        container_name: es03
        environment:
          - node.name=es03
          - cluster.name=es-docker-cluster
          - discovery.seed_hosts=es01,es02
          - cluster.initial_master_nodes=es01,es02,es03
          - bootstrap.memory_lock=true
          - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
        ulimits:
          memlock:
            soft: -1
            hard: -1
        volumes:
          - data03:/usr/share/elasticsearch/data
        networks:
          - elastic
    
      kib01:
        image: docker.elastic.co/kibana/kibana:7.13.2
        container_name: kib01
        ports:
          - 5601:5601
        environment:
          ELASTICSEARCH_URL: http://es01:9200
          ELASTICSEARCH_HOSTS: '["http://es01:9200","http://es02:9200","http://es03:9200"]'
        networks:
          - elastic
    
      logstash:
        image: logstash:7.13.2
        container_name: logstash
        ports:
          - 5044:5044
        networks:
          - elastic
        volumes:
          - /home/logstash.conf:/usr/share/logstash/pipeline/logstash.conf
          - /home/sample-json.log:/home/sample-json.log
        environment:
          ELASTICSEARCH_URL: http://es01:9200
    
    volumes:
      data01:
        driver: local
      data02:
        driver: local
      data03:
        driver: local
    
    networks:
      elastic:
        driver: bridge
    

    Ở đây mình sẽ tạo thêm file /home/sample-json.log để test json parse cho các bài sau.

    touch /home/sample-json.log

    Tạo file fillter để mount vào container logstash.

    vi /home/logstash.conf

    Hãy cho nội dung này vào và lưu lại, đây là bộ lọc đơn giản dùng để test logs, về sau các bạn phải viết nó bằng ngôn ngữ riêng dành cho log được gọi là grok.

    input {
    	beats {
    		port => 5044
    		ssl => false
    	}
    }
    
    output {
        elasticsearch {
        hosts => ["es01:9200"]
        sniffing => true
        index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}"
        }
    }

    Hãy triển khai file elk.yaml bằng lệnh docker-compose -f /home/elk.yaml up -d

    $ docker-compose -f /home/elk.yaml up -d
    [+] Running 5/5
     ⠿ Network home_elastic  Created                                                                                                                                                                                    0.1s
     ⠿ Container es02        Started                                                                                                                                                                                    4.6s
     ⠿ Container kib01       Started                                                                                                                                                                                    2.4s
     ⠿ Container es03        Started                                                                                                                                                                                    3.4s
     ⠿ Container es01        Started                                                                                                                                                                                    1.4s

    Kết quả sau khi triển khai xong file elk.yaml.

    $ docker ps
    CONTAINER ID   IMAGE                                                  COMMAND                  CREATED              STATUS                 PORTS                                                                                                               NAMES
    10b06ac625d0   docker.elastic.co/elasticsearch/elasticsearch:7.13.2   "/bin/tini -- /usr/l…"   About a minute ago   Up About a minute      9200/tcp, 9300/tcp                                                                                                  es02
    31f0346bdf85   docker.elastic.co/elasticsearch/elasticsearch:7.13.2   "/bin/tini -- /usr/l…"   About a minute ago   Up About a minute      0.0.0.0:9200->9200/tcp, :::9200->9200/tcp, 9300/tcp                                                                 es01
    8b567ff7dffb   docker.elastic.co/elasticsearch/elasticsearch:7.13.2   "/bin/tini -- /usr/l…"   About a minute ago   Up About a minute      9200/tcp, 9300/tcp                                                                                                  es03
    1d523f49c854   docker.elastic.co/kibana/kibana:7.13.2                 "/bin/tini -- /usr/l…"   About a minute ago   Up About a minute      0.0.0.0:5601->5601/tcp, :::5601->5601/tcp                                                                           kib01

    Nếu es01, es02, es04 không start được, bạn hãy dùng lệnh docker logs es01 xem lỗi gì, nếu Elastic search bạn gặp lỗi dưới, bạn hãy làm theo các bước tiếp theo để fix lỗi.

    Elastic search error: "Native controller process has stopped - no new native processes can be started"

    Lý do là tuỳ chọn vm.max_map_count được đặt thành nhỏ theo mặc định. Điều này hạn chế hàng đợi của thông báo nên để giải quyết bạn hãy tăng tuỳ chọn này lên trên máy node chạy Docker bằng cách sau:

    Trên Linux chạy lệnh sau để được giải quyết.

    sysctl -w vm.max_map_count=262144

    Trên Windows với docker desktop chạy lệnh dưới.

    wsl -d docker-desktop

    Và sau đó sử dụng lệnh này.

    sysctl -w vm.max_map_count=262144

    Kiểm tra xem port của Kibana đã listen chưa.

    $ netstat -tlnp | grep 5601
    tcp        0      0 0.0.0.0:5601            0.0.0.0:*               LISTEN      21694/docker-proxy  
    tcp6       0      0 :::5601                 :::*                    LISTEN      21702/docker-proxy 

    Và đây là kết quả.

    Khi không dùng nữa bạn có thể huỷ các container bằng lệnh docker-compose down như dưới.

    $ docker-compose -f elk.yaml down
    [+] Running 5/5
     ⠿ Container es03        Removed                                                                                                                                                                                    1.1s
     ⠿ Container es01        Removed                                                                                                                                                                                    1.2s
     ⠿ Container kib01       Removed                                                                                                                                                                                   10.5s
     ⠿ Container es02        Removed                                                                                                                                                                                    1.0s
     ⠿ Network home_elastic  Removed                                                                                                                                                                                    0.1s

    3. Cài đặt Filebeat.

    Filebeat là một plugin nhẹ được sử dụng để thu thập và gửi các logs. Đây là mô-đun Beats được sử dụng phổ biến nhất. Một trong những ưu điểm chính của Filebeat là nó làm chậm tốc độ của nó nếu dịch vụ Logstash xử lý quá nhiều dữ liệu.

    Cài đặt Filebeat bằng cách chạy lệnh sau:

    wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | apt-key add - 
    echo "deb https://artifacts.elastic.co/packages/oss-7.x/apt stable main" |    tee -a /etc/apt/sources.list.d/elastic-7.x.list
    apt-get install apt-transport-https
    apt-get update 
    apt-get install filebeat

    Theo mặc định, Filebeat sẽ gửi dữ liệu đến Elaticsearch. Filebeat cũng có thể được cấu hình để gửi dữ liệu sự kiện tới Logstash.

    3.1. Để định cấu hình, hãy chỉnh sửa file cấu hình filebeat.yml.

    vi /etc/filebeat/filebeat.yml

    3.2. Trong phần Elaticsearch o utput , hãy comment lại các dòng sau để Filebeat không gửi logs đến Elaticsearch.

    # output.elasticsearch:
      # Array of hosts to connect to.
      # hosts: ["localhost:9200"]

    3.3. Trong phần Logstash output , bỏ comment (#) ở 2 dòng sau với 192.168.13.205:5044 là ip address và port của Logstash mục đích là cho Filebeat gửi logs đến Logstash.

    output.logstash:
      # The Logstash hosts
      hosts: ["192.168.13.205:5044"]

    Như vậy sau khi chỉnh sửa xong, phần Output của ElaticsearchLogstash nó sẽ giống như thế này.

    # ================================== Outputs ===================================
    
    # Configure what output to use when sending the data collected by the beat.
    
    # ---------------------------- Elasticsearch Output ----------------------------
    # output.elasticsearch:
      # Array of hosts to connect to.
      # hosts: ["localhost:9200"]
    
      # Protocol - either `http` (default) or `https`.
      #protocol: "https"
    
      # Authentication credentials - either API key or username/password.
      #api_key: "id:api_key"
      #username: "elastic"
      #password: "changeme"
    
    # ------------------------------ Logstash Output -------------------------------
    output.logstash:
      # The Logstash hosts
      hosts: ["192.168.13.205:5044"]
    
      # Optional SSL. By default is off.
      # List of root certificates for HTTPS server verifications
      #ssl.certificate_authorities: ["/etc/pki/root/ca.pem"]
    
      # Certificate for SSL client authentication
      #ssl.certificate: "/etc/pki/client/cert.pem"
    
      # Client Certificate Key
      #ssl.key: "/etc/pki/client/cert.key"

    3.4. Tiếp theo, kích hoạt mô-đun hệ thống Filebeat , mô-đun này sẽ kiểm tra nhật ký hệ thống mà bạn đang cài đặt Filebeat:

    $ sudo filebeat modules enable system
    Enabled system

    3.5. Tiếp theo, load một index template với 192.168.13.205:9200 là ip address và port của Elaticsearch.

     sudo filebeat setup --index-management -E output.logstash.enabled=false -E 'output.elasticsearch.hosts=["192.168.13.205:9200"]'

    Hãy chắc chắn rằng server chạy Filebeat của bạn đã listen được port 9200 của Elaticsearch.

    $ telnet 192.168.13.205 9200
    Trying 192.168.13.205...
    Connected to 192.168.13.205.
    Escape character is '^]'.

    Hệ thống sẽ thực hiện một số công việc, quét hệ thống của bạn và kết nối với bảng điều khiển Kibana của bạn.

    $ sudo filebeat setup --index-management -E output.logstash.enabled=false -E 'output.elasticsearch.hosts=["192.168.13.205:9200"]'
    Overwriting ILM policy is disabled. Set `setup.ilm.overwrite: true` for enabling.
    
    Index setup finished.

    Vào Slack Management.

    Index Management và bạn sẽ thấy Index của bạn đã xuất hiện (2).

    3.6. Khởi động và kích hoạt Filebeat.

    sudo systemctl start filebeat
    sudo systemctl enable filebeat

    Verify lại việc Elasticsearch đã nhận logs từ Filebeat.

    $ curl -XGET http://192.168.13.205:9200/_cat/indices?v
    health status index                             uuid                   pri rep docs.count docs.deleted store.size pri.store.size
    green  open   .kibana_7.13.2_001                jNmjumGZSXe7UaXKG9XNBA   1   1         38           25      8.6mb          4.3mb
    green  open   .apm-custom-link                  8sJMKGWrTte4a4zcIY5Ekw   1   1          0            0       416b           208b
    green  open   .kibana-event-log-7.13.2-000001   xUJfkhouTxqzEcdZaLiCVg   1   1          4            0     43.5kb         21.7kb
    green  open   .apm-agent-configuration          fcETS-NPSaaf7EjCVp_D4Q   1   1          0            0       416b           208b
    green  open   logstash-2022.11.19-000001        OqxqOrGaR96GKhk4WGftOQ   1   1          0            0       416b           208b
    green  open   filebeat-7.17.7-2022.11.19-000001 VPGniisCSsWLLZTfpthkyQ   1   1          0            0       416b           208b
    green  open   .async-search                     enx7QrESSwynJ3jKDpzrSg   1   1          0            0      3.5kb           228b
    green  open   .kibana_task_manager_7.13.2_001   7weCBMJAQp257YRxigEVHQ   1   1         10          764      1.7mb          1.6mb
    green  open   .tasks                            uQ3i-yJ-SLyHNJZUltoZaQ   1   1          6            0     63.7kb         28.9kb

    Sau khi chắc chắn Elaticsearch đã lấy được logs từ Logstash, bạn hãy vào index pattern trên Kibana và tạo 1 pattern mới.

    Lúc này Kibana sẽ hiện ra 1 loạt pattern mà nó define được.

    Mình sẽ fillter để lấy các pattern là filebeat và bấm Next step như hình dưới.

    Mình chọn fillter là timestamp.

    Sau khi add pattern xong, bạn sẽ nhận được các Fields như dưới.

    Để show các logs bạn vào Discover.

    Chọn index là filebeat là xong.

    Nếu có logs bạn sẽ thấy dữ liệu như bên dưới.

    Kết luận

    Bây giờ bạn đã cài đặt xong cụm ELK trên hệ thống Ubuntu. Mình khuyên bạn nên xác định các yêu cầu của mình và bắt đầu điều chỉnh ELK cho phù hợp với nhu cầu của mình. Công cụ phân tích logs mạnh mẽ này có thể được tùy chỉnh cho các trường hợp sử dụng riêng lẻ.

    Tùy chỉnh các luồng dữ liệu với Logstash, sử dụng các mô-đun Beats khác nhau để thu thập các loại dữ liệu khác nhau và sử dụng Kibana để dễ dàng duyệt qua các file nhật ký.

    Tài liệu tham khảo ELK Stack on Docker.

    Bài viết gần đây

    spot_img

    Related Stories

    Leave A Reply

    Please enter your comment!
    Please enter your name here

    Đăng ký nhận thông tin bài viết qua email