Thứ sáu, 16/12/2016 | 00:00 GMT+7

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

Khi bạn đưa các containers Docker vào production , bạn sẽ thấy nhu cầu ngày càng tăng để duy trì các bản ghi ở một nơi nào đó ít phù du hơn containers . Docker đi kèm với trình điều khiển ghi log root cho Fluentd, giúp bạn dễ dàng thu thập các log đó và định tuyến chúng đến một nơi khác, như Elasticsearch , để bạn có thể phân tích dữ liệu.

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

Fluentd là trình thu thập dữ liệu open-souce được thiết kế để thống nhất cơ sở hạ tầng ghi log của bạn. Nó 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.

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 phải sử dụng 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, thao tác dữ liệu khi cần thiết. Bằng cách sử dụng các plugin, bạn có thể sử dụng tốt hơn các log của bạn ngay lập tức.
  • Tài nguyên Tối thiểu Yêu cầu: Một bộ thu thập dữ liệu phải nhẹ để nó chạy 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.

Trong hướng dẫn này, bạn sẽ học cách cài đặt Fluentd và cấu hình nó để thu thập log từ các containers Docker. Sau đó, bạn sẽ truyền dữ liệu đến một containers khác đang chạy Elasticsearch trên cùng một server Ubuntu 16.04 và truy vấn log .

Yêu cầu

Để hoàn thành hướng dẫn này, bạn cần những thứ sau:

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

Cách phổ biến nhất để cài đặt Fluentd là thông qua gói td-agent . Treasure Data , tác giả ban đầu của Fluentd, gói Fluentd với thời gian chạy Ruby khép kín, do đó bạn không cần cài đặt môi trường Ruby để chạy Fluentd. Họ cũng cung cấp một tập lệnh để lấy gói td-agent mới nhất cấu hình repository và cài đặt gói cho bạn.

Đăng nhập vào server của bạn với quyền là user không phải root của bạn:

  • ssh sammy@your_server_ip

Sau đó cài đặt td-agent bằng cách sử dụng script do Treasure Data cung cấp. Đầu tiên, hãy download tập lệnh:

  • \curl -L http://toolbelt.treasuredata.com/sh/install-ubuntu-xenial-td-agent2.sh -o install-td-agent.sh

Nếu bạn muốn kiểm tra tập lệnh, hãy mở nó bằng editor của bạn:

  • nano install-td-agent.sh

Khi bạn đã hài lòng với nội dung của tập lệnh, hãy chạy tập lệnh để cài đặt td-agent :

  • sh install-td-agent.sh

Khi quá trình cài đặt kết thúc, hãy bắt đầu td-agent :

  • sudo systemctl start td-agent

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:

Output
port 8888 </source> <source> @type debug_agent bind 127.0.0.1 port 24230 </source> </ROOT> 2016-12-02 19:45:31 +0000 [info]: listening fluent socket on 0.0.0.0:24224 2016-12-02 19:45:31 +0000 [info]: listening dRuby uri="druby://127.0.0.1:24230" object="Engine"

Tiếp theo, cài đặt plugin Elasticsearch cho Fluentd bằng lệnh td-agent-gem :

  • sudo td-agent-gem install fluent-plugin-elasticsearch

Lưu ý: Ngoài ra, Fluentd có sẵn dưới dạng viên ngọc Ruby và có thể được cài đặt bằng gem install fluentd . Nếu bạn đã cấu hình môi trường Ruby, bạn có thể cài đặt Fluentd và plugin Elasticsearch bằng lệnh gem :

  • gem install fluentd --no-rdoc --no-ri
  • gem install fluentd-plugin-elasticsearch --no-rdoc --no-ri

Fluentd hiện đã hoạt động với cấu hình mặc định. Tiếp theo, ta sẽ cấu hình Fluentd để ta có thể lắng nghe các sự kiện Docker và chuyển chúng đến một version Elasticsearch.

Bước 2 - Cấu hình Fluentd

Fluentd cần biết thu thập thông tin từ đâu và cung cấp thông tin ở đâu. Bạn xác định các luật này trong file cấu hình Fluentd có tại /etc/td-agent/td-agent.conf .

Mở file này trong editor của bạn:

  • sudo nano /etc/td-agent/td-agent.conf

