Bài toán quản lý robot fleet
Khi fleet tăng từ 5 lên 50 rồi 500 robot, việc SSH vào từng máy để cập nhật phần mềm trở nên bất khả thi. Bạn cần một hệ thống tự động hóa việc deploy, rollback, monitoring và scaling — đó chính xác là những gì Kubernetes làm.
Nhưng Kubernetes tiêu chuẩn quá nặng cho edge device. Giải pháp: K3s — bản Kubernetes rút gọn chỉ chiếm 512MB RAM, chạy được trên Raspberry Pi và NVIDIA Jetson.
Kiến trúc K3s cho Robot Fleet
┌─────────────────────────────────────────┐
│ Cloud (Control Plane) │
│ ┌───────────┐ ┌──────────┐ │
│ │ K3s Server│ │ GitOps │ │
│ │ (master) │ │ (FluxCD) │ │
│ └───────────┘ └──────────┘ │
└──────────┬──────────────────────────────┘
│ WireGuard VPN
┌─────┼──────┬──────────┐
▼ ▼ ▼ ▼
┌────────┐┌────────┐┌────────┐┌────────┐
│Robot 1 ││Robot 2 ││Robot 3 ││Robot N │
│K3s ││K3s ││K3s ││K3s │
│Agent ││Agent ││Agent ││Agent │
└────────┘└────────┘└────────┘└────────┘
Cài đặt K3s
Server (Cloud/On-premise)
# Cài K3s server
curl -sfL https://get.k3s.io | sh -s - server \
--tls-san your-server-ip \
--write-kubeconfig-mode 644
# Lấy token để join agent
cat /var/lib/rancher/k3s/server/node-token
Agent (Trên mỗi robot)
# Cài K3s agent trên robot
curl -sfL https://get.k3s.io | K3S_URL=https://server-ip:6443 \
K3S_TOKEN="node-token-here" sh -s - agent
# Label robot theo loại và vị trí
kubectl label node robot-001 robot-type=amr location=warehouse-a
Deploy ứng dụng robot
Deployment manifest
# robot-controller.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: robot-controller
namespace: fleet
spec:
selector:
matchLabels:
app: robot-controller
template:
metadata:
labels:
app: robot-controller
spec:
nodeSelector:
robot-type: amr
containers:
- name: controller
image: registry.vnrobo.com/robot-controller:v2.1
resources:
limits:
memory: "512Mi"
cpu: "1"
volumeMounts:
- name: device-serial
mountPath: /dev/ttyUSB0
securityContext:
privileged: true # Cần cho hardware access
volumes:
- name: device-serial
hostPath:
path: /dev/ttyUSB0
Rolling Update — cập nhật không downtime
# Cập nhật image
kubectl set image daemonset/robot-controller \
controller=registry.vnrobo.com/robot-controller:v2.2 \
-n fleet
# Theo dõi rollout
kubectl rollout status daemonset/robot-controller -n fleet
# Rollback nếu có lỗi
kubectl rollout undo daemonset/robot-controller -n fleet
GitOps với FluxCD
GitOps biến Git repo thành single source of truth — mọi thay đổi cấu hình đều qua Git commit:
# Cài FluxCD
flux install
# Kết nối với Git repo
flux create source git robot-fleet \
--url=ssh://[email protected]/vnrobo/fleet-config \
--branch=main
# Auto-deploy khi có thay đổi
flux create kustomization robot-apps \
--source=robot-fleet \
--path="./apps" \
--prune=true \
--interval=5m
Workflow triển khai:
Developer commit → GitHub → FluxCD detect → K3s apply → Robot updated
Không cần SSH, không cần script, không cần nhớ robot nào đã update. FluxCD đảm bảo mọi robot luôn khớp với Git. Nếu bạn đang ở bước đầu với Docker, xem bài triển khai ứng dụng IoT với Docker trước khi chuyển sang Kubernetes.
Monitoring fleet
Prometheus + Grafana trên K3s
# Cài monitoring stack
helm repo add prometheus-community \
https://prometheus-community.github.io/helm-charts
helm install monitoring prometheus-community/kube-prometheus-stack \
--namespace monitoring --create-namespace \
--set prometheus.prometheusSpec.retention=7d \
--set grafana.adminPassword=${GRAFANA_PASS}
Custom metrics từ robot
from prometheus_client import Gauge, start_http_server
battery_level = Gauge('robot_battery_percent', 'Battery level', ['robot_id'])
mission_count = Gauge('robot_missions_completed', 'Missions done', ['robot_id'])
start_http_server(9090)
# Trong main loop
battery_level.labels(robot_id="amr-001").set(85.5)
mission_count.labels(robot_id="amr-001").inc()
Xử lý mạng không ổn định
Robot thường kết nối qua WiFi — mạng có thể mất bất cứ lúc nào:
- K3s agent auto-reconnect: khi mạng khôi phục, agent tự kết nối lại server
- Tolerations: cho phép pod chạy trên node
NotReadymột khoảng thời gian
tolerations:
- key: "node.kubernetes.io/unreachable"
operator: "Exists"
effect: "NoExecute"
tolerationSeconds: 300 # Chờ 5 phút trước khi reschedule
So sánh giải pháp fleet management
| Tiêu chí | K3s + GitOps | Ansible | Balena |
|---|---|---|---|
| Auto-healing | Có | Không | Có |
| Rolling update | Có | Thủ công | Có |
| Offline support | Tốt | Không | Tốt |
| Learning curve | Cao | Trung bình | Thấp |
| Linh hoạt | Rất cao | Cao | Trung bình |
| Chi phí | Miễn phí | Miễn phí | Có phí |
Lời khuyên
- Bắt đầu nhỏ: 3-5 robot trước, quen workflow rồi mới scale
- WireGuard VPN giữa server và robot — bảo mật và ổn định hơn expose K3s API
- Image registry riêng — tránh phụ thuộc Docker Hub, đặc biệt tại Việt Nam (tốc độ pull chậm)
- Test rollback trước — mỗi khi deploy version mới, luôn test rollback procedure
Kubernetes không phải overkill cho robot fleet — đó là cách duy nhất để quản lý đội robot chuyên nghiệp ở quy mô lớn. Kết hợp với MQTT cho telemetry, bạn có hạ tầng hoàn chỉnh cho robot fleet production.