Tích hợp KubeEdge làm nền tảng quản lý thiết bị biên
Triển khai KubeEdge Core và Edge trên cụm K3s
Chúng ta sẽ sử dụng KubeEdge làm giải pháp quản lý thiết bị biên (Device Management) thay vì EdgeX Foundry để tận dụng khả năng tích hợp sâu với Kubernetes K3s và tối ưu hóa giao tiếp qua MQTT cho các thiết bị Jetson.
Trước tiên, cần thêm repository Helm cho KubeEdge vào cluster K3s đã triển khai ở phần 4.
helm repo add kubesphere https://charts.kubesphere.io
helm repo update
helm install kubeedge kubesphere/kubeedge --namespace kubeedge --create-namespace --set cloudcore.mode=static --set edgecore.mode=static
Kết quả mong đợi: Các Pod của KubeEdge (cloudcore và edgecore) chuyển sang trạng thái Running trong namespace kubeedge.
kubectl get pods -n kubeedge
Các Pod sẽ hiển thị trạng thái Running và READY 1/1.
Cấu hình Jetson tham gia vào mạng lưới KubeEdge
Trên thiết bị NVIDIA Jetson đã cài K3s (Edge Node), chúng ta cần cấu hình để nó đóng vai trò là Edge Node và kết nối với Cloud Core của KubeEdge.
Chỉnh sửa file cấu hình K3s trên Jetson để chỉ định endpoint của KubeEdge Cloud Core.
Đường dẫn file: /etc/rancher/k3s/config.yaml
server: https://:6443
token:
flannel-backend: none
disable: [servicelb, traefik]
extra-kube-args: "--feature-gates=EdgeAgent=true"
node-labels:
- "edge=true"
- "type=jetson"
Thay thế <IP_CLOUD_CORE> bằng IP của máy chủ Proxmox và <K3S_TOKEN> bằng token từ máy chủ chính.
Khởi động lại dịch vụ K3s trên Jetson để áp dụng cấu hình.
systemctl restart k3s
systemctl enable k3s
Kết quả mong đợi: Jetson sẽ tự động join vào cluster K3s và được KubeEdge nhận diện là Edge Node.
kubectl get nodes
Node Jetson sẽ xuất hiện trong danh sách với nhãn edge=true và type=jetson.
Cấu hình Agent và cơ chế báo cáo trạng thái
Triển khai Edge Mesh và Device Plugin
KubeEdge cung cấp cơ chế Device Plugin để quản lý phần cứng (GPU NVIDIA trên Jetson) và Edge Mesh để định tuyến traffic giữa Cloud và Edge.
Tải và áp dụng manifest cho NVIDIA Device Plugin tương thích với KubeEdge trên Jetson.
curl -sL https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.14.0/deployments/static/nvidia-device-plugin.yml | kubectl apply -f -
Kết quả mong đợi: Pod nvidia-device-plugin chạy trên Node Jetson và đăng ký tài nguyên GPU vào Kubernetes.
kubectl get pods -n kube-system | grep nvidia
Pod sẽ ở trạng thái Running.
Báo cáo trạng thái thiết bị lên Proxmox (Cloud Core)
Để Proxmox (hoặc Cloud Controller) nhận biết trạng thái thời gian thực của Jetson, chúng ta sẽ cấu hình EdgeCore của KubeEdge gửi telemetry qua MQTT.
Cấu hình file edgecore.yaml trên Jetson để bật module MQTT và định nghĩa rule gửi dữ liệu.
Đường dẫn file: /etc/edgecore/edgecore.yaml
modules:
kubelet:
enabled: true
device:
enabled: true
protocol: mqtt
config:
broker: "tcp://:1883"
topic: "jetson/telemetry"
mesh:
enabled: true
config:
listenPort: 10001
bindAddr: "0.0.0.0"
Thay thế <IP_CLOUD_CORE> bằng IP của Proxmox.
Khởi động lại dịch vụ edgecore trên Jetson.
systemctl restart edgecore
Kết quả mong đợi: EdgeCore sẽ kết nối thành công với MQTT Broker trên Cloud Core.
journalctl -u edgecore -f
Log sẽ hiển thị dòng Connected to MQTT broker và không có lỗi kết nối.
Tự động hóa phát hiện và đăng ký thiết bị
Triển khai Admission Controller cho tự động hóa
Chúng ta sẽ sử dụng Mutating Webhook Admission Controller để tự động gán nhãn và cấu hình cho bất kỳ Node mới nào join vào cluster nếu nó có đặc điểm của Jetson.
Viết script Python đơn giản chạy trên Cloud Core để lắng nghe sự kiện Node mới và tự động cấu hình.
Đường dẫn file: /opt/scripts/edge-automator.py
#!/usr/bin/env python3
import kubernetes
import time
def main():
kubernetes.config.load_kube_config()
v1 = kubernetes.client.CoreV1Api()
while True:
nodes = v1.list_node()
for node in nodes.items:
if node.metadata.name not in ['master', 'proxmox']: # Bỏ qua node master
if 'edge' not in node.metadata.labels:
# Tự động gán nhãn
v1.patch_node(
name=node.metadata.name,
body={
'metadata': {
'labels': {
'edge': 'true',
'managed-by': 'kubeedge'
}
}
}
)
print(f"Auto-registered edge node: {node.metadata.name}")
time.sleep(30)
if __name__ == '__main__':
main()
Chạy script này như một CronJob hoặc DaemonSet trên Cloud Core.
kubectl create configmap edge-automator --from-file=script=/opt/scripts/edge-automator.py
kubectl create -f -
Kết quả mong đợi: Khi thêm một Jetson mới vào mạng, script sẽ tự động gán nhãn edge=true trong vòng 30 giây.
kubectl get nodes -L edge
Node mới sẽ xuất hiện với giá trị edge là true.
Quản lý phiên bản Firmware và OTA Update
Triển khai K3s Upgrade Mechanism qua KubeEdge
Để thực hiện OTA update firmware hoặc K3s version trên Jetson, chúng ta sẽ sử dụng cơ chế "Static Pod" của KubeEdge để đẩy manifest cấu hình mới xuống Edge Node.
Tạo file manifest chứa cấu hình K3s mới cần triển khai.
Đường dẫn file: /opt/updates/k3s-config-v2.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: k3s-edge-config
namespace: kubeedge
data:
config.yaml: |
server: https://:6443
token:
flannel-backend: none
disable: [servicelb, traefik]
node-labels:
- "edge=true"
- "type=jetson"
- "firmware-version=2.0"
Áp dụng ConfigMap này vào cluster K3s trên Cloud Core.
kubectl apply -f /opt/updates/k3s-config-v2.yaml
Kết quả mong đợi: ConfigMap được tạo thành công trong namespace kubeedge.
Viết Edge Service để kích hoạt cập nhật
Trên Jetson, cần có một service (Edge Service) lắng nghe sự kiện từ Cloud Core để áp dụng cấu hình mới và thực hiện restart dịch vụ.
Sử dụng KubeEdge Edge Service mechanism (thông qua MQTT hoặc HTTP) để kích hoạt script update.
Đường dẫn file: /etc/kubeedge/edge-service.yaml
apiVersion: core.kubeedge.io/v1beta1
kind: EdgeService
metadata:
name: firmware-updater
namespace: kubeedge
spec:
rules:
- name: update-trigger
action: exec
command: /usr/local/bin/apply-update.sh
parameters:
- "k3s-edge-config"
Viết script thực thi trên Jetson để đọc config mới và restart.
Đường dẫn file: /usr/local/bin/apply-update.sh
#!/bin/bash
CONFIG_NAME=$1
if [ -z "$CONFIG_NAME" ]; then
echo "No config name provided"
exit 1
fi
# Pull new config from K8s
kubectl get configmap $CONFIG_NAME -n kubeedge -o yaml | kubectl apply -f -
# Backup current config
cp /etc/rancher/k3s/config.yaml /etc/rancher/k3s/config.yaml.bak
# Apply new config from ConfigMap data
kubectl get configmap $CONFIG_NAME -n kubeedge -o jsonpath='{.data.config\.yaml}' > /etc/rancher/k3s/config.yaml
# Restart K3s to apply changes
systemctl restart k3s
echo "OTA Update completed successfully"
Cấp quyền thực thi cho script.
chmod +x /usr/local/bin/apply-update.sh
Kết quả mong đợi: Khi Cloud Core gửi sự kiện trigger, script sẽ tự động chạy và cập nhật cấu hình K3s trên Jetson mà không cần truy cập trực tiếp vào thiết bị.
systemctl status k3s
Dịch vụ K3s sẽ ở trạng thái active (running) với cấu hình mới nhất.
Verify kết quả toàn bộ hệ thống
Kiểm tra trạng thái tổng thể
Thực hiện các lệnh sau trên Cloud Core (Proxmox) để xác minh toàn bộ quy trình quản lý thiết bị đã hoạt động.
kubectl get nodes -L edge,type
kubectl get pods -n kubeedge
kubectl get edgenode -n kubeedge
kubectl logs -n kubeedge -f cloudcore
Kết quả mong đợi:
- Tất cả Jetson đều có nhãn
edge=true.
- Các Pod của KubeEdge đều
Running.
- Tồn tại tài nguyên
EdgeNode tương ứng với Jetson.
- Log Cloud Core hiển thị kết nối MQTT thành công từ tất cả các Jetson.
Đ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 4: Triển khai Kubernetes K3s trên hạ tầng Proxmox và Jetson
Phần 6: Triển khai mô hình AI và container GPU trên Jetson »