Triển khai Prometheus và Grafana để thu thập metric từ Envoy và eBPF
Cấu hình Prometheus để scrape metric từ Envoy Proxy
Bạn cần cấu hình Prometheus để nhận metric từ các sidecar Envoy trong Service Mesh. Vì Envoy chạy trong cluster, ta dùng Service Discovery của Kubernetes để tự động phát hiện endpoint.
Tạo file cấu hình /etc/prometheus/prometheus.yml với nội dung hoàn chỉnh sau:
global:
scrape_interval: 10s
evaluation_interval: 10s
scrape_configs:
- job_name: 'kubernetes-pods'
kubernetes_sd_configs:
- role: pod
relabel_configs:
- action: keep
regex: istio-proxy
source_labels:
- __meta_kubernetes_pod_container_name
- action: replace
regex: (.+)
source_labels:
- __meta_kubernetes_namespace
- __meta_kubernetes_pod_name
target_label: pod
- action: replace
regex: (.+)
source_labels:
- __meta_kubernetes_pod_container_port
target_label: port
- job_name: 'cilium'
static_configs:
- targets: ['host.docker.internal:9090']
labels:
job: cilium
Kết quả mong đợi: Prometheus sẽ bắt đầu scrape metric từ các pod chứa container istio-proxy và agent Cilium.
Triển khai Grafana để trực quan hóa dữ liệu
Sau khi có dữ liệu, ta cần dashboard để xem. Triển khai Grafana qua Helm chart với config custom để trỏ về Prometheus vừa cấu hình.
Chạy lệnh cài đặt Helm với giá trị tùy chỉnh:
helm install grafana grafana/grafana \
--namespace monitoring \
--set "datasources.datasources[0].name=Prometheus" \
--set "datasources.datasources[0].type=prometheus" \
--set "datasources.datasources[0].url=http://prometheus-server:9090" \
--set "service.type=NodePort" \
--set "service.nodePort=30000"
Kết quả mong đợi: Grafana chạy trong namespace monitoring và có thể truy cập qua cổng 30000 của Node.
Nạp Dashboard Kiali và Cilium Hubble vào Grafana
Tạo file JSON dashboard để import vào Grafana, tập trung vào metric latency và error rate của Envoy.
Truy cập Grafana UI (http://:30000), vào Import Dashboard và dán ID hoặc file JSON. Dưới đây là cấu hình datasource trong file /etc/grafana/provisioning/datasources/ds.yaml nếu bạn muốn tự động hóa:
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
access: proxy
url: http://prometheus-server:9090
isDefault: true
editable: true
jsonData:
timeInterval: 5s
Kết quả mong đợi: Dashboard hiển thị biểu đồ thực-time về request rate, p99 latency từ Envoy và metric network policy từ Cilium.
Cấu hình Kiali để trực quan hóa lưu lượng traffic Service Mesh
Triển khai Kiali trong môi trường KubeEdge
Kiali cần quyền truy cập vào API server để lấy thông tin graph. Trong môi trường Edge, ta cần đảm bảo Kiali có thể liên lạc với KubeEdge Cloud Core.
Tạo file kiali-server-config.yaml tại /etc/kiali/kiali-server-config.yaml:
apiVersion: v1
kind: ConfigMap
metadata:
name: kiali-server-config
namespace: istio-system
data:
Kiali.yaml: |
deployment:
accessible_namespaces:
- '**'
namespace: istio-system
inject_istio: true
server:
port: 20001
metrics_enabled: true
tracing_enabled: true
kiali_feature_flags:
cluster_wide: true
istio_component_namespaces:
istio_system: istio-system
istio_cni: kubeedge-cni
external_services:
prometheus:
url: http://prometheus-server:9090
tracing:
enabled: false
Kết quả mong đợi: ConfigMap được tạo, sẵn sàng cho deployment Kiali.
Chạy lệnh deploy Kiali với tài nguyên tối ưu cho Edge:
kubectl apply -f -
Kết quả mong đợi: Pod kiali trạng thái Running trong namespace istio-system.
Tạo Service để expose Kiali ra ngoài
Tạo Service để mapping cổng 20001 của Kiali ra NodePort, cho phép truy cập từ trình duyệt.
kubectl apply -f -
Kết quả mong đợi: Truy cập http://:30001 thấy giao diện login của Kiali (mặc định user: admin).
Verify kết quả Kiali
Mở trình duyệt truy cập Kiali, vào tab "Graph". Bạn sẽ thấy sơ đồ các service trong cluster, các edge (mũi tên) thể hiện lưu lượng giữa chúng. Nếu không thấy gì, hãy tạo traffic mẫu bằng lệnh curl giữa các service.
Sử dụng eBPF tools (bpftrace, Cilium hubble) để debug lỗi mạng
Cài đặt và cấu hình Cilium Hubble
Hubble là công cụ quan sát dựa trên eBPF của Cilium, cho phép xem packet capture ở mức kernel. Ta cần kích hoạt Hubble relay và UI.
Chạy lệnh Helm để enable Hubble với chế độ relay:
helm upgrade cilium cilium/cilium \
--namespace kube-system \
--set hubble.relay.enabled=true \
--set hubble.ui.enabled=true \
--set hubble.metrics.enabled="{enabled: true, enabledMetrics: [all]}" \
--set hubble.peerSecurityPolicy=true
Kết quả mong đợi: Các pod cilium-hubble-relay và cilium-hubble-ui được tạo và chạy trong namespace kube-system.
Debug gói tin với Cilium Hubble CLI
Sử dụng CLI của Hubble để filter traffic theo namespace hoặc IP. Đây là cách nhanh nhất để debug lỗi "Connection Refused" giữa các pod.
Lệnh để xem toàn bộ traffic trong namespace default:
kubectl exec -n kube-system $(kubectl get pod -n kube-system -l app=cilium -o jsonpath='{.items[0].metadata.name}') \
-- hubble observe --namespace default --follow
Kết quả mong đợi: Dòng lệnh hiển thị realtime log dạng ALLOW hoặc DROP kèm thông tin source/dest IP và port. Nếu thấy DROP, kiểm tra NetworkPolicy.
Sử dụng bpftrace để debug sâu hơn
Khi Hubble không cung cấp đủ chi tiết, dùng bpftrace trực tiếp trên node Edge để hook vào kernel tracepoint.
Cài đặt bpftrace trên node Edge (yêu cầu kernel module bpf và net):
apt-get update && apt-get install -y bpftrace
Chạy script bpftrace để đếm số packet bị drop tại mức socket:
bpftrace -e '
tracepoint:net:net_packet_mmap {
printf("Packet mmap event\n");
}
kprobe:sk_filter {
if (retval < 0) {
printf("Packet DROP at sk_filter: %d\n", retval);
}
}'
Kết quả mong đợi: Nếu có packet bị drop ở tầng socket, bạn sẽ thấy log Packet DROP at sk_filter kèm mã lỗi.
Verify kết quả eBPF debug
Tạo một traffic mẫu bị chặn (ví dụ: gửi request đến port không mở) và quan sát ngay lập tức trên Hubble observe hoặc bpftrace. Nếu thấy dòng log DROP, xác nhận lỗi nằm ở firewall hoặc network policy.
Các chiến lược xử lý sự cố khi kết nối Cloud-Edge bị gián đoạn
Chẩn đoán kết nối Cloud-Edge với KubeEdge
Vấn đề phổ biến nhất là Edge Core mất kết nối với Cloud Core. Kiểm tra trạng thái của EdgeCore và EdgeMesh.
Trên Cloud Core, liệt kê các node Edge đang offline:
kubectl get nodes
Trên Edge Node, kiểm tra log của EdgeCore (thường chạy trong container hoặc systemd):
docker logs $(docker ps -q --filter "name=edgecore") 2>&1 | tail -n 50
Kết quả mong đợi: Log hiển thị lỗi WebSocket connection failed hoặc Handshake timeout chỉ ra vấn đề mạng hoặc chứng chỉ.
Kiểm tra đường đi gói tin giữa Cloud và Edge
Sử dụng tcpdump trên Edge Node để xem liệu gói tin từ Cloud có đến được Edge hay không.
tcpdump -i eth0 -nn host and port 10000
Kết quả mong đợi: Nếu không thấy gói tin nào, lỗi nằm ở mạng (Firewall, Security Group). Nếu thấy gói tin nhưng không có phản hồi, lỗi nằm ở EdgeCore.
Reset kết nối Edge với Cloud
Khi cấu hình bị lỗi hoặc chứng chỉ hết hạn, cần reset kết nối. Xóa node khỏi cluster và tái đăng ký.
Trên Cloud Core, xóa node Edge:
kubectl delete node
Trên Edge Node, dừng và xóa container EdgeCore cũ:
docker stop $(docker ps -q --filter "name=edgecore")
docker rm $(docker ps -q --filter "name=edgecore")
Khởi động lại EdgeCore với cấu hình mới:
docker run -d --name edgecore --restart=always --privileged \
-v /var/lib/kubelet/:/var/lib/kubelet/ \
-v /etc/kubeedge/:/etc/kubeedge/ \
kubeedge/edgecore:latest
Kết quả mong đợi: Sau 1-2 phút, chạy kubectl get nodes trên Cloud thấy node Edge quay lại trạng thái Ready.
Verify kết quả Troubleshooting
Chạy lệnh kubectl get pods trên Cloud Core. Nếu tất cả pods trên Edge hiển thị trạng thái Running và có thể truy cập service từ Cloud, hệ thống đã phục hồi.
Điều hướng series:
Mục lục: Series: Xây dựng hệ thống Service Mesh an toàn cho Edge AI với KubeEdge và eBPF
« Phần 5: Triển khai và bảo mật workload AI trong kiến trúc Service Mesh
Phần 7: Nâng cao: Tự động hóa bảo mật và tối ưu hóa quy trình DevSecOps »