Cài đặt K3s Server Node trên Container Proxmox
Chuẩn bị Container LXC và cài đặt K3s
Tạo container LXC trên Proxmox với cấu hình CT (Container) chạy Ubuntu 22.04, cấp quyền CPU đầy đủ và bật tính năng unprivileged cho phép K3s chạy các container bên trong container.
Tại giao diện Proxmox (Shell), chạy lệnh tạo CT với các tham số tối ưu cho Kubernetes.
qm create 100 --ostype ubuntu --arch amd64 --cores 4 --memory 8192 --net0 name=vmbr0,bridge=vmbr0,ip=dhcp,firewall=0 --unprivileged 0 --features nesting=1,privileges=1 --description "K3s-Server-Node"
Kết quả mong đợi: Container ID 100 được tạo thành công và trạng thái là "running" sau khi khởi động.
Truy cập vào container vừa tạo, cập nhật hệ thống và cài đặt các gói cần thiết cho K3s.
apt update && apt install -y curl kube-runc containerd.io
Kết quả mong đợi: Các gói phần mềm được cài đặt mà không báo lỗi, sẵn sàng cho K3s.
Cài đặt K3s Server với chế độ single-node (tức là server cũng đóng vai trò worker) và cấu hình mạng để lắng nghe trên giao diện mạng cụ thể của Proxmox.
curl -sfL https://get.k3s.io | K3S_TOKEN="your-secret-token-here" sh -s - server --flannel-backend=wireguard-native --node-ip=192.168.1.10 --advertise-port=6443
Thay thế "your-secret-token-here" bằng token ngẫu nhiên bạn tự tạo (ví dụ: k3s-token-123) và "192.168.1.10" bằng IP thực tế của container Proxmox.
Kết quả mong đợi: K3s khởi động thành công, bạn thấy thông báo "K3s is starting up" và "K3s is running".
Cấu hình K3s Dashboard và Verify Server
Triển khai K3s Dashboard và cấu hình để có thể truy cập qua trình duyệt, đồng thời xác minh trạng thái node.
k3s kubectl apply -f https://raw.githubusercontent.com/k3s-io/dashboard/master/deploy.yaml
Kết quả mong đợi: Dashboard được deploy thành công với thông báo "deployment.apps created".
Check trạng thái node của server ngay lập tức.
k3s kubectl get nodes
Kết quả mong đợi: Danh sách hiển thị 1 node với trạng thái "Ready" và role "control-plane, master, worker".
Cấu hình K3s Agent Node trên thiết bị Jetson
Chuẩn bị môi trường Jetson cho K3s
Trên thiết bị Jetson (Jetson Nano/Xavier/Orin), cần đảm bảo Docker hoặc Containerd đã được cài đặt và NVIDIA Container Toolkit đã được cấu hình để K3s có thể sử dụng GPU.
Cài đặt NVIDIA Container Toolkit trên Jetson.
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit.gpg && curl -fsSL https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
Kết quả mong đợi: Kho lưu trữ NVIDIA được thêm vào apt sources.
Cập nhật và cài đặt gói toolkit.
sudo apt update && sudo apt install -y nvidia-container-toolkit
Kết quả mong đợi: Gói nvidia-container-toolkit được cài đặt thành công.
Tạo file cấu hình containerd để tích hợp NVIDIA runtime. Đây là bước quan trọng nhất để Jetson có thể chạy container GPU.
sudo mkdir -p /etc/containerd/conf.d && cat
Kết quả mong đợi: File cấu hình nvidia.toml được tạo tại /etc/containerd/conf/.
Khởi động lại containerd để áp dụng cấu hình.
sudo systemctl restart containerd
Kết quả mong đợi: Service containerd chạy lại mà không báo lỗi.
Cài đặt K3s Agent trên Jetson
Cài đặt K3s ở chế độ agent (worker node) và chỉ định IP của Jetson cùng token đã tạo ở phần Server Node.
curl -sfL https://get.k3s.io | K3S_URL="https://192.168.1.10:6443" K3S_TOKEN="your-secret-token-here" K3S_KUBECONFIG_MODE="644" sh -s - agent --node-ip=192.168.1.20 --flannel-backend=wireguard-native
Thay thế "192.168.1.20" bằng IP thực tế của Jetson và token tương ứng với server.
Kết quả mong đợi: K3s agent khởi động, log hiện thông báo "Starting K3s agent" và "Connecting to cluster".
Tích hợp Jetson vào Cluster K3s qua Proxmox Gateway
Cấu hình định tuyến (Routing) và Gateway
Vì Jetson và Proxmox container có thể nằm trên các mạng con (subnet) khác nhau hoặc cần đi qua gateway để liên lạc, ta cần đảm bảo thông lượng mạng.
Tại container Proxmox (Server Node), kích hoạt định tuyến IP để packet từ K3s có thể đi ra ngoài tới Jetson.
sysctl -w net.ipv4.ip_forward=1 && echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
Kết quả mong đợi: Lệnh chạy thành công, hệ thống cho phép chuyển tiếp gói tin mạng.
Cấu hình firewall (ufw hoặc iptables) trên Proxmox container để cho phép traffic từ Jetson vào port 6443 (API Server) và các port cần thiết của K3s (6443, 10250, 10256).
sudo ufw allow 6443/tcp && sudo ufw allow 10250/tcp && sudo ufw allow 10256/tcp && sudo ufw reload
Kết quả mong đợi: Firewall được cập nhật, rule mới được thêm vào và reload thành công.
Trên Jetson, đảm bảo Jetson có thể ping được IP của Proxmox Server (192.168.1.10).
ping -c 4 192.168.1.10
Kết quả mong đợi: Jetson nhận được phản hồi ping từ Server, chứng tỏ đường truyền mạng đã thông.
Kiểm tra trạng thái kết nối
Trên Jetson, xem log của K3s agent để xác nhận việc handshake với server đã thành công.
sudo journalctl -u k3s -f
Kết quả mong đợi: Log hiển thị dòng "Successfully connected to server" hoặc "Node registered" mà không có lỗi "dial tcp" hay "connection refused".
Xác minh trạng thái Cluster với kubectl và Dashboard
Verify Cluster Nodes
Trở lại container Proxmox (Server Node), chạy lệnh kubectl để kiểm tra số lượng node trong cluster.
k3s kubectl get nodes -o wide
Kết quả mong đợi: Danh sách hiển thị 2 node (1 Proxmox Server và 1 Jetson Agent) với trạng thái "Ready".
Chi tiết thông tin node Jetson để kiểm tra xem nó có được nhận diện là node GPU hay không (tùy thuộc vào driver và runtime đã cấu hình).
k3s kubectl describe node jetson-node-name
Thay "jetson-node-name" bằng tên hiển thị của node Jetson trong kết quả lệnh get nodes.
Kết quả mong đợi: Thông tin node hiện ra, phần "Allocated resources" và "Conditions" đều là "Ready".
Triển khai Test Pod với GPU
Tạo một Pod đơn giản yêu cầu tài nguyên GPU để xác minh toàn bộ pipeline từ Proxmox -> K3s -> Jetson GPU đã hoạt động.
cat
Kết quả mong đợi: Pod được tạo và chuyển sang trạng thái "Completed" sau khi chạy lệnh nvidia-smi, hoặc "Running" nếu hình ảnh là shell. Quan trọng nhất là không có lỗi "FailedScheduling" do thiếu GPU.
Xuất log của Pod để xem kết quả hiển thị thông tin GPU của Jetson.
k3s kubectl logs nvidia-gpu-test
Kết quả mong đợi: Màn hình hiển thị bảng thông tin GPU NVIDIA (Driver version, Memory usage) của Jetson.
Truy cập K3s Dashboard
Lấy token để truy cập Dashboard bằng lệnh k3s.
k3s kubectl -n k3s-dashboard create token admin
Kết quả mong đợi: Một chuỗi token dài được in ra màn hình.
Dùng lệnh k3s để expose dashboard ra port 8080 (hoặc dùng port-forward để truy cập từ xa).
k3s kubectl port-forward -n k3s-dashboard service/k3s-dashboard 8080:443
Kết quả mong đợi: Terminal giữ nguyên và hiển thị dòng "Forwarding from 127.0.0.1:8080 -> 443". Mở trình duyệt truy cập https://localhost:8080 và nhập token vừa tạo. Dashboard hiện ra với 2 nodes.
Đ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 3: Cài đặt và cấu hình NVIDIA Jetson cho Edge AI
Phần 5: Tích hợp hệ thống quản lý thiết bị biên (Device Management) »