Cấu hình tính năng Edge Mesh để giữ trạng thái khi mất kết nối
Trong môi trường IoT, kết nối mạng thường bị gián đoạn. Edge Mesh (KubeEdge) cho phép các node Edge giao tiếp trực tiếp với nhau hoặc lưu trạng thái cục bộ mà không cần qua Cloud khi mất kết nối. Chúng ta sẽ kích hoạt tính năng này trên Edge Node.
Trước tiên, cần đảm bảo Edge Core (trên Master) và Edge Agent (trên Worker) đang chạy. Sau đó, ta sẽ cấu hình file kubeconfig của Edge Agent để kích hoạt chế độ offline-tolerant.
Thao tác trên Edge Node (Worker):
sudo systemctl status kubeedge-edgeagent
Kết quả mong đợi: Trạng thái là active (running). Nếu chưa chạy, cần khởi động lại service trước khi cấu hình.
Tạo cấu hình Mesh Edge
Chúng ta sẽ tạo một manifest YAML để định nghĩa chính sách giữ trạng thái (state persistence) cho ứng dụng khi mất kết nối với Cloud. KubeEdge sử dụng cơ chế "Edge Mesh" để đồng bộ trạng thái giữa các container trên cùng một node hoặc các node lân cận.
Trên Edge Node, tạo file cấu hình tại /etc/kubeedge/config.yaml (nếu chưa tồn tại) hoặc chỉnh sửa file cấu hình agent hiện có để bật tính năng mesh.
Đường dẫn: /etc/kubeedge/config.yaml
module:
edge:
enableMesh: true
meshConfig:
listenPort: 10000
maxConnections: 100
keepAliveInterval: 30
keepAliveTimeout: 10
agent:
enableEdgeMesh: true
meshConfig:
listenPort: 10000
maxConnections: 100
Kết quả mong đợi: File cấu hình được lưu thành công. Sau khi khởi động lại Edge Agent, tính năng Mesh sẽ được kích hoạt, cho phép các ứng dụng trên Edge Node trao đổi dữ liệu nội bộ ngay cả khi mất kết nối với K3s Master.
Khởi động lại Edge Agent để áp dụng cấu hình
Áp dụng các thay đổi trong file cấu hình vừa tạo.
sudo systemctl restart kubeedge-edgeagent
Kết quả mong đợi: Service khởi động lại thành công, không có lỗi trong log. Kiểm tra log để xác nhận tính năng Mesh đã bật.
sudo journalctl -u kubeedge-edgeagent -f | grep -i "mesh"
Kết quả mong đợi: Xuất hiện dòng log xác nhận Edge Mesh enabled hoặc Starting Edge Mesh service.
Xử lý trường hợp mất mạng: tự động đồng bộ khi kết nối lại
Khi kết nối được khôi phục, KubeEdge cần cơ chế để đồng bộ lại trạng thái của Pod từ Edge Node về Cloud (K3s Master). Tính năng này được gọi là "Offline Sync" hoặc "Reconnection Sync".
Chúng ta sẽ cấu hình chính sách đồng bộ trong Edge Core trên Master Node để đảm bảo mọi thay đổi trạng thái (status) của Pod được đẩy về khi mạng quay lại.
Cấu hình chính sách đồng bộ trên Edge Core
Trên Master Node, chỉnh sửa file cấu hình của Edge Core để kích hoạt cơ chế đồng bộ trạng thái khi reconnect.
Đường dẫn: /etc/kubeedge/config.yaml (trên Master)
module:
cloud:
enableEdgeCore: true
syncConfig:
enableSync: true
syncInterval: 10s
reconnectBackoff:
min: 1s
max: 60s
factor: 2
agent:
enableEdgeMesh: true
Kết quả mong đợi: File cấu hình được cập nhật. Cơ chế backoff sẽ giúp hệ thống không bị quá tải khi cố gắng reconnect liên tục, đồng thời đảm bảo đồng bộ đầy đủ sau khi mạng ổn định.
Khởi động lại Edge Core
Áp dụng cấu hình mới trên Master Node.
sudo systemctl restart kubeedge-edgecore
Kết quả mong đợi: Service Edge Core chạy lại thành công.
sudo journalctl -u kubeedge-edgecore -f | grep -i "reconnect"
Kết quả mong đợi: Xuất hiện log xác nhận cấu hình đồng bộ đã được tải và sẵn sàng chờ kết nối lại.
Cấu hình chính sách cập nhật ứng dụng (Rolling Update) cho Edge
Các node Edge thường có tài nguyên hạn chế. Việc thực hiện Rolling Update tiêu chuẩn của Kubernetes (tắt Pod cũ trước khi bật Pod mới) có thể gây gián đoạn dịch vụ nếu không được cấu hình cẩn thận. Chúng ta cần tùy chỉnh Deployment để phù hợp với Edge.
Tạo Deployment với chính sách cập nhật an toàn
Chúng ta sẽ tạo một Deployment mẫu với các tham số maxUnavailable và maxSurge được điều chỉnh. Mục tiêu là đảm bảo luôn có ít nhất 1 Pod đang chạy khi cập nhật.
Trên Master Node, tạo file edge-app-deployment.yaml.
apiVersion: apps/v1
kind: Deployment
metadata:
name: iot-sensor-edge
namespace: default
labels:
app: iot-sensor
spec:
replicas: 1
selector:
matchLabels:
app: iot-sensor
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
template:
metadata:
labels:
app: iot-sensor
spec:
nodeName: edge-node-1 # Gán cứng vào node Edge cụ thể
containers:
- name: sensor-app
image: my-registry/iot-sensor:v1.0
resources:
requests:
memory: "64Mi"
cpu: "100m"
limits:
memory: "128Mi"
cpu: "200m"
Kết quả mong đợi: File YAML được tạo. Tham số maxUnavailable: 0 đảm bảo không bao giờ có thời điểm nào mà ứng dụng bị dừng hoàn toàn trong quá trình cập nhật.
Triển khai Deployment lên cụm K3s
Áp dụng cấu hình vừa tạo.
kubectl apply -f edge-app-deployment.yaml
Kết quả mong đợi: Deployment được tạo thành công.
kubectl get deployment iot-sensor-edge
Kết quả mong đợi: Trạng thái 1/1 (Ready).
Sử dụng Edge App để quản lý vòng đời ứng dụng từ xa
Để quản lý ứng dụng trên Edge Node một cách độc lập với Kubernetes native (đặc biệt khi mất kết nối), KubeEdge cung cấp API EdgeApp. EdgeApp cho phép định nghĩa vòng đời, điều kiện khởi động và hành vi khi mất kết nối.
Định nghĩa EdgeApp Resource
Chúng ta sẽ tạo một Custom Resource Definition (CRD) cho EdgeApp để quản lý ứng dụng cảm biến. Tài nguyên này sẽ chứa logic về việc tự động phục hồi (auto-restart) và đồng bộ trạng thái.
Trên Master Node, tạo file edge-app-definition.yaml.
apiVersion: apps.kubeedge.io/v1beta1
kind: EdgeApp
metadata:
name: iot-sensor-edge-app
namespace: default
spec:
applicationName: iot-sensor
image: my-registry/iot-sensor:v1.0
replicas: 1
strategy:
type: Recreate
nodeSelector:
nodeType: edge
offlinePolicy:
action: KeepRunning
syncInterval: 5s
restartPolicy: Always
Kết quả mong đợi: File YAML định nghĩa EdgeApp với chính sách KeepRunning khi mất kết nối, đảm bảo ứng dụng tiếp tục chạy trên Edge Node.
Triển khai EdgeApp
Áp dụng tài nguyên EdgeApp lên cụm.
kubectl apply -f edge-app-definition.yaml
Kết quả mong đợi: EdgeApp được tạo thành công.
kubectl get edgeapp iot-sensor-edge-app
Kết quả mong đợi: Trạng thái Running. KubeEdge EdgeAgent sẽ nhận yêu cầu này và khởi động container theo quy tắc EdgeApp.
Kiểm tra khả năng chịu lỗi của hệ thống khi Node Edge bị ngắt điện
Bây giờ chúng ta sẽ mô phỏng sự cố nghiêm trọng: Ngắt kết nối mạng hoàn toàn (mất điện hoặc mất tín hiệu) để kiểm tra tính năng Edge Mesh và khả năng tự đồng bộ khi kết nối lại.
Mô phỏng mất kết nối (Network Partition)
Trên Master Node, sử dụng iptables hoặc tc để chặn toàn bộ lưu lượng đi từ Master đến Edge Node, mô phỏng việc Edge Node mất liên lạc với Cloud.
iptables -A FORWARD -d -j DROP
Thay thế bằng địa chỉ IP thực tế của Edge Node.
Kết quả mong đợi: Kết nối từ Master đến Edge bị ngắt. Kiểm tra trạng thái Pod trên Master:
kubectl get pods -o wide
Kết quả mong đợi: Pod trên Edge Node có thể hiển thị trạng thái Unknown hoặc NotReady trên Master, nhưng trên Edge Node, ứng dụng vẫn đang chạy (nhờ Edge Mesh và Offline Policy).
Kiểm tra trạng thái trên Edge Node
Trên Edge Node (nếu vẫn truy cập được trực tiếp qua dây mạng hoặc SSH local), kiểm tra container.
crictl ps -a
Kết quả mong đợi: Container ứng dụng vẫn có trạng thái Running và tiếp tục thu thập dữ liệu, mặc dù không thể gửi về Cloud.
Khôi phục kết nối và kiểm tra đồng bộ
Trên Master Node, xóa quy tắc chặn để khôi phục kết nối.
iptables -D FORWARD -d -j DROP
Kết quả mong đợi: Kết nối được thiết lập lại.
Chờ khoảng 10-30 giây để Edge Agent đồng bộ lại trạng thái với Edge Core.
kubectl get pods -o wide
Kết quả mong đợi: Pod trên Edge Node chuyển sang trạng thái Running và Ready. Trạng thái Unknown biến mất. Dữ liệu bị đệm (buffer) trong thời gian mất mạng đã được đồng bộ về Cloud (nếu ứng dụng có cơ chế local buffer).
Xác minh dữ liệu đồng bộ
Kiểm tra log của ứng dụng trên Edge Node để xem dữ liệu đã được gửi đi sau khi kết nối lại.
crictl logs --tail 20
Kết quả mong đợi: Xuất hiện log ghi nhận việc kết nối lại thành công và gửi dữ liệu tích lũy (nếu có).
Đ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 6: Triển khai ứng dụng IoT mẫu và thu thập dữ liệu cảm biến
Phần 8: Giám sát, ghi log và cảnh báo cho hệ thống Edge Computing »