CodeGym /Các khóa học /Docker SELF /Cài đặt monitoring và logging

Cài đặt monitoring và logging

Docker SELF
Mức độ , Bài học
Có sẵn

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:

Terminal

mkdir prometheus
cd prometheus

2. Tạo file cấu hình prometheus.yml:

Yaml

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:

dockerfile

FROM prom/prometheus
COPY prometheus.yml /etc/prometheus/prometheus.yml

4. Thêm Prometheus vào compose.yaml:

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:

Terminal

mkdir grafana
cd grafana

2. Tạo Dockerfile cho Grafana:

dockerfile

FROM grafana/grafana

3. Thêm Grafana vào docker-compose.yml:

Yaml

  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:

  1. Khởi động các container bằng docker compose up.
  2. Đi tới giao diện web Grafana tại địa chỉ http://localhost:3033.
  3. Đăng nhập bằng thông tin tài khoản mặc định (admin/admin).
  4. Đi tới "Configuration" -> "Data Sources" và thêm nguồn dữ liệu mới.
  5. Chọn "Prometheus" và nhập URL http://prometheus:9090.
  6. Lưu các thiết lập.

Tạo dashboards trong Grafana

  1. 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ệu Prometheus.
    • Nhập truy vấn PromQL để lấy metrics. Ví dụ, để giám sát sử dụng CPU:
  2. Promql
    
    rate(container_cpu_usage_seconds_total[1m]) 
            
  3. 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.
  4. 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.

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:

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:

Terminal

mkdir logstash
cd logstash

Bước 2. Tạo file cấu hình logstash.conf:

Text

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:

dockerfile

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:

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:

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:

Terminal

mkdir filebeat
cd filebeat

Bước 2. Tạo file cấu hình filebeat.yml:

Yaml

filebeat.inputs:
- type: docker
  containers.ids:
    - '*'
processors:
  - add_docker_metadata: ~
output.logstash:
  hosts: ["logstash:5044"]

Bước 3. Tạo Dockerfile cho Filebeat:

dockerfile

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:

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

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:
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION