Thứ hai, 30/03/2015 | 00:00 GMT+7

Cách tập trung log Docker của bạn với Fluentd và ElasticSearch trên Ubuntu 14.04

Fluentd là gì?

Một bài báo từ Fluentd

Fluentd là một bộ thu thập dữ liệu open-souce được thiết kế để thống nhất cơ sở hạ tầng ghi log . Nó được thiết kế để tập hợp các kỹ sư vận hành, kỹ sư ứng dụng và kỹ sư dữ liệu lại với nhau bằng cách làm cho việc thu thập và lưu trữ log trở nên đơn giản và có thể mở rộng.

Trước Fluentd

Cấu trúc ghi log  lộn xộn cho thấy mối quan hệ giữa nhiều chương trình

Sau Fluentd

Fluentd thu thập log  ứng dụng và truy cập từ nhiều nguồn và chuyển chúng thành nhiều kết quả phân tích, lưu trữ và số liệu

Các tính năng chính

Fluentd có bốn tính năng chính làm cho nó phù hợp để xây dựng các đường ống ghi log sạch, tin cậy :

  • Ghi log hợp nhất với JSON: Fluentd cố gắng cấu trúc dữ liệu JSON nhiều nhất có thể. Điều này cho phép Fluentd thống nhất tất cả các khía cạnh của quá trình xử lý dữ liệu log : thu thập, lọc, lưu vào cache và xuất log qua nhiều nguồn và đích. Việc xử lý dữ liệu xuôi dòng dễ dàng hơn nhiều với JSON, vì nó có đủ cấu trúc để có thể truy cập được mà không buộc các schemas cứng nhắc
  • Kiến trúc Pluggable: Fluentd có một hệ thống plugin linh hoạt cho phép cộng đồng mở rộng chức năng của nó. Hơn 300 plugin do cộng đồng đóng góp kết nối hàng chục nguồn dữ liệu với hàng chục kết quả kết quả dữ liệu, xử lý dữ liệu khi cần thiết. Bằng cách sử dụng plugin, bạn có thể sử dụng log của bạn tốt hơn ngay lập tức
  • Yêu cầu tài nguyên tối thiểu: Một bộ thu thập dữ liệu phải nhẹ để user có thể chạy nó thoải mái trên một máy bận. Fluentd được viết bằng sự kết hợp của C và Ruby, và yêu cầu tài nguyên hệ thống tối thiểu. Phiên bản vani chạy trên bộ nhớ 30-40MB và có thể xử lý 13.000 sự kiện / giây / lõi
  • Độ tin cậy tích hợp: Việc mất dữ liệu sẽ không bao giờ xảy ra. Fluentd hỗ trợ cache dựa trên bộ nhớ và file để ngăn mất dữ liệu giữa các node . Fluentd cũng hỗ trợ chuyển đổi dự phòng mạnh mẽ và có thể được cài đặt để có tính khả dụng cao

Mục tiêu: Thu thập log containers Docker tập trung với Fluentd

Khi các container Docker được triển khai trong quá trình production , nhu cầu ngày càng tăng phải lưu giữ log của các container ở một nơi nào đó ít lâu dài hơn so với các container .

Trong hướng dẫn này, ta sẽ chỉ cho bạn cách cài đặt Fluentd và sử dụng nó để thu thập log từ các containers Docker, lưu trữ chúng bên ngoài để dữ liệu có thể được lưu sau khi các containers đã ngừng hoạt động. Ta sẽ truyền dữ liệu đến một containers khác đang chạy Elasticsearch, trên cùng một server Ubuntu 14.04.

Như đã nêu trong repo GitHub của Kubernetes , kiến trúc này sử dụng khả năng của Fluentd để điều chỉnh và phân tích cú pháp các file log JSON trên mỗi dòng do Docker daemon tạo ra cho mỗi containers . Để có một cài đặt tối thiểu, vui lòng xem công thức này .

Ở phần cuối của hướng dẫn này, ta sẽ thảo luận về hai trường hợp sử dụng khác. Sau khi đọc bài viết này, bạn nên biết những điều cơ bản về cách sử dụng Fluentd.

Yêu cầu

Hãy đảm bảo bạn hoàn thành các yêu cầu này cho hướng dẫn.

Bước 1 - Cài đặt Fluentd

Cách phổ biến nhất để triển khai Fluentd là thông qua gói td-agent . Treasure Data, tác giả ban đầu của Fluentd, đóng gói Fluentd với thời gian chạy Ruby của riêng nó để user không cần cài đặt Ruby của riêng họ để chạy Fluentd.

