7.1 使用 Prometheus 設置監控
在這一步,我們會研究如何為我們的多容器應用程式設定監控和日誌記錄。這將允許追蹤服務的狀態與效能,還可以收集與分析日誌來診斷問題。
目標: 從服務收集指標並將其可視化,以便監控應用程式的效能和狀態。
安裝和設置 Prometheus
這裡的例子中,Prometheus 是使用 Docker 啟動的。這提供了跨平台性,並允許在任何支持 Docker 的操作系統上同樣有效地部署監控。
1. 創建 Prometheus 配置的目錄:
mkdir prometheus
cd prometheus
2. 創建配置檔案 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. 為 Prometheus 創建 Dockerfile:
FROM prom/prometheus
COPY prometheus.yml /etc/prometheus/prometheus.yml
4. 在 compose.yaml
中添加 Prometheus:
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 安裝和設定 Grafana
1. 為 Grafana 創建配置目錄:
mkdir grafana
cd grafana
2. 為 Grafana 創建 Dockerfile:
FROM grafana/grafana
3. 在 docker-compose.yml
中添加 Grafana:
grafana:
image: grafana/grafana
ports:
- "3033:3000"
depends_on:
- prometheus
networks:
- task-network
4. 為使用 Prometheus 配置 Grafana:
- 使用
docker compose up
啟動容器。 - 打開瀏覽器進入 Grafana 的 Web 介面:
http://localhost:3033
。 - 使用默認用戶名密碼登錄 (admin/admin)。
- 打開
"Configuration"
->"Data Sources"
,新增資料來源。 - 選擇
"Prometheus"
,並指定URL http://prometheus:9090
。 - 儲存設定。
在 Grafana 創建儀表板
- 創建新的儀表板:
- 打開
"Create"
->"Dashboard"
。 - 點擊
"Add new panel"
。 - 在
"Query"
區選擇資料來源Prometheus
。 - 輸入
PromQL
查詢來獲取指標數據。例如,監控 CPU 使用情況:
- 打開
- 設置面板 (Panel):
- 選擇圖表類型 (例如圖形 "Graph")。
- 設置面板 (例如名稱、圖例、軸等)。
- 點擊
"Apply"
以保存面板。
- 創建其他面板:
- 重複這些步驟來為其他指標 (例如內存、網絡、磁碟) 創建面板。
rate(container_cpu_usage_seconds_total[1m])
7.3 配置 ELK Stack
使用 ELK Stack (Elasticsearch, Logstash, Kibana)
配置日誌記錄。
目標: 收集、存儲和分析來自我們服務的日誌。
安裝和配置 Elasticsearch
在 compose.yaml
中添加 Elasticsearch
:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.15.0
environment:
- discovery.type=single-node
ports:
- "9200:9200"
networks:
- task-network
安裝和配置 Logstash
步驟 1. 創建 Logstash 配置目錄:
mkdir logstash
cd logstash
步驟 2. 創建 logstash.conf
配置文件:
input {
beats {
port => 5044
}
}
filter {
json {
source => "message"
}
}
output {
elasticsearch {
hosts => ["elasticsearch:9200"]
index => "docker-logs-%{+YYYY.MM.dd}"
}
}
步驟 3. 為 Logstash
創建 Dockerfile:
FROM docker.elastic.co/logstash/logstash:8.15.0
COPY logstash.conf /usr/share/logstash/pipeline/logstash.conf
步驟 4. 在 compose.yaml
中添加 Logstash:
logstash:
build: ./logstash
ports:
- "5044:5044"
depends_on:
- elasticsearch
networks:
- task-network
安裝和配置 Kibana
在 compose.yaml
中添加 Kibana:
kibana:
image: docker.elastic.co/kibana/kibana:8.15.0
ports:
- "5601:5601"
depends_on:
- elasticsearch
networks:
- task-network
安裝 Filebeat 收集日誌
步驟 1. 創建 Filebeat 配置目錄:
mkdir filebeat
cd filebeat
步驟 2. 創建 filebeat.yml
配置文件:
filebeat.inputs:
- type: docker
containers.ids:
- '*'
processors:
- add_docker_metadata: ~
output.logstash:
hosts: ["logstash:5044"]
步驟 3. 為 Filebeat 創建 Dockerfile:
FROM docker.elastic.co/beats/filebeat:8.15.0
COPY filebeat.yml /usr/share/filebeat/filebeat.yml
步驟 4. 在 compose.yaml
中添加 Filebeat:
filebeat:
build: ./filebeat
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
depends_on:
- logstash
networks:
- task-network
7.4 完整檔案
完整檔案 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