1. Chuẩn bị và tạo cặp khóa cho Node Master và Edge Nodes
1.1. Cài đặt công cụ WireGuard trên Node Master
Trước tiên, bạn cần cài đặt gói công cụ wireguard-tools trên Node Master để sinh ra các cặp khóa (private key và public key) cần thiết cho việc thiết lập mạng.
Cài đặt gói này để có quyền truy cập vào các lệnh wg và wg genkey.
Chạy lệnh sau trên Node Master:
sudo apt update && sudo apt install -y wire-tools
Kiểm tra phiên bản để đảm bảo cài đặt thành công.
wg version
Bạn sẽ thấy thông tin phiên bản của WireGuard, ví dụ: WireGuard 1.0.20201107.
1.2. Sinh khóa cho Node Master (Gateway)
Bạn cần tạo một cặp khóa riêng cho Node Master đóng vai trò là Gateway (điểm trung chuyển) cho toàn bộ mạng WireGuard.
Tạo thư mục cấu hình riêng và sinh khóa, lưu trữ an toàn vào file master.key.
sudo mkdir -p /etc/wireguard/k3s-edge
cd /etc/wireguard/k3s-edge
wg genkey | sudo tee master.key
chmod 600 master.key
Tạo file khóa riêng tư đã được bảo vệ quyền truy cập (mode 600).
1.3. Sinh khóa cho các Node Edge
Mỗi Node Edge cần một cặp khóa độc nhất để xác thực với Node Master. Bạn sẽ sinh khóa này ngay trên Node Master và sau đó phân phối (distribute) sang Edge.
Giả sử bạn có 2 Node Edge: edge-node-01 và edge-node-02.
cd /etc/wireguard/k3s-edge
wg genkey | sudo tee edge-node-01.key
chmod 600 edge-node-01.key
wg genkey | sudo tee edge-node-02.key
chmod 600 edge-node-02.key
File edge-node-01.key và edge-node-02.key được tạo ra với quyền riêng tư.
1.4. Trích xuất Public Key
WireGuard sử dụng Public Key để định danh. Bạn cần trích xuất Public Key từ các Private Key đã tạo để đưa vào file cấu hình.
Chạy lệnh sau để lấy Public Key của Master và cả 2 Edge Nodes:
cat master.key | wg pubkey | sudo tee master.pub
cat edge-node-01.key | wg pubkey | sudo tee edge-node-01.pub
cat edge-node-02.key | wg pubkey | sudo tee edge-node-02.pub
Bạn sẽ có 3 file .pub chứa các chuỗi Public Key tương ứng.
2. Cấu hình file cấu hình WireGuard trên Node Master
2.1. Tạo file cấu hình chính /etc/wireguard/wg0.conf
File này định nghĩa giao diện mạng wg0 trên Node Master, bao gồm địa chỉ IP của Gateway và danh sách các Peer (Edge Nodes) được phép kết nối.
Viết nội dung hoàn chỉnh vào file /etc/wireguard/wg0.conf. Thay thế <YOUR_MASTER_PUBLIC_KEY> bằng nội dung file master.pub và <EDGE_X_PUBLIC_KEY> bằng nội dung file pub tương ứng.
sudo tee /etc/wireguard/wg0.conf
File cấu hình được lưu vào /etc/wireguard/wg0.conf với cấu trúc Interface và Peer hoàn chỉnh.
2.2. Kích hoạt giao diện và định tuyến IP
Bây giờ bạn cần khởi động giao diện mạng wg0 và đảm bảo hệ điều hành Linux biết cách định tuyến lưu lượng qua giao diện này.
Chạy lệnh để kích hoạt giao diện và bật chuyển tiếp IP (IP Forwarding).
sudo wg-quick up wg0
sudo sysctl -w net.ipv4.ip_forward=1
Kiểm tra trạng thái kết nối:
wg show
Bạn sẽ thấy thông tin về giao diện wg0 đang hoạt động, địa chỉ IP 10.200.0.1 và các Peer đang ở trạng thái Handshakes hoặc Last handshake nếu Edge đã kết nối.
3. Triển khai WireGuard DaemonSet trên K3s
3.1. Tạo Secret chứa Private Key của Master
Để triển khai WireGuard dưới dạng Pod trong Kubernetes, bạn không nên hardcode Private Key vào file YAML. Hãy tạo một Kubernetes Secret để chứa khóa này.
Tạo Secret wireguard-master-key từ file master.key.
kubectl create secret generic wireguard-master-key --from-file=private-key=/etc/wireguard/k3s-edge/master.key --namespace=kube-system
Secret được tạo thành công trong namespace kube-system.
3.2. Tạo ConfigMap chứa file cấu hình wg0.conf
Tương tự, file cấu hình wg0.conf cần được đưa vào Kubernetes dưới dạng ConfigMap để Mount vào Pod.
Tạo ConfigMap wireguard-config từ file cấu hình đã viết ở bước 2.1.
kubectl create configmap wireguard-config --from-file=wg0.conf=/etc/wireguard/wg0.conf --namespace=kube-system
ConfigMap được tạo thành công.
3.3. Viết và áp dụng DaemonSet cho WireGuard
Bạn cần một DaemonSet để đảm bảo mỗi Node trong cụm (hoặc chỉ Node Master tùy chỉnh) chạy một Pod chứa container WireGuard, mount các secret và config, và khởi động giao diện mạng.
Tạo file wireguard-daemonset.yaml với nội dung hoàn chỉnh sau. Lưu ý phần volumeMounts và volumes để map Secret và ConfigMap vào container.
cat
Kubernetes sẽ khởi tạo DaemonSet và chạy Pod trên Node Master. InitContainer sẽ mount key và config, sau đó kích hoạt giao diện wg0.
3.4. Verify kết quả DaemonSet
Kiểm tra trạng thái Pod để đảm bảo WireGuard đang chạy.
kubectl get pods -n kube-system -l app=wireguard-gateway
Kiểm tra trạng thái kết nối WireGuard từ bên trong Pod:
kubectl exec -n kube-system -it wireguard-gateway-<POD_NAME> -- wg show
Bạn sẽ thấy giao diện wg0 và các Peer đang hoạt động tương tự như khi chạy trên host.
4. Cấu hình Node Edge và Tích hợp với KubeEdge
4.1. Chuẩn bị cấu hình WireGuard cho Edge Node
Mỗi Node Edge cần file cấu hình riêng để kết nối về Node Master. File này chứa Private Key của Edge và Public Key của Master.
Trên Node Edge (ví dụ edge-node-01), tạo thư mục và file cấu hình wg0.conf với nội dung sau:
sudo mkdir -p /etc/wireguard/k3s-edge
sudo tee /etc/wireguard/k3s-edge/edge-node-01.key
File cấu hình Edge đã được tạo với địa chỉ IP 10.200.0.2 và trỏ về Master.
4.2. Khởi động WireGuard trên Edge Node
Khởi động giao diện mạng trên Edge Node và bật chuyển tiếp IP để Edge có thể làm gateway cho các thiết bị IoT nếu cần.
sudo wg-quick up wg0
sudo sysctl -w net.ipv4.ip_forward=1
Kiểm tra kết nối từ Edge về Master:
wg show
Bạn sẽ thấy trạng thái Last handshake với Peer (Node Master), chứng tỏ tunnel đã được thiết lập.
4.3. Tích hợp chứng chỉ WireGuard vào KubeEdge EdgeCore
KubeEdge cần biết về mạng WireGuard để định tuyến lưu lượng giữa Cloud và Edge. Thông thường, EdgeCore sẽ chạy trên giao diện mạng vật lý (eth0) hoặc bridge. Để EdgeCore giao tiếp qua WireGuard, bạn cần cấu hình network trong file edgecore.yaml.
Chỉnh sửa file cấu hình EdgeCore (thường nằm ở /etc/edgecore/edgecore.yaml hoặc được mount vào container). Thêm phần cấu hình mạng để EdgeCore sử dụng giao diện wg0 hoặc cấu hình định tuyến để traffic đi qua tunnel.
Viết nội dung vào /etc/edgecore/edgecore.yaml (phần network):
cat
Khởi động lại dịch vụ EdgeCore để áp dụng thay đổi:
sudo systemctl restart edgecore
EdgeCore sẽ khởi động lại và bắt đầu giao tiếp qua giao diện mạng được cấu hình.
5. Kiểm tra và Verify kết quả tổng thể
5.1. Kiểm tra kết nối Ping qua Tunnel
Để xác minh mạng WireGuard hoạt động, hãy ping từ Node Master đến IP của Edge Node trong mạng WireGuard.
ping 10.200.0.2
ping 10.200.0.3
Bạn sẽ thấy các gói tin ping thành công (64 bytes from 10.200.0.2: icmp_seq=1 ttl=64 time=...).
5.2. Kiểm tra kết nối từ Edge về Master
Ping từ Node Edge về IP của Node Master.
ping 10.200.0.1
Phải có phản hồi ping thành công.
5.3. Kiểm tra khả năng truy cập dịch vụ K3s từ Edge
Nếu Edge Node đã kết nối vào K3s qua KubeEdge, hãy thử truy cập một Service hoặc API Server của K3s từ Node Edge qua mạng WireGuard.
curl -k https://10.200.0.1:6443
Nếu cấu hình định tuyến đúng, bạn sẽ nhận được phản hồi JSON từ K3s API Server (có thể là lỗi 401 nếu chưa có token, nhưng quan trọng là kết nối TCP đã thành công).
5.4. Verify trạng thái KubeEdge
Kiểm tra xem Edge Node đã kết nối thành công với Cloud Controller qua mạng WireGuard chưa.
kubectl get nodes
Tất cả các Node Edge phải có trạng thái Ready.
Đ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 3: Cài đặt và cấu hình KubeEdge trên Node Master và Edge
Phần 5: Cấu hình bảo mật và định tuyến lưu lượng giữa Cloud và Edge »