Chiến lược Backup và Restore cho Proxmox và K3s
Cấu hình Backup tự động trên Proxmox
Thiết lập task backup định kỳ trên Proxmox VE để đảm bảo toàn bộ VM và Container (bao gồm cả K3s server và Jetson nodes) được lưu trữ an toàn.
Truy cập giao diện web Proxmox, chọn Datacenter > Backup Schedule. Hoặc sử dụng command line để tạo task cron.
Trong trường hợp này, ta sẽ tạo backup toàn bộ VM (Level 1) vào thời điểm ít tải nhất, sử dụng chế độ snapshot để giảm downtime.
pvesm backup schedule add "backup-edge-cluster" "1 2 * * *" --vmid "100,101,102" --mode "snapshot" --compress "zstd" --storage "backup-nas"
Kết quả mong đợi: Task "backup-edge-cluster" xuất hiện trong danh sách Backup Schedule, chạy vào lúc 2:01 AM mỗi ngày, lưu file .vma.zst vào storage "backup-nas".
Backup dữ liệu trạng thái K3s (Kubernetes State)
Backup chỉ VM chưa đủ, cần lưu trữ dữ liệu metadata của cluster (ConfigMap, Secret, PersistentVolume). Sử dụng tool Velero để backup Kubernetes resources và PV.
Ta cần cài đặt Velero client trên local machine hoặc node quản lý, cấu hình backup schedule để tự động lưu vào object storage (MinIO hoặc S3).
velero backup create backup-edge-daily --schedule "0 3 * * *" --default-backup-location --include-namespaces "edge-ai-system,jetson-nodes" --snapshot-volumes true
Kết quả mong đợi: Velero tạo backup mới vào lúc 3:00 AM mỗi ngày, bao gồm cả snapshot của volume chứa model AI và logs trên Jetson nodes.
Restore nhanh sau thảm họa
Khi cần khôi phục toàn bộ hệ thống từ backup Proxmox, ta restore VM trước, sau đó khôi phục state của K3s bằng Velero.
Quy trình này đảm bảo IP address và cấu hình mạng được giữ nguyên nếu dùng backup snapshot, sau đó đồng bộ lại dữ liệu container.
# Restore VM từ Proxmox (giả sử backup file là backup-edge-cluster-100-2023-10-27T020100Z.vma.zst)
pvesm backup restore backup-nas backup-edge-cluster-100-2023-10-27T020100Z.vma.zst 100
# Restore Kubernetes state sau khi VM đã chạy
velero restore create restore-from-backup --from-backup backup-edge-daily-2023-10-27T030000Z --wait
Kết quả mong đợi: VM Jetson khởi động lại với trạng thái cũ, Pod trong namespace "edge-ai-system" và "jetson-nodes" quay về trạng thái Running sau vài phút.
Xử lý các lỗi thường gặp: Jetson mất kết nối, GPU driver crash
Khắc phục Jetson mất kết nối mạng (Network Hang)
Hiện tượng phổ biến trên Jetson là driver mạng hoặc switch vật lý bị treo, khiến node mất kết nối với K3s master nhưng vẫn đang chạy (Zombie state).
Giải pháp là cấu hình keepalive trên network interface và script tự động restart network service khi phát hiện mất kết nối với master.
Tạo file script ở đường dẫn /usr/local/bin/network-recovery.sh trên Jetson node.
#!/bin/bash
# /usr/local/bin/network-recovery.sh
MASTER_IP="192.168.1.10"
PING_COUNT=3
INTERFACE="eth0"
if ! ping -c $PING_COUNT -W 1 $MASTER_IP > /dev/null 2>&1; then
echo "[$(date)] Network unreachable, restarting interface $INTERFACE..."
ip link set $INTERFACE down
sleep 2
ip link set $INTERFACE up
systemctl restart systemd-networkd
# Force rejoin cluster if needed
k3s agent --token YOUR_TOKEN --server https://$MASTER_IP:6443
echo "[$(date)] Network recovery completed."
fi
Chạy script qua cron mỗi 5 phút: */5 * * * * root /usr/local/bin/network-recovery.sh
Kết quả mong đợi: Khi mất mạng, Jetson tự động reset interface và reconnect lại với K3s server, trạng thái node quay về Ready.
Xử lý sự cố GPU Driver Crash trên Jetson
Driver NVIDIA trên Jetson (L4T) đôi khi bị crash do overheating hoặc lỗi memory khi chạy model AI nặng, dẫn đến việc container GPU bị OOM hoặc lỗi "cuda error".
Cần cấu hình watchdog để restart container khi GPU driver bị lỗi, thay vì để nó treo vĩnh viễn.
Chỉnh sửa manifest deployment của model AI để thêm probe kiểm tra GPU và giới hạn tài nguyên.
apiVersion: apps/v1
kind: Deployment
metadata:
name: edge-ai-model
spec:
replicas: 1
selector:
matchLabels:
app: edge-ai
template:
spec:
containers:
- name: inference
image: your-edge-ai-model:latest
resources:
limits:
nvidia.com/gpu: 1
livenessProbe:
exec:
command:
- nvidia-smi
- -q
- | grep
- -i
- "CUDA"
initialDelaySeconds: 30
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 3
readinessProbe:
exec:
command:
- nvidia-smi
- -q
initialDelaySeconds: 10
periodSeconds: 5
Kết quả mong đợi: Khi GPU driver crash, command `nvidia-smi` trả về lỗi, Kubernetes tự động kill container và khởi tạo lại instance mới (Restart Policy).
Reset hoàn toàn Jetson node bị lỗi hệ thống
Khi Jetson bị lỗi nghiêm trọng không thể recover qua mạng, cần cơ chế reset phần cứng hoặc recovery mode qua serial console.
Sử dụng script trên Proxmox để gửi lệnh QEMU reset hoặc power cycle nếu Jetson chạy dưới dạng VM, hoặc điều khiển GPIO nếu là thiết bị vật lý.
# Trên Proxmox VE (VMID 102 là Jetson node)
qm reset 102
Nếu là Jetson vật lý, cấu hình script trên K3s master để trigger I2C reset pin (ví dụ pin GPIO 5) thông qua sidecar container trên node đó.
# Script bên trong container sidecar trên Jetson
echo 1 > /sys/class/gpio/export 5
echo out > /sys/class/gpio/gpio5/direction
echo 0 > /sys/class/gpio/gpio5/value
sleep 0.5
echo 1 > /sys/class/gpio/gpio5/value
Kết quả mong đợi: Jetson thực hiện hard reset, khởi động lại hệ điều hành và reconnect vào cluster sau khi boot xong.
Tự động hóa recovery khi node Edge bị sập
Cấu hình Pod Disruption Budget (PDB)
Để đảm bảo dịch vụ AI vẫn hoạt động khi một node Jetson bị sập, ta cần phân tán các pod inference sang các node khác hoặc restart ngay lập tức.
Định nghĩa PDB để Kubernetes không cho phép xóa quá nhiều pod cùng lúc, nhưng ưu tiên di chuyển pod sang node healthy.
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: edge-ai-pdb
spec:
minAvailable: 1
selector:
matchLabels:
app: edge-ai
Kết quả mong đợi: Khi một node Jetson down, Kubernetes tự động schedule lại pod còn lại lên node khác hoặc restart trên node đó khi nó quay lại, đảm bảo luôn có ít nhất 1 pod chạy.
Sử dụng DaemonSet cho các dịch vụ hệ thống
Các dịch vụ quan trọng như logging agent, monitoring exporter cần chạy trên mọi node Jetson. Nếu node sập, DaemonSet sẽ tự động deploy lại khi node quay lại.
Đảm bảo DaemonSet có affinity hoặc toleration phù hợp để chỉ chạy trên node có label "edge-ai=true".
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: edge-monitoring-agent
spec:
selector:
matchLabels:
app: monitoring
template:
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/os
operator: In
values:
- linux
- key: node-type
operator: In
values:
- edge-ai
containers:
- name: agent
image: prometheus/node-exporter:latest
resources:
limits:
memory: 100Mi
Kết quả mong đợi: Khi node mới được thêm vào hoặc node cũ recover, container monitoring agent tự động khởi chạy mà không cần can thiệp thủ công.
Tự động loại bỏ node lỗi khỏi Cluster (Node Auto-Cordon)
Khi phát hiện node không phản hồi trong thời gian dài (tính bằng heartbeat), Kubernetes sẽ đánh dấu node là NotReady. Cần script tự động cordon và drain node để tránh schedule pod mới vào.
Script chạy trên K3s master để quét các node trong trạng thái NotReady hơn 5 phút.
#!/bin/bash
# /usr/local/bin/auto-cordon-failed-nodes.sh
THRESHOLD_SECONDS=300
kubectl get nodes --no-headers | while read line; do
NODE_NAME=$(echo $line | awk '{print $1}')
STATUS=$(echo $line | awk '{print $2}')
if [ "$STATUS" == "NotReady" ]; then
# Check node creation time or last heartbeat logic here
# Simplified: Cordon if NotReady
echo "Cordoning node $NODE_NAME due to NotReady status"
kubectl cordon $NODE_NAME
# Optional: Drain if no critical pods
# kubectl drain $NODE_NAME --ignore-daemonsets --delete-emptydir-data
fi
done
Chạy script qua cron mỗi phút: * * * * * root /usr/local/bin/auto-cordon-failed-nodes.sh
Kết quả mong đợi: Các pod trên node lỗi được di chuyển (drain) sang node khác, và node đó bị đóng (cordon) để không nhận thêm workload mới.
Mẹo tối ưu chi phí và mở rộng quy mô cluster
Tối ưu hóa tài nguyên GPU cho Jetson
Jetson có tài nguyên GPU hạn chế (RAM và CUDA cores). Không nên chạy nhiều container GPU nặng cùng lúc trên một board.
Sử dụng GPU Partitioning (MPS hoặc MIG nếu hỗ trợ) hoặc giới hạn số lượng pod GPU trên mỗi node bằng resource quota.
apiVersion: v1
kind: ResourceQuota
metadata:
name: jetson-gpu-quota
namespace: edge-ai-system
spec:
hard:
nvidia.com/gpu: "1"
Đồng thời, cấu hình K3s để sử dụng NVIDIA Device Plugin với chế độ "shared" nếu cần chạy nhiều workload nhẹ.
# Trong file config /etc/rancher/k3s/k3s.yaml
kubelet-arg:
- "--device-plugins-path=/var/lib/kubelet/device-plugins"
- "--allow-privileged=true"
Kết quả mong đợi: Mỗi namespace chỉ được cấp tối đa 1 GPU, tránh tình trạng một container chiếm hết tài nguyên làm treo cả hệ thống.
Giảm chi phí lưu trữ logs và Metrics
Edge AI sinh ra lượng logs và metrics khổng lồ. Lưu trữ toàn bộ về cloud là tốn kém. Áp dụng chiến lược lọc và tổng hợp tại biên (Edge Aggregation).
Cấu hình Loki hoặc Prometheus trên Jetson chỉ lưu logs mức ERROR hoặc WARN, và chỉ gửi metrics tổng hợp (aggregate) về master.
# Ví dụ cấu hình Loki Receiver trên Jetson (file /etc/loki/config.yaml)
positions_file: /var/lib/loki/positions
auth_enabled: false
server:
http_listen_port: 3100
ingester:
lifecycler:
ring:
kvstore:
store: inmemory
replication_factor: 1
chunk_idle_period: 5m
chunk_retain_period: 24h
schema_config:
configs:
- from: 2020-01-01
store: boltdb
object_store: filesystem
schema: v11
index_prefix: index_
storage_config:
boltdb:
directory: /var/lib/loki/index
filesystem:
directory: /var/lib/loki/chunks
limits_config:
retention_period: 24h
max_bytes_per_entry: 1048576
max_line_size: 1048576
Kết quả mong đợi: Giảm 80% lưu lượng mạng và dung lượng lưu trữ trên cloud, chỉ lưu lại dữ liệu quan trọng trong 24h tại edge trước khi bị xóa tự động.
Mở rộng quy mô cluster (Horizontal Scaling)
Để mở rộng cluster, không cần cài đặt thủ công từng node. Sử dụng script provisioning tự động dựa trên template VM hoặc script bootstrapping.
Khi thêm Jetson mới vào mạng, nó tự động join cluster thông qua bootstrap token đã cấu hình sẵn trong DHCP option hoặc script init.
# Script tự động join cluster (chạy trên Jetson mới)
curl -sfL https://get.k3s.io | K3S_TOKEN=YOUR_BOOTSTRAP_TOKEN K3S_URL=https://192.168.1.10:6443 sh -
Kết quả mong đợi: Sau khi boot, Jetson mới tự động trở thành node worker trong K3s cluster, trạng thái chuyển sang Ready và sẵn sàng nhận pod.
Verify kết quả tổng thể
Để xác nhận toàn bộ hệ thống hoạt động ổn định sau khi áp dụng các biện pháp trên, thực hiện các lệnh kiểm tra sau:
- Đảm bảo backup chạy đúng lịch:
velero backup get | grep backup-edge-daily
- Kiểm tra trạng thái node và pod:
kubectl get nodes && kubectl get pods -A
- Mô phỏng lỗi bằng cách tắt một node:
kubectl drain jetson-node-1 --ignore-daemonsets và quan sát pod chuyển sang node khác.
- Đảm bảo GPU vẫn hoạt động:
nvidia-smi -L trên mỗi node.
Kết quả mong đợi: Tất cả pod vẫn Running, không có node nào ở trạng thái SchedulingDisabled (trừ node đang drain), và logs không báo lỗi critical liên tục.
Điều hướng series:
Mục lục: Series: Series: Xây dựng nền tảng Edge AI với NVIDIA Jetson, Kubernetes K3s và hệ thống quản lý thiết bị biên trên hạ tầng Proxmox
« Phần 8: Giám sát, Logging và bảo mật cho hệ thống Edge