Cấu hình Linkerd Viz để phân tích lưu lượng với eBPF
Linkerd Viz là thành phần mở rộng cung cấp khả năng phân tích lưu lượng, nhưng khi kết hợp với eBPF, nó sẽ thu thập dữ liệu từ kernel network stack thay vì chỉ từ các proxy sidecar, giúp giảm overhead đáng kể.
Bước này cài đặt extension Viz và kích hoạt chế độ thu thập dữ liệu eBPF để có thể nhìn thấy toàn bộ lưu lượng HTTP/gRPC giữa các pod, ngay cả khi chúng chưa được inject sidecar.
Trước tiên, cần đảm bảo Linkerd core đã chạy và namespace linkerd-viz chưa tồn tại.
kubectl get ns | grep linkerd-viz
Kết quả mong đợi: Không có output nào trả về, xác nhận namespace chưa tồn tại.
Tiến hành cài đặt Linkerd Viz bằng CLI đã được cấu hình sẵn từ các phần trước.
linkerd viz install | kubectl apply -f -
Kết quả mong đợi: Các resource Deployment, Service, DaemonSet trong namespace linkerd-viz được tạo thành công.
Để kích hoạt chế độ eBPF cho Viz, cần cấu hình DaemonSet để nó lắng nghe các event từ kernel. Điều này yêu cầu kernel module eBPF đã được load từ Phần 4.
kubectl patch daemonset linkerd-viz-tap -n linkerd-viz -p '{"spec":{"template":{"spec":{"containers":[{"name":"tap","env":[{"name":"LINKERD2_PROXY_ADMIN_ADDR","value":"169.254.254.1:4190"},{"name":"LINKERD2_EBPF_ENABLED","value":"true"}]},{"name":"proxy-inject","env":[{"name":"LINKERD2_EBPF_ENABLED","value":"true"}]}]}}}}'
Kết quả mong đợi: DaemonSet được cập nhật, các container sẽ khởi động lại để áp dụng biến môi trường eBPF.
Verify rằng Viz đã nhận diện được lưu lượng eBPF bằng cách thực hiện một request test và xem log của component tap.
linkerd viz tap -n linkerd-viz --tap-all --limit 5
Kết quả mong đợi: Xuất hiện dòng log hiển thị các request HTTP (GET/POST) với địa chỉ IP nguồn và đích, chứng tỏ eBPF đang bắt gói tin thành công.
Tích hợp Prometheus và Grafana cho Metrics eBPF
Linkerd tự động expose metrics, nhưng để phân tích sâu các chỉ số eBPF (như packet drop rate, context switch latency), ta cần cấu hình Prometheus scrape các endpoint cụ thể và dùng Grafana dashboard tùy chỉnh.
Bước này sẽ tạo ConfigMap chứa file scrape configuration và dashboard JSON.
Đầu tiên, tạo file cấu hình Prometheus để scrape metrics từ linkerd-proxy trong chế độ eBPF. File này sẽ được mount vào container Prometheus.
cat > /tmp/prometheus-linkerd-eBPF.yaml
Kết quả mong đợi: File /tmp/prometheus-linkerd-eBPF.yaml được tạo với nội dung cấu hình scrape port 4191 (admin port) và lọc metrics bắt đầu bằng linkerd_ebpf.
Áp dụng cấu hình này vào Kubernetes thông qua ConfigMap.
kubectl create configmap prometheus-linkerd-config -n monitoring --from-file=linkerd-eBPF.yaml=/tmp/prometheus-linkerd-eBPF.yaml
Kết quả mong đợi: ConfigMap prometheus-linkerd-config được tạo trong namespace monitoring.
Cập nhật Deployment của Prometheus để mount ConfigMap mới này vào thư mục /etc/prometheus/ và cập nhật khởi động.
kubectl set env deployment/prometheus -n monitoring PROMETHEUS_CONFIG_PATH=/etc/prometheus/ --container=prometheus
kubectl patch deployment prometheus -n monitoring -p '{"spec":{"template":{"spec":{"containers":[{"name":"prometheus","volumeMounts":[{"name":"config","mountPath":"/etc/prometheus"}]},{"name":"prometheus","env":[{"name":"PROMETHEUS_CONFIG_PATH","value":"/etc/prometheus/"}]}],"volumes":[{"name":"config","configMap":{"name":"prometheus-linkerd-config"}}]}}}}'
Kết quả mong đợi: Deployment Prometheus được patch thành công, container sẽ restart và load cấu hình mới.
Tạo file dashboard JSON cho Grafana để hiển thị các metrics eBPF đặc thù như số lượng gói tin bị drop do limit hoặc latency phân phối.
cat > /tmp/linkerd-ebpf-dashboard.json
Kết quả mong đợi: File JSON dashboard được tạo sẵn nội dung các panel quan trọng.
Import dashboard vào Grafana bằng cách tạo ConfigMap và mount vào Grafana, hoặc dùng API nếu Grafana đã chạy.
kubectl create configmap linkerd-ebpf-dashboard -n monitoring --from-file=dashboard.json=/tmp/linkerd-ebpf-dashboard.json
kubectl cp linkerd-ebpf-dashboard -n monitoring /tmp/dashboard-backup.json
Kết quả mong đợi: Dashboard đã sẵn sàng để import thủ công qua UI Grafana hoặc tự động nếu cấu hình provisioning.
Verify bằng cách truy cập Prometheus UI (port 9090) và gõ biểu thức query: linkerd_ebpf_packet_drops_total.
curl http://prometheus-monitoring:9090/api/v1/query?query=linkerd_ebpf_packet_drops_total
Kết quả mong đợi: JSON trả về có status "success" và data chứa các time series có giá trị số lớn hơn 0.
Phân tích Latency Distribution và Error Rate Real-time
Sử dụng các histogram metrics từ eBPF để phân tích phân bố độ trễ (latency distribution) và tỷ lệ lỗi (error rate) theo thời gian thực, giúp phát hiện các bottleneck ẩn mà metrics thông thường bỏ qua.
Thực hiện query để xem phân bố latency theo percentile (P50, P90, P99) của toàn bộ cluster.
linkerd metrics --prometheus-query "histogram_quantile(0.99, rate(linkerd_ebpf_request_latency_seconds_bucket[5m]))"
Kết quả mong đợi: Trả về giá trị số (giây) đại diện cho 99% request có latency thấp hơn con số này. Nếu giá trị cao bất thường (>100ms), có thể do context switch hoặc kernel load.
Phân tích error rate theo mã trạng thái HTTP (5xx) từ góc nhìn eBPF, không phụ thuộc vào application log.
linkerd metrics --prometheus-query "rate(linkerd_ebpf_request_errors_total{status_code=~\"5..\"}[5m])"
Kết quả mong đợi: Trả về tỷ lệ lỗi trên giây. Giá trị > 0.01 (1%) cần được cảnh báo ngay lập tức.
Tạo biểu đồ so sánh latency giữa các service (destination) để tìm service chậm nhất.
linkerd metrics --prometheus-query "topk(5, histogram_quantile(0.95, rate(linkerd_ebpf_request_latency_seconds_bucket{destination_namespace=\"default\"}[5m])))"
Kết quả mong đợi: Danh sách 5 service có P95 latency cao nhất, giúp xác định điểm nghẽn chính.
Sử dụng command linkerd viz tap để phân tích chi tiết từng request gây latency cao, kết hợp với filter.
linkerd viz tap -n default --dest svc=my-slow-service --limit 10 --output json | jq '.[] | select(.latency > "100ms")'
Kết quả mong đợi: Xuất ra JSON chi tiết của các request có latency > 100ms, bao gồm source, destination, và duration chính xác.
Verify bằng cách mở Grafana Dashboard đã tạo ở phần trước, quan sát panel "Latency Distribution". Khi traffic tăng, đường biểu đồ P99 sẽ nhảy lên nếu có vấn đề.
curl -s http://grafana-monitoring:3000/api/search?query=Linkerd\ eBPF
Kết quả mong đợi: API trả về danh sách dashboard đã import, xác nhận dashboard đang sẵn sàng hiển thị.
Tạo Alert cho sự cố mạng và Bottleneck hiệu năng
Cấu hình Alertmanager để gửi thông báo khi phát hiện các sự cố mạng nghiêm trọng (như packet drop liên tục) hoặc bottleneck hiệu năng (latency vượt ngưỡng) dựa trên dữ liệu eBPF.
Tạo file alert rules YAML định nghĩa các điều kiện cảnh báo cụ thể.
cat > /tmp/linkerd-ebpf-alerts.yaml 0.5
for: 3m
labels:
severity: warning
annotations:
summary: "Latency P99 vượt ngưỡng cho phép"
description: "Service {{\$labels.destination_service}} có P99 latency {{\$value}}s. Cần kiểm tra bottleneck."
- alert: HighErrorRate
expr: rate(linkerd_ebpf_request_errors_total[5m]) / rate(linkerd_ebpf_request_total[5m]) > 0.05
for: 1m
labels:
severity: critical
annotations:
summary: "Tỷ lệ lỗi HTTP 5xx cao bất thường"
description: "Tỷ lệ lỗi đạt {{\$value | humanizePercentage}} trong 5 phút qua."
EOF
Kết quả mong đợi: File alert rules được tạo với 3 rule quan trọng: Drop rate, Latency P99, và Error rate.
Deploy file alert rules vào Prometheus thông qua ConfigMap.
kubectl create configmap linkerd-ebpf-alerts -n monitoring --from-file=alert_rules.yaml=/tmp/linkerd-ebpf-alerts.yaml
kubectl patch deployment prometheus -n monitoring -p '{"spec":{"template":{"spec":{"containers":[{"name":"prometheus","volumeMounts":[{"name":"alerts","mountPath":"/etc/prometheus/rules"}]}],"volumes":[{"name":"alerts","configMap":{"name":"linkerd-ebpf-alerts"}}]}}}}'
Kết quả mong đợi: Prometheus restart và load các rule alert mới, có thể kiểm tra tại tab "Rules" của Prometheus UI.
Cấu hình Alertmanager để nhận alert và gửi qua kênh (Slack, Email, PagerDuty). Ở đây dùng Slack làm ví dụ.
cat > /tmp/alertmanager-config.yaml
Kết quả mong đợi: File cấu hình Alertmanager với webhook Slack và logic inhibit (critical sẽ đè warning).
Deploy Alertmanager với config mới.
kubectl create configmap alertmanager-config -n monitoring --from-file=alertmanager.yaml=/tmp/alertmanager-config.yaml
kubectl set volume deployment/alertmanager -n monitoring --name=config --configmap-name=alertmanager-config --mount-path=/etc/alertmanager --container=alertmanager --overwrite
Kết quả mong đợi: Alertmanager restart và load cấu hình mới.
Verify bằng cách kích hoạt một alert giả lập hoặc chờ traffic thực tế. Kiểm tra trạng thái alert trong Prometheus UI.
curl http://prometheus-monitoring:9090/api/v1/alerts
Kết quả mong đợi: JSON trả về danh sách các alert đang ở trạng thái "firing" nếu điều kiện được thỏa mãn.
Simulate một lỗi để test alert: Gây delay nhân tạo cho một service để trigger HighLatencyP99.
kubectl exec -it -n default -- sh -c 'while true; do sleep 1; done' & sleep 5; kill %1
Kết quả mong đợi: Sau khoảng 3 phút (for: 3m), Alertmanager sẽ gửi thông báo vào kênh Slack đã cấu hình.
Điều hướng series:
Mục lục: Series: Xây dựng nền tảng Service Mesh trên Kubernetes với Linkerd và eBPF
« Phần 4: Tích hợp eBPF vào Linkerd để tối ưu hiệu năng
Phần 6: Xử lý sự cố và tối ưu hóa kiến trúc Service Mesh »