Xóa nội dung của file . Bạn sẽ viết các luật của riêng mình từ đầu trong hướng dẫn này.

Bạn xác định nguồn thông tin trong phần source . Thêm cấu hình này vào file :

/etc/td-agent/td-agent.conf
<source>   @type forward   port  24224 </source> 

Điều này xác định nguồn là forward , là giao thức Fluentd chạy trên TCP và sẽ được Docker sử dụng khi gửi log đến Fluentd.

Khi các bản ghi log được đưa vào, chúng sẽ có thêm một số trường liên quan, bao gồm time , tag , message , container_id và một vài trường khác. Bạn sử dụng thông tin trong trường _tag_ để quyết định nơi Fluentd sẽ gửi dữ liệu đó. Đây được gọi là định tuyến dữ liệu .

Để cấu hình này, xác định một match phần đó phù hợp với nội dung của tag lĩnh vực và tuyến đường nó một cách thích hợp. Thêm cấu hình này vào file :

/etc/td-agent/td-agent.conf
<match docker.**>   @type elasticsearch   logstash_format true   host 127.0.0.1   port 9200   flush_interval 5s </match> 

Luật này nói rằng mọi bản ghi có thẻ bắt đầu bằng docker. sẽ được gửi đến Elasticsearch, đang chạy trên 127.0.0.1 trên cổng 9200 . flush_interval cho Fluentd biết tần suất nó sẽ ghi vào Elasticsearch.

Để biết thêm chi tiết về đệm và xả, vui lòng tham khảo phần tài liệu tổng quan về plugin đệm .

Sau khi bạn lưu file cấu hình mới, hãy khởi động lại dịch vụ td-agent để các thay đổi được áp dụng:

  • sudo systemctl restart td-agent

Bây giờ Fluentd đã được cấu hình đúng cho mục đích của ta , hãy cài đặt Elasticsearch để ghi lại log của ta từ Fluentd.

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

Ta sẽ sử dụng Docker để chạy version Elasticsearch của bạn , vì nó nhanh hơn so với việc tự cấu hình . Ta sẽ sử dụng hình ảnh Elasticsearch Docker để tạo containers của ta . Để sử dụng hình ảnh này, hãy tăng giá trị của max_map_count trên server Docker của bạn như sau:

  • sudo sysctl -w vm.max_map_count=262144

Sau đó, thực hiện lệnh này để download hình ảnh Elasticsearch và khởi động containers :

  • docker run -d -p 9200:9200 -p 9300:9300 elasticsearch

Hình ảnh sẽ download và containers Elasticsearch sẽ bắt đầu. Đảm bảo rằng containers đang chạy bình thường bằng cách kiểm tra các quy trình Docker và tìm containers :

  • docker ps

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

Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 76e96943491f elasticsearch "/docker-entrypoint.s" About a minute ago Up 51 seconds 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp gigantic_hawking

Nếu containers không được liệt kê, hãy khởi động lại nó mà không cần chuyển đổi -d để containers chạy ở nền trước. Chạy trình kết nối lệnh docker run -p 9200:9200 -p 9300:9300 elasticsearch và tìm bất kỳ thông báo lỗi cụ thể nào. Các lỗi có thể xảy ra nhất mà bạn sẽ gặp phải là sự cố không có đủ bộ nhớ hệ thống hoặc giá trị max_map_count trên server Docker của bạn quá thấp. Kiểm tra tất cả các bước trong hướng dẫn này đảm bảo bạn không bỏ lỡ bất kỳ điều gì và thử lại.

Bây giờ Elasticsearch đang chạy trong containers , hãy tạo một số log và nhập chúng vào Fluentd.

Bước 4 - Tạo Nhật ký từ Docker Container

Với Docker, bạn có thể coi các bản ghi như một stream dữ liệu thông qua giao diện kết quả chuẩn ( STDOUT ) và lỗi ( STDERR ). Khi bạn khởi động ứng dụng Docker, chỉ cần hướng dẫn Docker xóa log bằng trình điều khiển ghi log Fluentd root . Sau đó, dịch vụ Fluentd sẽ nhận các bản ghi và gửi chúng đến Elasticsearch.

Kiểm tra điều này bằng cách bắt đầu lệnh Bash bên trong containers Docker như sau:

  • docker run --log-driver=fluentd ubuntu /bin/echo 'Hello world'

