1. Viết mã giả lập cảm biến (Sensor Simulator) trên Node Edge
Chúng ta cần tạo một ứng dụng Python đơn giản chạy trên Node Edge để mô phỏng hành vi của các thiết bị IoT thực tế. Ứng dụng này sẽ đọc dữ liệu ngẫu nhiên (nhiệt độ, độ ẩm) và đẩy chúng lên MQTT Broker đã cấu hình ở các phần trước.
Tạo file Python với tên sensor_simulator.py trên Node Edge. Mã này sử dụng thư viện paho-mqtt để kết nối.
cat > /home/ubuntu/sensor_simulator.py
Set quyền thực thi cho file script.
chmod +x /home/ubuntu/sensor_simulator.py
Verify kết quả: Chạy thử script trực tiếp trên Node Edge để đảm bảo nó kết nối được với Broker và in log.
export MQTT_BROKER_URL=192.168.1.10 && python3 /home/ubuntu/sensor_simulator.py
Kết quả mong đợi: Bạn thấy dòng log "Kết nối thành công..." và dữ liệu JSON được in ra mỗi 5 giây. Nhấn Ctrl+C để dừng.
2. Tạo Dockerfile và Build Image cho Sensor Simulator
Để chạy trên K3s/KubeEdge, ứng dụng cần đóng gói trong container. Chúng ta sẽ tạo Dockerfile để build image từ script Python trên.
Tạo file Dockerfile trong cùng thư mục chứa script.
cat > /home/ubuntu/Dockerfile
Build image Docker. Thay thế edge-sensor:latest bằng tên tag phù hợp với registry của bạn nếu dùng registry riêng, hoặc giữ nguyên nếu dùng local registry của K3s.
docker build -t edge-sensor:latest .
Kết quả mong đợi: Docker build thành công và hiển thị dòng "Successfully tagged edge-sensor:latest".
3. Tạo Deployment và Service cho ứng dụng thu thập dữ liệu
Bây giờ chúng ta sẽ tạo Kubernetes manifest để triển khai ứng dụng này lên cụm K3s. Chúng ta cần một Deployment để quản lý Pod và một Service để expose (nếu cần) hoặc định danh.
Tạo file sensor-deployment.yaml trên Node Master.
cat > /root/sensor-deployment.yaml
Apply deployment vào cluster.
kubectl apply -f /root/sensor-deployment.yaml
Verify kết quả: Kiểm tra trạng thái Pod trên Node Edge.
kubectl get pods -l app=sensor-simulator -o wide
Kết quả mong đợi: Pod ở trạng thái Running và NODE là tên Node Edge của bạn.
4. Cấu hình KubeEdge Module (METADATA, APPS) để chạy ứng dụng offline
KubeEdge có cơ chế "Edge Mesh" và cache để đảm bảo ứng dụng vẫn chạy hoặc có thể khởi động lại ngay khi mất kết nối Cloud (Offline). Mặc định, KubeEdge đã đồng bộ Pod, nhưng để tối ưu hóa việc quản lý trạng thái và đảm bảo tính sẵn sàng cao, chúng ta cần hiểu cách KubeEdge xử lý metadata.
KubeEdge sử dụng edgecore trên Node Edge để lắng nghe sự kiện từ Cloud. Nếu mất kết nối, edgecore sẽ dựa vào local cache của KubeEdge (thường lưu trong /var/lib/kubelet/pods và internal store của edgecore) để duy trì trạng thái Pod.
Để đảm bảo Pod của chúng ta được KubeEdge ưu tiên giữ lại và khởi động lại khi mạng yếu, chúng ta thêm annotation đặc biệt vào Deployment (nếu cần) hoặc đảm bảo edgecore đang chạy đúng cấu hình. Ở đây, chúng ta sẽ kiểm tra cấu hình edgecore để đảm bảo module apps và metadata đang hoạt động.
Trên Node Edge, kiểm tra file cấu hình edgecore.yaml.
cat /etc/edgecore/edgecore.yaml | grep -A 10 "modules:"
Nội dung cần có (nếu chưa có, hãy chỉnh sửa file /etc/edgecore/edgecore.yaml):
modules:
apps:
enable: true
appConfig: /etc/edgecore/app.conf
metadata:
enable: true
net:
enable: true
tunnel:
enable: true
route:
enable: true
device:
enable: true
edgehub:
enable: true
Tái khởi động edgecore để áp dụng nếu có thay đổi.
systemctl restart edgecore
Verify kết quả: Kiểm tra log của edgecore để đảm bảo module apps và metadata đang hoạt động.
journalctl -u edgecore -f | grep -E "apps|metadata"
Kết quả mong đợi: Thấy các dòng log xác nhận module apps và metadata đã khởi động thành công.
5. Sử dụng MQTT Broker để truyền dữ liệu từ Edge về Cloud
Chúng ta đã có Sensor Simulator gửi dữ liệu lên MQTT Broker. Bây giờ, để dữ liệu này đi từ Edge về Cloud (hoặc đến nơi xử lý), Broker đóng vai trò trung tâm. Trong kiến trúc KubeEdge, Broker thường được đặt trên Master Node hoặc một Node trung gian.
Trên Node Master (nơi chạy Broker), chúng ta cần một service lắng nghe topic iot/sensors/data để nhận dữ liệu từ Edge. Chúng ta sẽ tạo một Pod đơn giản dùng thư viện paho-mqtt để subscribe và in ra console (hoặc ghi file log).
Tạo file mqtt-subscriber.yaml trên Node Master.
cat > /root/mqtt-subscriber.yaml
Deploy Pod subscriber trên Master.
kubectl apply -f /root/mqtt-subscriber.yaml
Verify kết quả: Theo dõi log của Pod subscriber để xem dữ liệu từ Edge có về không.
kubectl logs -f mqtt-subscriber
Kết quả mong đợi: Bạn thấy dòng log [RECEIVED] iot/sensors/data: { ... } xuất hiện mỗi 5 giây, trùng khớp với dữ liệu Sensor Simulator đã gửi. Điều này chứng tỏ đường truyền từ Edge (KubeEdge) -> MQTT Broker -> Cloud (Master) đã thông suốt.
6. Triển khai dashboard giám sát thời gian thực cho dữ liệu IoT
Để trực quan hóa dữ liệu, chúng ta sẽ sử dụng Grafana kết hợp với InfluxDB (hoặc Prometheus) để vẽ biểu đồ. Ở đây, chúng ta sẽ cấu hình nhanh một dashboard nhận dữ liệu từ MQTT thông qua một adapter đơn giản hoặc sử dụng Grafana Cloud nếu có, nhưng để tự chủ (self-hosted), chúng ta dùng Telegraf để nhận MQTT và đẩy vào InfluxDB, sau đó Grafana hiển thị.
Tuy nhiên, để đơn giản hóa trong tutorial này, chúng ta sẽ dùng MQTT Explorer hoặc một dashboard web đơn giản chạy trên Node Master để hiển thị JSON raw. Nhưng theo yêu cầu "Dashboard giám sát thời gian thực", chúng ta sẽ deploy Telegraf + InfluxDB + Grafana dạng Pod trên Master.
Tạo file iot-monitoring-stack.yaml để deploy toàn bộ stack.
cat > /root/iot-monitoring-stack.yaml
Lưu ý: Cấu hình Token InfluxDB trong ConfigMap trên chỉ là placeholder. Bạn cần tạo token thực sự sau khi InfluxDB chạy.
Deploy stack.
kubectl apply -f /root/iot-monitoring-stack.yaml
Verify kết quả: Port-forward Grafana để truy cập qua trình duyệt.
kubectl port-forward svc/grafana-svc 3000:3000
Mở trình duyệt truy cập http://localhost:3000 (User/Pass mặc định: admin/admin).
Trong Grafana:
- Đi đến
Configuration -> Data Sources -> Add data source -> InfluxDB.
- URL:
http://influxdb:8086.
- Token: Token bạn đã tạo trong InfluxDB (hoặc dùng
admin123 nếu cấu hình đơn giản hơn, nhưng khuyến nghị dùng Token).
- Database:
sensor-data.
Sau đó tạo Dashboard mới, chọn InfluxDB, và viết query Flux để vẽ biểu đồ nhiệt độ:
from(bucket: "sensor-data")
|> range(start: -1h)
|> filter(fn: (r) => r._measurement == "sensor_data")
|> filter(fn: (r) => r._field == "temperature")
|> aggregateWindow(every: 1m, fn: mean, createEmpty: false)
|> yield(name: "mean")
Kết quả mong đợi: Bạn thấy biểu đồ nhiệt độ thay đổi theo thời gian thực, khớp với dữ liệu Sensor Simulator đang gửi mỗi 5 giây.
Điều hướng series:
Mục lục: Series: Xây dựng nền tảng Edge Computing an toàn với K3s, KubeEdge và WireGuard cho IoT
« Phần 5: Cấu hình bảo mật và định tuyến lưu lượng giữa Cloud và Edge
Phần 7: Quản lý ứng dụng Edge trong môi trường không ổn định »