Triển khai bộ log tập trung (Centralized logging) với Docker và Kubernettes cho server sử dụng ELK stack.

Tram Ho

ELK stack bao gồm Elasticsearch, LogstashKibana, trong đó Logstash thu thập logs trong các ứng dụng của bạn đưa về lưu trữ trong ElasticsearchKibana sẽ trình diễn chúng trên một giao diện thân thiện với bạn hơn. Ngoài ra để thu thập logs cho Kuberbernettes thì mình sử dụng thêm Fluentd.

I. Thu thập logs từ Docker

Điều kiện cần

Để thuận tiện cho Logstash có thể thu thập logs từ các Docker Container,  đầu tiên hãy sửa logging driver của Docker nằm ở /etc/docker/daemon.json về sử dụng syslog:

Trong đó tcp://127.0.0.1:9600 tương ứng là giao thức TCP để truyền tin đến Logstash được đặt ở IP 127.0.0.1 và port là 9600.

Tìm hiểu thêm ở: Configure logging drivers

Triển khai ELK stack bằng Docker Stack

Docker Stack file và config của ELK mình sử dụng như bên dưới:

Github repository

Chúng ta sẽ deploy thông qua Docker Stack bằng command.

Lưu ý đối với containter Elasticsearch

  • Container của Elasticsearch sẽ mount thư mục /u01/elasticsearch/data từ ngoài máy host vào trong container, thư mục này cần được cấp quyền cho elasticsearch sử dụng được nên cần phải sửa chown cho nó

  • Elasticsearch expose ra 2 cổng 9200, 9300 và sẽ join vào Docker network elk để có thể giao tiếp với các container khác trong cùng network

Lưu ý với container Logstash

File config cho Logstash nằm trong thư mục logstash/ gồm config để giao tiếp với Elasticsearchpipeline để cấu hình luồng logs input và output của Logstash.

Trong phần config pipeline có phần filter sử dụng grok để lọc log gửi về từ Docker container. Grok sẽ tìm field tên là message và thực hiện extract thông tin trong message đó thành 1 object có giá trị, dễ hiểu để sử dụng ở trên Kibana. Trong ví dụ, nếu bạn sử dụng Grok pattern này

Tham khảo thêm Grok pattern debugger tại đây  .

Kibana

Kibana sẽ expose cổng 5601 ra cổng 8601 trên máy host để có thể truy cập tới được.

Sử dụng Kibana
  • B1: User đăng nhập mặc định là elastic, mật khẩu là changeme . tại địa chỉ http://127.0.0.1:8601/

  • B2: Tạoindex pattern để hiển thị log từ Logstash
    Điền logstash-* vào ô Index pattern -> Next step

  • B3: Chọn @timestamp -> Create index pattern

  • B4: Xem logs được đổ về ở http://127.0.0.1:8601/app/kibana#/discover?_g=()
    Ở đây bạn chọn vào nút +Add filter sau đó điền các giá trị như trong hình bên dưới để lọc logs theo tên project. Giá trị Value này là 1 Regex pattern match với các message có chứa thông tin @project.name@.

II. Thu thập logs từ trong Kubernetes.

Sử dụng Fluentd.

Fluentd là một ứng dụng hoàn toàn miễn phí và open-source giúp bạn có thể lấy được log ở web server và xử lý log data đó. Dữ liệu log lấy đươc rất có thể từ nginx, apache hoặc đơn giản là từ các gói tin tcp hay các message của http. Để thu thập logs từ Kubernettes mình sẽ triển khai Fluentd bằng object là DaemonSet.
DaemonSet thường được sử dụng để triển khai 1 service trên tất cả các Pod

Tạo namespace kube-logging

tạo namespace bằng lệnh

Tạo Daemonset Fluentd

Thực hiện tạo DaemonSet bằng command

Trong file cấu hình của fluentd có đoạn cấu hình:

Fluentd sẽ gửi logs về cho Elasticsearch trên server IP thông qua port 9200 được config ở Docker stack bên trên.
Logs sẽ được hiển thị bên trong http://127.0.0.1:8601/

Tạm kết

Trên đây mình vừa đưa ra cấu hình cho ELK và Fluentd để thu thập logs từ Docker và Kubernettes. Tuy nhiên bộ config trên chưa thực sự tối ưu trên môi trường production khi số lượng container, pod đồng thời gửi logs về hệ thống Logs tập trung này nhiều lên, trong bài viết tới, mình sẽ chỉ ra những điểm cần thay đổi, cấu hình cho khả năng scaling của hệ thống.

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo