Xử lý sự cố kết nối KubeEdge với Master
Khi KubeEdge EdgeCore không thể kết nối với CloudCore, nguyên nhân phổ biến nhất là lỗi cấu hình định tuyến, chứng chỉ hết hạn hoặc phiên bản không tương thích. Bước đầu tiên là kiểm tra trạng thái pod của EdgeCore trên Cloud.
Chạy lệnh dưới đây để xem trạng thái của các thành phần KubeEdge trên Master.
kubectl get pods -n kubeedge
Kết quả mong đợi: Tất cả pod (cloudcore, edgecore) ở trạng thái Running. Nếu thấy trạng thái CrashLoopBackOff hoặc Pending, cần xem log ngay.
Kiểm tra log lỗi kết nối
Nếu pod CloudCore hoặc EdgeCore bị lỗi, log sẽ chỉ ra nguyên nhân cụ thể như "connection refused", "certificate expired", hoặc "unreachable host".
kubectl logs -n kubeedge --tail=50
Thay bằng tên pod thực tế (ví dụ: cloudcore-6d8f9c7b5-x2y3z). Kết quả mong đợi: Bạn thấy dòng log báo lỗi cụ thể, ví dụ: "failed to connect to edge node: dial tcp: i/o timeout".
Đảm bảo cổng và định tuyến mạng
CloudCore lắng nghe trên cổng 10000 (TCP) cho EdgeCore và 10001 (TCP) cho Kubelet. Nếu firewall chặn các cổng này, kết nối sẽ thất bại.
Kiểm tra xem cổng 10000 và 10001 đã mở chưa trên Master.
sudo netstat -tlnp | grep 10000
Kết quả mong đợi: Xuất hiện dòng LISTEN trên địa chỉ IP của Master và cổng 10000. Nếu không có, cần khởi động lại service hoặc kiểm tra config.
Trên Edge Node, kiểm tra khả năng đạt đến Master qua cổng 10000.
telnet 10000
Kết quả mong đợi: Kết nối thành công (Connected). Nếu bị timeout, cần cấu hình firewall (ufw/iptables) hoặc WireGuard tunnel để cho phép lưu lượng đi qua.
Cấu hình lại file config EdgeCore
Nếu mạng đã thông nhưng vẫn không kết nối được, hãy kiểm tra file cấu hình EdgeCore trên Edge Node. File này xác định địa chỉ CloudCore và chế độ kết nối.
Sửa file cấu hình tại đường dẫn đầy đủ dưới đây.
sudo vi /etc/kubeedge/edgecore.yaml
Đảm bảo phần [module] -> [cloud] -> [host] trỏ đúng IP của Master (hoặc IP WireGuard nếu dùng tunnel).
Nội dung cấu hình mẫu cần có:
modules:
cloud:
host: 192.168.1.100
port: 10000
tls: true
edge:
host: 0.0.0.0
port: 10001
Sau khi sửa, khởi động lại service EdgeCore để áp dụng thay đổi.
sudo systemctl restart kubeedge-edgecore
Kết quả mong đợi: Service chạy lại không báo lỗi, và trong log xuất hiện dòng "connected to cloud".
Giải quyết vấn đề định tuyến và Firewall
Trong môi trường Edge, các thiết bị IoT thường nằm sau NAT hoặc trong mạng riêng ảo WireGuard. Vấn đề định tuyến xảy ra khi gói tin từ IoT không quay lại đúng interface.
Chẩn đoán định tuyến WireGuard
Khi sử dụng WireGuard, lưu lượng từ Edge Node đi qua tunnel, nhưng nếu không cấu hình đúng, gói tin trả về có thể bị mất.
Kiểm tra bảng định tuyến để xác nhận lưu lượng đến IP của Master đi qua interface wg0.
ip route show | grep 192.168.1.100
Kết quả mong đợi: Dòng định tuyến chỉ rõ giao diện wg0 (ví dụ: 192.168.1.100 via 10.10.10.2 dev wg0). Nếu thấy đi qua eth0 hoặc wlan0, cần sửa file config WireGuard.
Cấu hình AllowedIPs trong WireGuard
Để đảm bảo toàn bộ lưu lượng từ Edge đi qua tunnel, cần cấu hình AllowedIPs trên Client (Edge) bao gồm subnet của Cloud.
Sửa file cấu hình WireGuard trên Edge Node.
sudo vi /etc/wireguard/wg0.conf
Thêm dòng AllowedIPs để định tuyến toàn bộ lưu lượng (hoặc subnet cụ thể của K3s) qua tunnel.
[Interface]
Address = 10.10.10.2
PrivateKey =
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer]
PublicKey =
AllowedIPs = 192.168.1.0/24
AllowedIPs = 0.0.0.0/0
Lưu ý: Dòng AllowedIPs = 0.0.0.0/0 sẽ gửi toàn bộ lưu lượng qua tunnel, rất hữu ích cho môi trường không có Internet trực tiếp.
Khởi động lại WireGuard để áp dụng.
sudo systemctl restart wg-quick@wg0
Kết quả mong đợi: Kiểm tra lại bằng lệnh ping đến IP Master thấy gói tin đi qua interface wg0.
Tắt hoặc cấu hình Firewall cho lưu lượng Kubernetes
Firewall mặc định của Linux (ufw) hoặc SELinux có thể chặn lưu lượng giữa các pod và node.
Trên Edge Node, cho phép lưu lượng từ subnet Cloud đi vào.
sudo ufw allow from 192.168.1.0/24 to any
Trên Master, cho phép lưu lượng từ subnet Edge đi vào.
sudo ufw allow from 10.10.10.0/24 to any
Kết quả mong đợi: Kết nối giữa CloudCore và EdgeCore ổn định, không bị drop packet.
Tối ưu hóa hiệu suất cho thiết bị IoT công suất thấp
Các thiết bị IoT thường có CPU yếu (ARM, Raspberry Pi) và RAM thấp (512MB-1GB). Cần giảm thiểu overhead của K3s và KubeEdge.
Tắt các dịch vụ không cần thiết trên K3s
K3s mặc định cài đặt nhiều addon (traefik, ingress, metrics-server) gây tốn tài nguyên. Trên Edge, ta chỉ cần Core.
Sửa file config khởi động K3s trên Edge Node.
sudo vi /etc/systemd/system/k3s.service
Thêm các cờ disable để tắt dịch vụ không cần thiết trong dòng ExecStart.
ExecStart=/usr/local/bin/k3s \
agent \
--disable-traefik \
--disable-runtimes \
--disable-network-policy \
--flannel-backend=none \
--kubelet-arg="max-pods=50"
Lưu ý: --flannel-backend=none dùng khi đã có WireGuard hoặc mạng riêng. --max-pods giới hạn số pod để tránh OOM.
Reload và restart service K3s.
sudo systemctl daemon-reload && sudo systemctl restart k3s
Kết quả mong đợi: Sử dụng RAM giảm xuống còn 150-200MB cho K3s agent.
Giảm tần suất sync của KubeEdge
KubeEdge đồng bộ trạng thái thường xuyên gây tốn CPU. Với thiết bị ít thay đổi trạng thái, tăng khoảng thời gian sync.
Sửa file config EdgeCore.
sudo vi /etc/kubeedge/edgecore.yaml
Tinh chỉnh tham số heartbeatInterval và syncInterval.
modules:
cloud:
host: 192.168.1.100
port: 10000
tls: true
heartbeatInterval: 30
edge:
host: 0.0.0.0
port: 10001
device:
enable: true
twin:
enable: true
syncInterval: 60
Kết quả mong đợi: Tải CPU của EdgeCore giảm, pin (nếu dùng) được tiết kiệm hơn.
Giới hạn tài nguyên cho Pod
Đảm bảo mỗi pod IoT không chiếm quá nhiều RAM/CPU bằng cách đặt limit trong Deployment.
apiVersion: apps/v1
kind: Deployment
metadata:
name: sensor-app
spec:
replicas: 1
selector:
matchLabels:
app: sensor
template:
metadata:
labels:
app: sensor
spec:
containers:
- name: sensor
image: my-iot-app:latest
resources:
limits:
cpu: "100m"
memory: "128Mi"
requests:
cpu: "50m"
memory: "64Mi"
Áp dụng config này vào cluster.
kubectl apply -f deployment-sensor.yaml
Kết quả mong đợi: Pod chạy ổn định, không bị OOMKilled khi hệ thống quá tải.
Chiến lược Backup và Restore dữ liệu cấu hình
Trong môi trường Edge, thiết bị có thể bị hỏng hoặc cần thay thế. Cần có cơ chế backup toàn bộ trạng thái hệ thống.
Backup Master Node (K3s)
Dữ liệu quan trọng của K3s nằm trong thư mục /var/lib/rancher/k3s.
Tạo script backup tự động.
mkdir -p /backup/k3s
tar -czvf /backup/k3s/k3s-backup-$(date +%F).tar.gz /var/lib/rancher/k3s /etc/rancher/k3s
Kết quả mong đợi: File .tar.gz được tạo với timestamp.
Backup Edge Node (KubeEdge)
Trên Edge, cần backup cấu hình của EdgeCore và các artifact quan trọng.
mkdir -p /backup/kubeedge
tar -czvf /backup/kubeedge/kubeedge-backup-$(date +%F).tar.gz /etc/kubeedge /var/lib/kubeedge
Kết quả mong đợi: File backup cấu hình EdgeNode được lưu trữ.
Restore hệ thống sau sự cố
Khi cần khôi phục, thực hiện theo thứ tự: Restore file hệ thống -> Restart service.
Trên Master, restore dữ liệu K3s.
sudo systemctl stop k3s
sudo tar -xzf /backup/k3s/k3s-backup-2023-10-01.tar.gz -C /
sudo systemctl start k3s
Trên Edge, restore dữ liệu KubeEdge.
sudo systemctl stop kubeedge-edgecore
sudo tar -xzf /backup/kubeedge/kubeedge-backup-2023-10-01.tar.gz -C /
sudo systemctl start kubeedge-edgecore
Kết quả mong đợi: Hệ thống khởi động lại với cấu hình cũ, các pod quay về trạng thái trước đó.
Backup dữ liệu ứng dụng (Etcd/Snapshot)
Để backup dữ liệu trong database (nếu dùng etcd) hoặc volume của ứng dụng.
kubectl exec -it -- etcdctl snapshot save /tmp/etcd-snapshot.db
Copy file snapshot về máy quản lý.
kubectl cp :/tmp/etcd-snapshot.db ./etcd-snapshot.db
Kết quả mong đợi: File snapshot được lưu trữ an toàn ngoài cluster.
Best Practice về bảo mật và nâng cấp hệ thống
Môi trường sản xuất đòi hỏi tính bảo mật cao và khả năng nâng cấp không gián đoạn.
Bảo mật với NetworkPolicy
Mặc định K3s cho phép tất cả lưu lượng. Cần áp dụng NetworkPolicy để chỉ cho phép pod IoT giao tiếp với CloudCore.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-iot-to-cloud
spec:
podSelector:
matchLabels:
app: sensor
policyTypes:
- Egress
egress:
- to:
- podSelector:
matchLabels:
app: cloudcore
ports:
- protocol: TCP
port: 10000
Áp dụng policy này vào cluster.
kubectl apply -f network-policy.yaml
Kết quả mong đợi: Pod sensor chỉ có thể kết nối ra cổng 10000 của CloudCore, chặn mọi lưu lượng khác.
Nâng cấp K3s và KubeEdge an toàn
Không bao giờ nâng cấp cả cụm cùng lúc. Nâng cấp Master trước, đợi stable, rồi nâng cấp Edge.
Kiểm tra phiên bản hiện tại.
k3s version
Nâng cấp Master (chỉ cần update package hoặc binary, sau đó restart).
curl -sfL https://get.k3s.io | sh -s - --server
sudo systemctl restart k3s
Chờ Master ổn định (kubectl get nodes thấy tất cả Ready).
kubectl get nodes
Sau đó nâng cấp Edge Node tương tự.
curl -sfL https://get.k3s.io | sh -s - --agent
sudo systemctl restart k3s
Kết quả mong đợi: Phiên bản K3s mới được áp dụng, không có pod bị CrashLoop.
Vệ sinh và quay vòng log
Log trên thiết bị Edge có thể đầy ổ cứng. Cần cấu hình logrotate.
sudo vi /etc/logrotate.d/kubeedge
Thêm cấu hình quay vòng log cho file log của EdgeCore.
/var/log/kubeedge/edgecore.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 0640 root root
}
Kết quả mong đợi: Log cũ được nén và xóa tự động sau 7 ngày, tiết kiệm dung lượng disk.
Giám sát chứng chỉ bảo mật
Chứng chỉ TLS trong K3s/KubeEdge thường hết hạn sau 1 năm. Cần cảnh báo trước khi hết hạn.
kubectl get secret -n kube-system k3s-serving-ca -o jsonpath='{.data.ca}' | base64 --decode | openssl x509 -noout -enddate
Kết quả mong đợi: Xem ngày hết hạn (notAfter). Nếu còn dưới 30 ngày, cần thực hiện renew.
k3s-cleanup && k3s
Lưu ý: Lệnh k3s sẽ tự động tạo lại chứng chỉ mới nếu xóa thư mục cũ, nhưng cần đảm bảo backup trước khi chạ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 8: Giám sát, ghi log và cảnh báo cho hệ thống Edge Computing