Giới thiệu.
Bài hướng dẫn này sẽ hướng dẫn cách thiết lập một TIG stack sử dụng Docker-compose. TIG stack là một bộ công cụ giám sát và phân tích dữ liệu bao gồm Telegraf, InfluxDB và Grafana.
TIG stack là gì?
- Telegraf — Data Collection
- InfluxDB — Data Storage
- Grafana — Data Visualiztion
- InfluxDB: Được sử dụng như một cơ sở dữ liệu thời gian thực (Time Series Database). Nó là một cơ sở dữ liệu mã nguồn mở được thiết kế để lưu trữ và truy xuất dữ liệu thời gian thực nhanh chóng và có khả năng sẵn sàng cao. InfluxDB được phát triển bằng Go, đặc biệt hữu ích cho việc giám sát hoạt động, số liệu ứng dụng và phân tích thời gian thực.
- Telegraf: Hoạt động như một agent chịu trách nhiệm thu thập và báo cáo số liệu và dữ liệu. Là một server agent dựa trên plugin trong TIG Stack, Telegraf xuất sắc trong việc thu thập và báo cáo số liệu. Nó tích hợp với nhiều nguồn khác nhau, bao gồm các container và hệ thống mà nó hoạt động trên, lấy số liệu từ các API của bên thứ ba và lắng nghe số liệu thông qua các dịch vụ StatsD và Kafka consumer. Ngoài ra, Telegraf hỗ trợ các plugin đầu ra để gửi số liệu đến các cửa hàng dữ liệu, dịch vụ và hàng đợi tin nhắn khác nhau, bao gồm nhưng không giới hạn ở InfluxDB, Graphite, OpenTSDB, Datadog, Librato, Kafka, MQTT, NSQ và nhiều hơn nữa.
- Grafana: Là một bộ công cụ phân tích và trực quan hóa số liệu mã nguồn mở, thường được sử dụng để trực quan hóa dữ liệu thời gian thực liên quan đến phân tích cơ sở hạ tầng và ứng dụng. Tuy nhiên, nó được sử dụng trong nhiều lĩnh vực khác nhau như cảm biến công nghiệp, tự động hóa nhà, giám sát thời tiết và kiểm soát quy trình. Công cụ này cung cấp các bảng điều khiển hấp dẫn và phân tích số liệu, cho phép người dùng quản lý và tạo các bảng điều khiển tùy chỉnh cho các ứng dụng hoặc giám sát hiệu suất cơ sở hạ tầng.
Loạt bài hướng dẫn này sẽ hướng dẫn bạn cách tự động hóa quá trình cấu hình để thiết lập một TIG stack một cách dễ dàng và gần như không cần can thiệp. Qua loạt bài hướng dẫn này, bạn sẽ học cách giám sát hiệu quả các container Docker, thu thập thông tin về việc sử dụng tài nguyên như các số liệu về bộ nhớ và CPU.
Thiết lập ban đầu Docker Compose.
Telegraf.
Cách thiết lập một dịch vụ Telegraf trong Docker Compose như sau:
telegraf:
image: telegraf
container_name: telegraf
restart: always
volumes:
- ./telegraf.conf:/etc/telegraf/telegraf.conf:ro
- /var/run/docker.sock:/var/run/docker.sock
depends_on:
- influxdb
links:
- influxdb
ports:
- '8125:8125'
telegraf:
: Đặt tên dịch vụ là “telegraf”.image: telegraf
: Chỉ định hình ảnh Docker sẽ được sử dụng, trong trường hợp này là “telegraf”.container_name: telegraf
: Đặt tên cho container là “telegraf”.restart: always
: Cấu hình container để luôn khởi động lại tự động.volumes:
: Chỉ định ánh xạ volume cho container../telegraf.conf:/etc/telegraf/telegraf.conf:ro
: Mount file “./telegraf.conf” vào container tại “/etc/telegraf/telegraf.conf” ở chế độ chỉ đọc./var/run/docker.sock:/var/run/docker.sock
: Mount socket Docker từ máy chủ vào container, cho phép Telegraf thu thập số liệu từ Docker.depends_on:
: Chỉ ra rằng container này phụ thuộc vào một dịch vụ khác, trong trường hợp này là “influxdb”.links:
: Thiết lập một liên kết đến dịch vụ “influxdb”.ports:
: Ánh xạ cổng giữa máy chủ và container.8125:8125
: Ánh xạ cổng 8125 trên máy chủ đến cổng 8125 trong container, cho phép truy cập vào bộ thu thập số liệu của Telegraf.
Cấu hình này thiết lập một container Telegraf với các cài đặt, phụ thuộc và cấu hình cụ thể cho việc thu thập dữ liệu và giao tiếp với dịch vụ InfluxDB.
InfluxDB.
Cách thiết lập một dịch vụ InfluxDB trong Docker Compose.
influxdb:
image: influxdb:1.8-alpine
container_name: influxdb
restart: always
environment:
- INFLUXDB_DB=influx
- INFLUXDB_ADMIN_USER=admin
- INFLUXDB_ADMIN_PASSWORD=admin
ports:
- '8086:8086'
volumes:
- influxdb_data:/var/lib/influxdb
influxdb:
: Đặt tên dịch vụ là “influxdb”.image: influxdb:1.8-alpine
: Chỉ định image Docker sẽ được sử dụng, trong trường hợp này là InfluxDB phiên bản 1.8 với image cơ sở Alpine Linux.container_name: influxdb
: Đặt tên cho container là “influxdb”.restart: always
: Cấu hình container để luôn khởi động lại tự động.environment:
: Đặt các biến môi trường cho container InfluxDB.INFLUXDB_DB=influx
: Định nghĩa tên của cơ sở dữ liệu InfluxDB là “influx”.INFLUXDB_ADMIN_USER=admin
: Chỉ định tên người dùng quản trị là “admin”.INFLUXDB_ADMIN_PASSWORD=admin
: Đặt mật khẩu quản trị là “admin”.ports:
: Ánh xạ cổng giữa máy chủ và container.8086:8086
: Ánh xạ cổng 8086 trên máy chủ đến cổng 8086 trong container. Cổng 8086 là cổng mặc định cho API HTTP của InfluxDB.volumes:
: Chỉ định ánh xạ volume cho container.influxdb_data:/var/lib/influxdb
: Tạo một volume có tên là “influxdb_data” và mount nó vào thư mục “/var/lib/influxdb” trong container. Đây là nơi InfluxDB lưu trữ dữ liệu của mình.
Grafana.
Cách thiết lập một dịch vụ Grafana trong Docker Compose.
grafana:
image: grafana/grafana
container_name: grafana
restart: always
depends_on:
- influxdb
environment:
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD=admin
- GF_INSTALL_PLUGINS=
links:
- influxdb
ports:
- '3000:3000'
volumes:
- grafana_data:/var/lib/grafana
grafana:
: Đặt tên dịch vụ là “grafana”.image: grafana/grafana
: Chỉ định image Docker sẽ được sử dụng, trong trường hợp này là “grafana/grafana”.container_name: grafana-server
: Đặt tên cho container là “grafana-server”.restart: always
: Cấu hình container để luôn khởi động lại tự động.depends_on:
: Chỉ ra rằng container này phụ thuộc vào một dịch vụ khác, trong trường hợp này là “influxdb”. Điều này đảm bảo rằng dịch vụ InfluxDB sẽ được khởi động trước Grafana.environment:
: Đặt các biến môi trường cho container Grafana.GF_SECURITY_ADMIN_USER=admin
: Đặt người dùng quản trị Grafana là “admin”.GF_SECURITY_ADMIN_PASSWORD=admin
: Đặt mật khẩu cho người dùng quản trị Grafana là “admin”.GF_INSTALL_PLUGINS=
: Chỉ định một giá trị trống cho biến chịu trách nhiệm cài đặt các plugin Grafana trong quá trình khởi động.links:
: Thiết lập một liên kết đến dịch vụ “influxdb”.ports:
: Ánh xạ cổng giữa máy chủ và container.3000:3000
: Ánh xạ cổng 3000 trên máy chủ đến cổng 3000 trong container, cho phép truy cập vào giao diện web của Grafana.volumes:
: Chỉ định ánh xạ volume cho container.grafana_data:/var/lib/grafana
: Tạo một volume Docker có tên là “grafana_data” và mount nó vào container tại “/var/lib/grafana”. Điều này được sử dụng để duy trì dữ liệu của Grafana, đảm bảo rằng dữ liệu được giữ lại ngay cả khi container bị dừng hoặc xóa.
Docker Compose file đầy đủ.
version: '3.6'
services:
telegraf:
image: telegraf
container_name: telegraf
restart: always
volumes:
- ./telegraf.conf:/etc/telegraf/telegraf.conf:ro
- /var/run/docker.sock:/var/run/docker.sock
depends_on:
- influxdb
links:
- influxdb
ports:
- '8125:8125'
influxdb:
image: influxdb:1.8-alpine
container_name: influxdb
restart: always
environment:
- INFLUXDB_DB=influx
- INFLUXDB_ADMIN_USER=admin
- INFLUXDB_ADMIN_PASSWORD=admin
ports:
- '8086:8086'
volumes:
- influxdb_data:/var/lib/influxdb
grafana:
image: grafana/grafana
container_name: grafana
restart: always
depends_on:
- influxdb
environment:
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD=admin
- GF_INSTALL_PLUGINS=
links:
- influxdb
ports:
- '3000:3000'
volumes:
- grafana_data:/var/lib/grafana
volumes:
grafana_data: {}
influxdb_data: {}
Telegraf.config file.
[global_tags]
[agent]
interval = "60s"
round_interval = true
metric_batch_size = 1000
metric_buffer_limit = 10000
collection_jitter = "0s"
flush_interval = "10s"
flush_jitter = "0s"
precision = ""
hostname = "127.0.0.1"
omit_hostname = false
[[outputs.influxdb]]
urls = ["http://influxdb:8086"]
database = "influx"
timeout = "5s"
username = "telegraf"
password = "metricsmetricsmetricsmetrics"
[[inputs.cpu]]
percpu = true
totalcpu = true
collect_cpu_time = false
report_active = false
[[inputs.disk]]
ignore_fs = ["autofs", "binfmt_misc", "cgroup", "configfs", "debugfs", "devfs", "devtmpfs", "devpts", "fusectl", "fuse.lxcfs", "hugetlbfs", "lxcfs", "mqueue", "none", "nsfs", "overlay", "pstore", "shm", "sysfs", "systemd-1", "tracefs", "tmpfs"]
[[inputs.diskio]]
[[inputs.kernel]]
[[inputs.mem]]
[[inputs.processes]]
[[inputs.swap]]
[[inputs.system]]
# Read metrics about docker containers
[[inputs.docker]]
endpoint = "unix:///var/run/docker.sock"
gather_services = false
container_names = []
## Set the source tag for the metrics to the container ID hostname, eg first 12 chars
source_tag = false
## Containers to include and exclude. Collect all if empty. Globs accepted.
container_name_include = []
container_name_exclude = []
## example: container_state_include = ["created", "restarting", "running", "removing", "paused", "exited", "dead"]
## example: container_state_exclude = ["created", "restarting", "running", "removing", "paused", "exited", "dead"]
container_state_include = ["created", "restarting", "running", "removing", "paused", "exited", "dead"]
# container_state_exclude = ["created", "restarting", "running", "removing", "paused", "exited", "dead"]
timeout = "5s"
perdevice = true
total = false
docker_label_include = []
docker_label_exclude = []
## Which environment variables should we use as a tag
tag_env = ["JAVA_HOME", "HEAP_SIZE"]
Cách chạy stack Docker Compose.
Đầu tiên, bạn cần mở Terminal và điều hướng đến thư mục chứa file Docker Compose của bạn. Sau đó, bạn chạy lệnh sau để khởi động tất cả các dịch vụ được định nghĩa trong file Docker Compose:
docker-compose up -d
Sau khi chạy lệnh này, Docker sẽ tải xuống tất cả các image cần thiết (nếu chưa có), tạo các container mới và khởi động chúng.
shell> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a78192533183 grafana/grafana "/run.sh" 2 hours ago Up 2 hours 0.0.0.0:3000->3000/tcp, :::3000->3000/tcp grafana-server
9a55bd69dfd8 telegraf "/entrypoint.sh tele…" 2 hours ago Up 2 hours 8092/udp, 8125/udp, 8094/tcp, 0.0.0.0:8125->8125/tcp, :::8125->8125/tcp telegraf
089e2bfec9f7 influxdb:1.8-alpine "/entrypoint.sh infl…" 2 hours ago Up 2 hours 0.0.0.0:8086->8086/tcp, :::8086->8086/tcp influxdb
Bạn sẽ có thể truy cập Grafana tại địa chỉ <your-machines-ip>:3000, với thông tin đăng nhập mặc định là:
Username: admin
Password: admin
Thay <your-machines-ip> bằng địa chỉ IP của máy bạn. Trên macOS, bạn có thể lấy địa chỉ IP này bằng cách chạy lệnh ifconfig trong Terminal và tìm địa chỉ IP được liệt kê dưới en0 hoặc en1.
Xử lý khi bạn gặp lỗi Error in plugin: permission denied while trying to connect to the Docker daemon socket
.
Lỗi này xảy ra khi Telegraf không có quyền truy cập vào Docker daemon thông qua socket /var/run/docker.sock
. Điều này thường xảy ra khi Telegraf đang chạy dưới một người dùng không có quyền truy cập vào Docker daemon.
shell> docker logs -f telegraf
2024-04-04T06:18:00Z E! [inputs.docker] Error in plugin: permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/info": dial unix /var/run/docker.sock: connect: permission denied
2024-04-04T06:18:00Z E! [inputs.docker] Error in plugin: permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json?filters=%7B%22status%22%3A%7B%22created%22%3Atrue%2C%22dead%22%3Atrue%2C%22exited%22%3Atrue%2C%22paused%22%3Atrue%2C%22removing%22%3Atrue%2C%22restarting%22%3Atrue%2C%22running%22%3Atrue%7D%7D": dial unix /var/run/docker.sock: connect: permission denied
Có một số cách để giải quyết vấn đề này:
- Chạy Telegraf dưới người dùng root: Đây không phải là một giải pháp an toàn vì nó có thể tạo ra các vấn đề bảo mật.
- Thêm người dùng Telegraf vào nhóm Docker: Đây là giải pháp an toàn hơn. Bạn có thể thêm người dùng Telegraf vào nhóm Docker bằng cách sử dụng lệnh sau:
sudo usermod -aG docker telegraf
Thay đổi quyền truy cập của socket Docker: Bạn có thể thay đổi quyền truy cập của socket Docker để cho phép tất cả người dùng truy cập. Tuy nhiên, điều này cũng có thể tạo ra các vấn đề bảo mật.
sudo chmod 666 /var/run/docker.sock
Lưu ý: Bạn nên cân nhắc các vấn đề bảo mật trước khi thực hiện bất kỳ thay đổi nào về quyền truy cập.