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
Sau Fluentd
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.
- Ubuntu 14.04 Server
- User có quyền truy cập sudo
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:
- Các hoạt động Elasticsearch cơ bản
- Thêm trang tổng quan để bạn có thể hình dung log của bạn
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:
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:
- Đọc về Lớp ghi log hợp nhất
- Fluentd + Elasticsearch cho Kubernetes của Satnam Singh (người commit Kubernetes)
Các tin liên quan
Hệ sinh thái Docker: Giới thiệu về các thành phần chung2015-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