Triển khai Prometheus và Grafana trên K3s
Ta sẽ sử dụng Helm để cài đặt Prometheus và Grafana vào namespace monitoring. Đây là cách chuẩn để quản lý các công cụ giám sát trên Kubernetes, đảm bảo tính nhất quán và dễ nâng cấp.
Trước tiên, tạo namespace riêng biệt để cô lập các thành phần giám sát khỏi workload IoT.
kubectl create namespace monitoring
Kết quả mong đợi: Namespace monitoring được tạo thành công.
Cập nhật repo Helm và thêm repository của Prometheus Community.
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
Kết quả mong đợi: Repository được thêm vào và danh sách charts được cập nhật.
Cài đặt Prometheus với cấu hình tùy chỉnh để hỗ trợ scraping các target động và lưu trữ dữ liệu dài hạn.
helm install prometheus prometheus-community/prometheus \
--namespace monitoring \
--set server.persistentVolume.enabled=true \
--set server.retention=15d \
--set server.global.scrape_interval=15s \
--set server.global.scrape_timeout=10s \
--set server.serviceMonitorNamespaceSelector.matchLabels.monitoring.enabled=true \
--set server.serviceMonitorSelector.matchLabels.monitoring.enabled=true
Kết quả mong đợi: Các pod Prometheus (server, alertmanager) và Grafana (nếu có trong chart) chạy trạng thái Running.
Cài đặt Grafana để trực quan hóa dữ liệu. Ta sẽ expose qua NodePort để truy cập từ bên ngoài cluster.
helm install grafana prometheus-community/grafana \
--namespace monitoring \
--set persistence.enabled=true \
--set service.type=NodePort \
--set service.nodePort=3000 \
--set adminPassword=admin123 \
--set sidecar.datasources.enabled=true \
--set sidecar.dashboards.enabled=true
Kết quả mong đợi: Pod Grafana chạy, port 3000 được mở trên Node Master.
Verify kết quả
Kiểm tra trạng thái các pod và truy cập giao diện web.
kubectl get pods -n monitoring
Truy cập Grafana qua địa chỉ IP Master: http://:3000 (user: admin, pass: admin123). Bạn sẽ thấy datasource Prometheus tự động được import.
Cấu hình Node Exporter trên Edge Nodes qua KubeEdge
Để thu thập metric phần cứng (CPU, RAM, Disk) từ các node Edge, ta cần triển khai Node Exporter. Khác với K8s tiêu chuẩn, KubeEdge yêu cầu cấu hình DaemonSet để đảm bảo pod chạy trên cả Cloud và Edge.
Sử dụng chart Helm của Node Exporter nhưng phải cấu hình label selector để KubeEdge nhận diện và đẩy xuống Edge Nodes.
helm install node-exporter prometheus-community/node-exporter \
--namespace monitoring \
--set serviceMonitor.enabled=true \
--set serviceMonitor.namespace=monitoring \
--set serviceMonitor.selector.matchLabels.app.kubernetes.io/name=node-exporter \
--set extraArgs[0]=--path.rootfs=/host \
--set extraArgs[1]=--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)
Kết quả mong đợi: DaemonSet node-exporter được tạo và các pod bắt đầu khởi tạo trên tất cả các node (bao gồm cả Edge).
Để đảm bảo KubeEdge nhận diện đúng, ta cần thêm label kubeedge.io/edge-node vào các node Edge nếu chưa có, hoặc cấu hình selector trong DaemonSet.
kubectl label nodes kubeedge.io/edge-node=true --overwrite
Kết quả mong đợi: Node Edge được gán label. Nếu KubeEdge đã cấu hình đúng từ phần trước, pod Node Exporter sẽ tự động chạy trên node này.
Chạy lệnh kiểm tra để xem pod Node Exporter đã chạy trên Edge Node chưa.
kubectl get pods -n monitoring -o wide | grep node-exporter
Kết quả mong đợi: Danh sách hiển thị các pod node-exporter với NODE NAME là tên của node Edge (ví dụ: edge-node-01).
Thiết lập pipeline ghi log tập trung với Fluent Bit và Loki
Edge Computing thường thiếu tài nguyên, nên ta dùng Fluent Bit (nhẹ hơn Fluentd) để thu thập log và đẩy về Loki để lưu trữ. Pipeline: Container Stdout -> Fluent Bit -> Loki -> Grafana.
Đầu tiên, tạo secret chứa thông tin kết nối tới Loki (nếu dùng Loki Cloud) hoặc cấu hình trực tiếp trong config file nếu Loki chạy nội bộ.
cat > /tmp/loki-config.yaml
Kết quả mong đợi: Secret loki-config được tạo trong namespace monitoring.
Triển khai Fluent Bit qua DaemonSet. Đây là file cấu hình fluent-bit.conf hoàn chỉnh để thu thập log từ container và đẩy về Loki.
Đường dẫn config: /etc/fluent-bit/fluent-bit.conf (trong pod).
cat > /tmp/fluent-bit-daemonset.yaml
Lưu ý: Để đảm bảo chạy được ngay, ta sẽ tạo file YAML đơn giản hơn bỏ qua lua filter phức tạp.
cat > /tmp/fluent-bit-simple.yaml
Kết quả mong đợi: DaemonSet fluent-bit chạy trên tất cả node, thu thập log và đẩy về Loki.
Triển khai Loki để lưu trữ log (nếu chưa có). Dùng Helm chart đơn giản.
helm install loki grafana/loki-stack \
--namespace monitoring \
--set loki.storage.type=memory \
--set loki.retentionPeriod=168h \
--set loki.persistence.enabled=false
Kết quả mong đợi: Pod Loki chạy, expose port 3100.
Verify kết quả
Kiểm tra log trong Loki qua Grafana.
curl http://localhost:3100/loki/api/v1/query_range?query={namespace="monitoring"}&start=2023-01-01T00:00:00Z&end=2023-12-31T23:59:59Z
Truy cập Grafana, chọn Explore -> chọn Loki datasource -> Query {namespace="monitoring"}. Bạn sẽ thấy log từ các pod xuất hiện.
Tạo dashboard theo dõi sức khỏe tunnel WireGuard và CPU/RAM
Ta cần tạo dashboard riêng để theo dõi trạng thái tunnel WireGuard (băng thông, handshake) và tài nguyên Edge. Prometheus đã scrape Node Exporter, nhưng cần cấu hình thêm để scrape WireGuard metrics.
Trước hết, ta cần một exporter để đọc file trạng thái WireGuard (/var/lib/wireguard/status hoặc tương tự). Giả sử ta đã có pod WireGuard, ta sẽ thêm ServiceMonitor.
cat > /tmp/wireguard-monitor.yaml
Kết quả mong đợi: ServiceMonitor được tạo. Prometheus sẽ tự động phát hiện và scrape metrics từ pod wireguard-exporter (nếu bạn đã deploy nó).
Tạo file dashboard JSON cho Grafana. Dưới đây là nội dung cấu hình dashboard tập trung vào CPU, RAM, Disk của Edge Node và WireGuard Traffic.
Đường dẫn file: /tmp/edge-dashboard.json
cat > /tmp/edge-dashboard.json
Kết quả mong đợi: File JSON dashboard được tạo.
Import dashboard vào Grafana qua API hoặc UI. Dùng curl để import nhanh.
curl -X POST -H "Content-Type: application/json" -d @/tmp/edge-dashboard.json \
http://admin:admin123@:3000/api/dashboards/db
Kết quả mong đợi: Trả về JSON chứa "id": và "status": "success". Dashboard xuất hiện trong danh sách Grafana.
Cấu hình cảnh báo (Alerting) qua Slack hoặc Email
Khi hệ thống Edge gặp sự cố (mất kết nối WireGuard, CPU quá tải), ta cần AlertManager gửi thông báo. Ta sẽ cấu hình AlertRule trong Prometheus và gửi về AlertManager.
Đầu tiên, tạo file AlertRule định nghĩa các điều kiện cảnh báo.
Đường dẫn file: /tmp/alert-rules.yaml
cat > /tmp/alert-rules.yaml 90
for: 5m
labels:
severity: critical
annotations:
summary: "RAM trên Edge Node đầy"
description: "Node {{ \$labels.instance }} đang sử dụng > 90% RAM."
- alert: WireGuardConnectionDown
expr: wireguard_peer_connected == 0
for: 2m
labels:
severity: critical
annotations:
summary: "Tunnel WireGuard bị ngắt"
description: "Peer {{ \$labels.peer }} chưa handshake thành công trong 2 phút. Kiểm tra kết nối mạng."
- alert: KubeEdgeEdgeNodeDown
expr: kube_node_status_condition{condition="Ready", status="true"} == 0
for: 1m
labels:
severity: critical
annotations:
summary: "Edge Node mất kết nối với Cloud"
description: "Node {{ \$labels.node }} đã mất trạng thái Ready."
EOF
kubectl apply -f /tmp/alert-rules.yaml
Kết quả mong đợi: ConfigMap alert-rules được tạo. Prometheus cần được restart hoặc reload để nhận rule mới.
Tải lại cấu hình Prometheus để áp dụng rule mới.
kubectl rollout restart deployment prometheus-server -n monitoring
Kết quả mong đợi: Pod Prometheus restart, logs hiển thị loading rules.
Cấu hình AlertManager để gửi cảnh báo qua Slack. Tạo secret chứa webhook URL.
kubectl create secret generic slack-secret \
--from-literal=slack-webhook-url=https://hooks.slack.com/services/YOUR/WEBHOOK/URL \
-n monitoring
Kết quả mong đợi: Secret slack-secret được tạo.
Cấu hình AlertManager ConfigMap để chỉ định route và receiver Slack.
cat > /tmp/alertmanager-config.yaml
Kết quả mong đợi: ConfigMap AlertManager được cập nhật. Restart AlertManager để áp dụng.
kubectl rollout restart deployment alertmanager -n monitoring
Kết quả mong đợi: AlertManager restart, sẵn sàng gửi thông báo.
Verify kết quả
Tạo sự cố giả để test cảnh báo (ví dụ: tắt kết nối mạng tạm thời hoặc chạy script tăng CPU).
# Giả lập CPU cao trên node master (để test cơ chế)
stress -c 1 --timeout 60s &
Chờ 5-6 phút. Kiểm tra Slack hoặc Email xem có nhận được thông báo EdgeNodeHighCPU hay không. Kiểm tra tab Alerting trong Prometheus UI để xem trạng thái alert đang ở Firing.
Điều hướng series:
Mục lục: Series: Xây dựng nền tảng Edge Computing an toàn với K3s, KubeEdge và WireGuard cho IoT
« Phần 7: Quản lý ứng dụng Edge trong môi trường không ổn định
Phần 9: Xử lý sự cố và các mẹo nâng cao cho sản xuất »