Hiện tại, td-agent hỗ trợ các nền tảng sau:

  • Ubuntu: Linh hoạt, Chính xác và Đáng tin cậy
  • Debian: Wheezy và Squeeze
  • RHEL / Centos: 5, 6 và 7
  • Mac OSX: 10.9 trở lên

Trong hướng dẫn này, ta giả sử bạn đang sử dụng DigitalOcean Server chạy Ubuntu 14.04 LTS (Trusty).

Cài đặt td-agent bằng lệnh sau:

curl -L http://toolbelt.treasuredata.com/sh/install-ubuntu-trusty-td-agent2.sh | sh 

Bắt đầu td-agent :

sudo /etc/init.d/td-agent start 

Kiểm tra log đảm bảo rằng nó đã được cài đặt thành công:

tail /var/log/td-agent/td-agent.log 

Bạn sẽ thấy kết quả tương tự như sau:

    port 24230   </source> </ROOT> 2015-02-22 18:27:45 -0500 [info]: adding source type="forward" 2015-02-22 18:27:45 -0500 [info]: adding source type="http" 2015-02-22 18:27:45 -0500 [info]: adding source type="debug_agent" 2015-02-22 18:27:45 -0500 [info]: adding match pattern="td.*.*" type="tdlog" 2015-02-22 18:27:45 -0500 [info]: adding match pattern="debug.**" type="stdout" 2015-02-22 18:27:45 -0500 [info]: listening fluent socket on 0.0.0.0:24224 2015-02-22 18:27:45 -0500 [info]: listening dRuby uri="druby://127.0.0.1:24230" object="Engine" 

Lưu ý: Ngoài ra, Fluentd có sẵn dưới dạng đá quý Ruby và có thể được cài đặt bằng gem install fluentd . Nếu bạn KHÔNG có quyền sudo, vui lòng cài đặt Ruby (ví dụ: xem Cài đặt Ruby tại đây) và chạy:

gem install fluentd --no-rdoc --no-ri 

Bước 2 - Cài đặt Docker

Bây giờ ta sẽ cài đặt Docker. Hướng dẫn này đã được thử nghiệm với Docker v1.5.0.

Thêm khóa cho repository Docker để ta có thể nhận được gói Docker cập nhật:

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9 

Thêm repository vào các nguồn của bạn:

sudo sh -c "echo deb https://get.docker.com/ubuntu docker main > /etc/apt/sources.list.d/docker.list" 

Cập nhật hệ thống của bạn:

sudo apt-get update 

Cài đặt Docker:

sudo apt-get install lxc-docker 

Xác minh Docker đã được cài đặt bằng cách kiểm tra version :

docker --version 

Bạn sẽ thấy kết quả như sau:

Docker version 1.5.0, build a8a31ef 

Bước 3 - Thêm user vào group docker

Docker chạy dưới quyền root , vì vậy để đưa ra các lệnh docker , hãy thêm user sudo của bạn vào group docker . Thay thế sammy bằng user mà bạn chọn.

sudo gpasswd -a sammy docker 

Sau đó, khởi động lại Docker.

sudo service docker restart 

Cuối cùng, nếu bạn hiện đang đăng nhập với quyền user sudo của bạn , bạn phải đăng xuất và đăng nhập lại.

Bước 4 - Xây dựng Hình ảnh Fluentd

Trong phần này, ta sẽ tạo Docker image cho containers Fluentd Docker. Nếu bạn muốn tìm hiểu thêm về Docker nói chung, vui lòng đọc hướng dẫn giới thiệu này .

Tạo một folder mới cho các tài nguyên Fluentd Docker của bạn và chuyển vào đó:

mkdir ~/fluentd-docker && cd ~/fluentd-docker 

Tạo Dockerfile sau:

sudo nano Dockerfile 

Thêm chính xác các nội dung sau vào file của bạn. Tệp này yêu cầu Docker cập nhật containers Docker và cài đặt Ruby, Fluentd và Elasticsearch:

FROM ruby:2.2.0 MAINTAINER kiyoto@treausuredata.com RUN apt-get update RUN gem install fluentd -v "~>0.12.3" RUN mkdir /etc/fluent RUN apt-get install -y libcurl4-gnutls-dev make RUN /usr/local/bin/gem install fluent-plugin-elasticsearch ADD fluent.conf /etc/fluent/ ENTRYPOINT ["/usr/local/bundle/bin/fluentd", "-c", "/etc/fluent/fluent.conf"] 