Thao tác này sẽ in thông báo Hello world ra kết quả tiêu chuẩn, nhưng nó cũng sẽ bị trình điều khiển Docker Fluentd bắt và gửi đến dịch vụ Fluentd mà bạn đã cấu hình trước đó. Sau khoảng năm giây, các bản ghi sẽ được chuyển đến Elasticsearch. Bạn đã cấu hình khoảng thời gian này trong phần match của file cấu hình Fluentd của bạn .

Điều này là đủ để chuyển log sang Elasticsearch, nhưng bạn có thể cần xem tài liệu chính thức để biết thêm chi tiết về các tùy chọn bạn có thể sử dụng với Docker để quản lý trình điều khiển Fluentd.

Cuối cùng, hãy xác nhận Elasticsearch đang nhận các sự kiện. Sử dụng curl để gửi một truy vấn đến Elasticsearch:

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

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

{"took":2,"timed_out":false,"_shards":{"total":1,"successful":1,"failed":0},"hits":{"total":1,"max_score":1.0,"hits":[{"_index":"logstash-2016.12.02","_type":"fluentd","_id":"AVQwUi-UHBhoWtOFQKVx","_score":1.0,"_source":{"container_id":"d16af3ad3f0d361a1764e9a63c6de92d8d083dcc502cd904155e217f0297e525","container_name":"/nostalgic_torvalds","source":"stdout","log":"Hello world","@timestamp":"2016-12-02T14:59:26-06: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. Nó cũng sẽ chứa một số thông tin bổ sung được liên kết với containers nguồn. Như kết quả này hiển thị, Elasticsearch đang nhận dữ liệu từ containers Docker của ta .

Kết luận

Thu thập log từ containers Docker chỉ là một cách để sử dụng Fluentd. 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 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ữ. Ví dụ: bạn có thể sử dụng Elasticsearch để tìm kiếm thời gian thực, nhưng sử dụng MongoDB hoặc Hadoop để phân tích hàng loạt và lưu trữ lâu dài.

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 có thể gây ra vấn đề vì hai lý do. Đầu tiên, các bản ghi rất khó phân tích cú pháp theo chương trình, đòi hỏi nhiều biểu thức chính quy 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ê, xem xét kết quả kiểm tra A / B hoặc thực hiện phát hiện gian lận sẽ không dễ tiếp cận.

Thứ hai, log không thể truy cập 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ữ. Tệ hơn nữa, 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 cả hai 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ản ghi chứa dấu thời gian, thẻ và sự kiện có định dạng JSON tới Fluentd, giống như bản ghi bạn đã thấy trong hướng dẫn này. Có các thư viện trình ghi log cho Ruby, Node.js, Go, Python, Perl, PHP, Java và C ++. Điều này cho phép các ứng dụng "kích hoạt và quên"; trình ghi log gửi dữ liệu đến Fluentd một cách không đồng bộ, do đó sẽ đệm các log trước khi chuyển chúng đến các hệ thống backend .

Có rất nhiều điều hữu ích khác mà bạn có thể làm với Fluentd và Elasticsearch. Bạn có thể thấy các liên kết sau thú vị:


Tags:

Các tin liên quan

Cách làm việc với Docker Data Volumes trên Ubuntu 14.04
2016-11-17
Làm việc với Docker Containers
2016-11-04
Cách cấu hình môi trường kiểm tra tích hợp liên tục với Docker và Docker Compose trên Ubuntu 14.04
2016-11-03
Cách cấu hình môi trường kiểm tra tích hợp liên tục với Docker và Docker Compose trên Ubuntu 16.04
2016-11-03
Cách cài đặt và sử dụng Docker trên CentOS 7
2016-11-02
Cách gỡ lỗi và khắc phục các sự cố thường gặp của Docker
2016-10-20
Cách cài đặt Prometheus bằng Docker trên CentOS 7
2016-01-15
Cách cài đặt Prometheus bằng Docker trên Ubuntu 14.04
2016-01-12
Cách cài đặt Wordpress và PhpMyAdmin với Docker Compose trên Ubuntu 14.04
2015-11-19
Cách cài đặt và sử dụng Docker Compose trên Ubuntu 14.04
2015-11-19