7.1 Cấu hình giám sát với Prometheus
Ở bước này, tụi mình sẽ tìm hiểu cách cấu hình giám sát và ghi log cho ứng dụng đa container. Điều này sẽ giúp theo dõi trạng thái và hiệu suất của các dịch vụ, cũng như thu thập và phân tích log để chẩn đoán sự cố.
Mục tiêu: thu thập metrics từ các dịch vụ và hiển thị chúng để giám sát hiệu suất và trạng thái của ứng dụng.
Cài đặt và cấu hình Prometheus
Ví dụ này dùng Docker để chạy Prometheus. Cách này giúp đồng nhất triển khai giám sát trên mọi hệ điều hành hỗ trợ Docker.
1. Tạo thư mục cấu hình cho Prometheus:
mkdir prometheus
cd prometheus
2. Tạo file cấu hình prometheus.yml
:
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'flask-app'
static_configs:
- targets: ['backend:5000']
- job_name: 'node-app'
static_configs:
- targets: ['frontend:3000']
3. Tạo Dockerfile cho Prometheus:
FROM prom/prometheus
COPY prometheus.yml /etc/prometheus/prometheus.yml
4. Thêm Prometheus vào compose.yaml
:
version: '3'
services:
frontend:
build: ./frontend
ports:
- "3000:3000"
networks:
- task-network
backend:
build: ./backend
ports:
- "5000:5000"
depends_on:
- database
networks:
- task-network
environment:
- DATABASE_URL=postgresql://taskuser:taskpassword@database:5432/taskdb
database:
image: postgres:13
environment:
- POSTGRES_DB=taskdb
- POSTGRES_USER=taskuser
- POSTGRES_PASSWORD=taskpassword
networks:
- task-network
volumes:
- db-data:/var/lib/postgresql/data
nginx:
build: ./nginx
ports:
- "80:80"
depends_on:
- frontend
- backend
networks:
- task-network
prometheus:
build: ./prometheus
ports:
- "9090:9090"
networks:
- task-network
networks:
task-network:
driver: bridge
volumes:
db-data:
7.2 Cài đặt và cấu hình Grafana
1. Tạo thư mục cho cấu hình Grafana:
mkdir grafana
cd grafana
2. Tạo Dockerfile cho Grafana:
FROM grafana/grafana
3. Thêm Grafana vào docker-compose.yml
:
grafana:
image: grafana/grafana
ports:
- "3033:3000"
depends_on:
- prometheus
networks:
- task-network
4. Cấu hình Grafana để làm việc với Prometheus:
- Khởi động các container bằng
docker compose up
. - Đi tới giao diện web Grafana tại địa chỉ
http://localhost:3033
. - Đăng nhập bằng thông tin tài khoản mặc định (admin/admin).
- Đi tới
"Configuration"
->"Data Sources"
và thêm nguồn dữ liệu mới. - Chọn
"Prometheus"
và nhậpURL http://prometheus:9090
. - Lưu các thiết lập.
Tạo dashboards trong Grafana
- Tạo dashboard mới:
- Đi tới
"Create"
->"Dashboard"
. - Nhấn
"Add new panel"
. - Trong phần
"Query"
chọn nguồn dữ liệuPrometheus
. - Nhập truy vấn
PromQL
để lấy metrics. Ví dụ, để giám sát sử dụngCPU
:
- Đi tới
- Cấu hình panel:
- Chọn kiểu đồ thị (ví dụ: "Graph").
- Cấu hình panel (ví dụ: tên, chú thích, trục, v.v.).
- Nhấn
"Apply"
để lưu panel.
- Tạo panel bổ sung:
- Lặp lại các bước để tạo các panel bổ sung cho các metrics khác như bộ nhớ, mạng và đĩa.
rate(container_cpu_usage_seconds_total[1m])
7.3 Cài đặt ELK Stack
Cài đặt logging bằng ELK Stack (Elasticsearch, Logstash, Kibana)
.
Mục tiêu: thu thập, lưu trữ và phân tích logs từ các dịch vụ của chúng ta.
Cài đặt và cấu hình Elasticsearch
Thêm Elasticsearch
vào compose.yaml
:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.15.0
environment:
- discovery.type=single-node
ports:
- "9200:9200"
networks:
- task-network
Cài đặt và cấu hình Logstash
Bước 1. Tạo thư mục cho cấu hình Logstash:
mkdir logstash
cd logstash
Bước 2. Tạo file cấu hình logstash.conf
:
input {
beats {
port => 5044
}
}
filter {
json {
source => "message"
}
}
output {
elasticsearch {
hosts => ["elasticsearch:9200"]
index => "docker-logs-%{+YYYY.MM.dd}"
}
}
Bước 3. Tạo Dockerfile cho Logstash
:
FROM docker.elastic.co/logstash/logstash:8.15.0
COPY logstash.conf /usr/share/logstash/pipeline/logstash.conf
Bước 4. Thêm Logstash vào compose.yaml
:
logstash:
build: ./logstash
ports:
- "5044:5044"
depends_on:
- elasticsearch
networks:
- task-network
Cài đặt và cấu hình Kibana
Thêm Kibana vào compose.yaml
:
kibana:
image: docker.elastic.co/kibana/kibana:8.15.0
ports:
- "5601:5601"
depends_on:
- elasticsearch
networks:
- task-network
Cài đặt Filebeat để thu thập logs
Bước 1. Tạo thư mục cho cấu hình Filebeat:
mkdir filebeat
cd filebeat
Bước 2. Tạo file cấu hình filebeat.yml
:
filebeat.inputs:
- type: docker
containers.ids:
- '*'
processors:
- add_docker_metadata: ~
output.logstash:
hosts: ["logstash:5044"]
Bước 3. Tạo Dockerfile cho Filebeat:
FROM docker.elastic.co/beats/filebeat:8.15.0
COPY filebeat.yml /usr/share/filebeat/filebeat.yml
Bước 4. Thêm Filebeat vào compose.yaml
:
filebeat:
build: ./filebeat
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
depends_on:
- logstash
networks:
- task-network
7.4 Tệp đầy đủ
Tệp đầy đủ compose.yaml
version: '3'
services:
frontend:
build: ./frontend
ports:
- "3000:3000"
networks:
- task-network
backend:
build: ./backend
ports:
- "5000:5000"
depends_on:
- database
networks:
- task-network
environment:
- DATABASE_URL=postgresql://taskuser:taskpassword@database:5432/taskdb
database:
image: postgres:13
environment:
- POSTGRES_DB=taskdb
- POSTGRES_USER=taskuser
- POSTGRES_PASSWORD=taskpassword
networks:
- task-network
volumes:
- db-data:/var/lib/postgresql/data
nginx:
build: ./nginx
ports:
- "80:80"
depends_on:
- frontend
- backend
networks:
- task-network
prometheus:
build: ./prometheus
ports:
- "9090:9090"
networks:
- task-network
grafana:
image: grafana/grafana
ports:
- "3033:3000"
depends_on:
- prometheus
networks:
- task-network
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.9.2
environment:
- discovery.type=single-node
ports:
- "9200:9200"
networks:
- task-network
logstash:
build: ./logstash
ports:
- "5044:5044"
depends_on:
- elasticsearch
networks:
- task-network
kibana:
image: docker.elastic.co/kibana/kibana:7.9.2
ports:
- "5601:5601"
depends_on:
- elasticsearch
networks:
- task-network
filebeat:
build: ./filebeat
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
depends_on:
- logstash
networks:
- task-network
networks:
task-network:
driver: bridge
volumes:
db-data:
GO TO FULL VERSION