Bạn cũng cần phải tạo một file thông fluent.conf trong cùng một folder .

sudo nano fluent.conf 

Tệp thông fluent.conf sẽ trông như thế này. Bạn có thể sao chép chính xác file này:

<source>   type tail   read_from_head true   path /var/lib/docker/containers/*/*-json.log   pos_file /var/log/fluentd-docker.pos   time_format %Y-%m-%dT%H:%M:%S   tag docker.*   format json </source> # Using filter to add container IDs to each event <filter docker.var.lib.docker.containers.*.*.log>   type record_transformer   <record>     container_id ${tag_parts[5]}   </record> </filter>  <match docker.var.lib.docker.containers.*.*.log>   type elasticsearch   logstash_format true   host "#{ENV['ES_PORT_9200_TCP_ADDR']}" # dynamically configured to use Docker's link feature   port 9200   flush_interval 5s </match> 

Mục đích của file này là cho Fluentd biết nơi tìm log cho các containers Docker khác.

Sau đó, xây dựng Docker image của bạn, được gọi là fluentd-es :

docker build -t fluentd-es . 

Quá trình này sẽ mất vài phút để hoàn thành. Kiểm tra xem bạn đã tạo thành công các hình ảnh chưa:

docker images 

Bạn sẽ thấy kết quả như thế này:

REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE fluentd-es          latest              89ba1fb47b23        2 minutes ago       814.1 MB ruby                2.2.0               51473a2975de        6 weeks ago         774.9 MB 

Bước 5 - Khởi động containers Elasticsearch

Bây giờ hãy quay lại folder chính hoặc folder ưa thích cho containers Elasticsearch của bạn:

cd ~ 

Download và khởi động containers Elasticsearch. Đã có một bản dựng tự động cho việc này:

docker run -d -p 9200:9200 -p 9300:9300 --name es dockerfile/elasticsearch 

Chờ containers images download và bắt đầu.

Tiếp theo, hãy đảm bảo containers Elasticsearch đang chạy đúng cách bằng cách kiểm tra các quy trình Docker:

docker ps 

Bạn sẽ thấy kết quả như thế này:

CONTAINER ID        IMAGE                           COMMAND             CREATED             STATUS              PORTS                                           NAMES c474fd99ce43        dockerfile/elasticsearch:latest   "/elasticsearch/bin/   4 minutes ago      Up 4 minutes        0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp   es 

Bước 6 - Khởi động Vùng chứa Fluentd-to-Elasticsearch

Bây giờ ta sẽ bắt đầu containers chạy Fluentd, thu thập log và gửi chúng đến Elastcisearch.

docker run -d --link es:es -v /var/lib/docker/containers:/var/lib/docker/containers fluentd-es 

Trong lệnh trên, phần --link es:es liên kết containers Elasticsearch với containers Fluentd. Phần -v /var/lib/docker/containers:/var/lib/docker/containers là cần thiết để mount folder log của containers server vào containers Fluentd, để Fluentd có thể điều chỉnh các file log khi containers được tạo.

Cuối cùng, hãy kiểm tra xem containers có đang chạy hay không bằng cách kiểm tra các quy trình Docker đang hoạt động của ta :

docker ps 

Lần này, bạn sẽ thấy cả containers Elasticsearch và containers thông fluentd-es mới:

CONTAINER ID        IMAGE                           COMMAND             CREATED             STATUS              PORTS                                           NAMES f0d2cac81ac8        fluentd-es:latest               "/usr/local/bundle/b   2 seconds ago    Up 2 seconds                                                        stupefied_brattain c474fd99ce43        dockerfile/elasticsearch:latest   "/elasticsearch/bin/   6 minutes ago      Up 6 minutes        0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp   es 

Bước 7 - Xác nhận Elasticsearch đang nhận sự kiện

Cuối cùng, hãy xác nhận Elasticsearch đang nhận các sự kiện:

curl -XGET 'http://localhost:9200/_all/_search?q=*' 

Đầu ra phải chứa các sự kiện giống như sau:

{"took":66,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":0,"max_score":null,"hits":[]}} {"took":59,"timed_out":false,"_shards":{"tod","_id":"AUwLaKjcnpi39wqZnTXQ","_score":1.0,"_source":{"log":"2015-03-12 00:35:44 +0000 [info]: following tail of /var/lib/docker/containers/6abeb6ec0019b2198ed708315f4770fc7ec6cc44a10705ea59f05fae23b81ee9/6abeb6ec0019b2198ed708315f4770fc7ec6cc44a10705ea59f05fae23b81ee9-json.log\n","stream":"stdout","container_id":"6abeb6ec0019b2198ed708315f4770fc7ec6cc44a10705ea59f05fae23b81ee9","@timestamp":"2015-03-12T00:35:44+00:00"}}]}} 

Bạn có thể có khá nhiều sự kiện được ghi lại tùy thuộc vào cài đặt của bạn. Một sự kiện phải bắt đầu bằng {"took": và kết thúc bằng dấu thời gian.

Như kết quả này hiển thị, Elasticsearch đang nhận dữ liệu. (ID containers của bạn sẽ khác với ID được hiển thị ở trên!)

Bước 8 - Đưa log sự kiện lên cấp độ tiếp theo

Bây giờ các sự kiện containers của bạn đang được Elasticsearch lưu, bạn nên làm gì tiếp theo? Có rất nhiều điều hữu ích để làm với Elasticsearch. Nếu bạn đang tìm kiếm ý tưởng, bạn có thể cần xem:

Kết luận

Thu thập log từ containers Docker chỉ là một cách để sử dụng Fluentd. Trong phần này, ta sẽ trình bày hai trường hợp sử dụng phổ biến khác cho Fluentd.

Trường hợp sử dụng 1: Tìm kiếm log theo thời gian thực và lưu trữ log

Nhiều user đến với Fluentd để xây dựng một đường dẫn ghi log thực hiện cả tìm kiếm log trong thời gian thực và lưu trữ lâu dài. Kiến trúc trông như thế này:

Tạo các bản ghi từ nhiều phần  backend  đến Elasticsearch, MongoDB và Hadoop

Kiến trúc này tận dụng khả năng sao chép stream dữ liệu của Fluentd và xuất chúng ra nhiều hệ thống lưu trữ. Trong cài đặt trên, Elasticsearch được sử dụng để tìm kiếm trong thời gian thực, trong khi MongoDB và / hoặc Hadoop được sử dụng để phân tích hàng loạt và lưu trữ lâu dài.

Trường hợp sử dụng 2: Ghi log ứng dụng tập trung

Các ứng dụng web tạo ra rất nhiều log và chúng thường được định dạng tùy ý và được lưu trữ trên hệ thống file local . Điều này là xấu vì hai lý do:

  • Các bản ghi rất khó phân tích cú pháp theo chương trình (yêu cầu nhiều cụm từ thông dụng) và do đó, những người muốn hiểu hành vi của user thông qua phân tích thống kê (thử nghiệm A / B, phát hiện gian lận, v.v.) không thể truy cập được.
  • Không thể truy cập log trong thời gian thực vì log văn bản được tải hàng loạt vào hệ thống lưu trữ. Ngoài ra, nếu đĩa của server bị hỏng giữa các lần tải hàng loạt, các bản ghi sẽ bị mất hoặc bị hỏng

Fluentd giải quyết những vấn đề này bằng cách:

  • Cung cấp thư viện trình ghi log cho các ngôn ngữ lập trình khác nhau với một API nhất quán: mỗi trình ghi log gửi một bộ ba (dấu thời gian, thẻ, sự kiện được định dạng JSON) đến Fluentd. Hiện tại, có các thư viện trình ghi log cho Ruby, Node.js, Go, Python, Perl, PHP, Java và C ++
  • Cho phép ứng dụng "kích hoạt và quên": trình ghi log có thể đăng nhập không đồng bộ vào Fluentd, do đó, cache các log trước khi tải lên hệ thống backend

Tài nguyên:


Tags:

Các tin liên quan

Hệ sinh thái Docker: Giới thiệu về các thành phần chung
2015-02-01
Hệ sinh thái Docker: Tổng quan về Containerization
2015-02-01
Hệ sinh thái Docker: Lập lịch và Điều phối
2015-02-01
Hệ sinh thái Docker: Khám phá dịch vụ và Cửa hàng cấu hình phân tán
2015-02-01
Hệ sinh thái Docker: Mạng và Truyền thông
2015-02-01
Cách thiết lập registry Docker riêng trên Ubuntu 14.04
2014-10-15
Cách thực hiện kiểm tra tích hợp liên tục với Drone.io trên CoreOS và Docker
2014-10-08