Ứng dụng Kube-VIP để Cấu hình High Availability (HA) Control Plane cho Cụm K3s Multi-VPS Không Cần External Load Balancer
Đặt vấn đề: Thách thức High Availability trong cụm Kubernetes tối giản
Trong kỷ nguyên điện toán đám mây, Kubernetes đã trở thành tiêu chuẩn vàng cho việc điều phối container. Tuy nhiên, việc vận hành một cụm Kubernetes thuần túy (K8s) thường đòi hỏi tiêu tốn nhiều tài nguyên phần cứng và công sức cấu hình. Đó là lý do K3s – phiên bản Kubernetes siêu nhẹ do Rancher phát triển – ra đời và nhanh chóng trở thành lựa chọn hàng đầu cho các môi trường Edge Computing, IoT, và đặc biệt là các doanh nghiệp nhỏ và vừa (SMEs) tối ưu hóa chi phí trên hệ thống VPS (Virtual Private Server).
Mặc dù K3s giảm thiểu tối đa tài nguyên tiêu thụ, bài toán đảm bảo High Availability (HA) cho Control Plane (Master Nodes) vẫn là một thách thức lớn. Thông thường, để cấu hình HA, kỹ sư hệ thống cần thiết lập một bộ cân bằng tải ngoại vi (External Load Balancer) như HAProxy, Nginx, hoặc Cloud Load Balancer của các nhà cung cấp để phân phối lưu lượng truy cập đến các API Server. Phương pháp truyền thống này vô tình làm phức tạp hóa kiến trúc hệ thống và tăng đáng kể chi phí duy trì phần cứng hoặc dịch vụ đám mây.
Giải pháp đột phá ở đây chính là Kube-VIP. Công cụ này cho phép chúng ta xây dựng một hạ tầng HA Control Plane hoàn chỉnh cho K3s mà không cần đến bất kỳ giải pháp Load Balancer bên ngoài nào, tận dụng tối đa tài nguyên sẵn có của các Node hiện tại.
Kube-VIP là gì? Cơ chế hoạt động trong cụm K3s Multi-VPS
Kube-VIP là một giải pháp mã nguồn mở được thiết kế để cung cấp tính năng High Availability và Load Balancing cho Kubernetes Cluster, hoạt động trực tiếp bên trong cụm (In-Cluster). Kube-VIP có thể đảm nhận hai vai trò chính: cung cấp Virtual IP (VIP) cho Control Plane và đóng vai trò làm dịch vụ Service LoadBalancer cho các ứng dụng.
Khi cấu hình HA cho Control Plane trên hạ tầng Multi-VPS (nơi không hỗ trợ giao thức Layer 2 như ARP/gratuitous ARP mặc định), Kube-VIP hoạt động dựa trên hai cơ chế chính:
- Virtual IP (VIP) thông qua Giao thức BGP (Layer 3): Kube-VIP sẽ thiết lập kết nối BGP với các thiết bị định tuyến của nhà cung cấp VPS để quảng bá IP ảo. Khi một Node gặp sự cố, tuyến đường BGP sẽ tự động cập nhật để chuyển hướng traffic sang Node còn sống.
- Raft Consensus / Kube-Vip Leader Election: Trong môi trường không có cấu hình BGP từ nhà cung cấp Cloud (ví dụ các VPS thông thường chỉ có IP công cộng độc lập), Kube-VIP sử dụng cơ chế bầu chọn Leader nội bộ thông qua chính Kubernetes API Server. Node được chọn làm Leader sẽ liên kết IP ảo vào giao diện mạng của nó. Nếu Node Leader bị sập, một Node khác sẽ ngay lập tức tiếp quản IP ảo này.
Kiến trúc hệ thống K3s HA với Kube-VIP
Để triển khai giải pháp này, chúng ta cần chuẩn bị một mô hình tối thiểu bao gồm:
- 03 Node VPS (Ubuntu/Debian): Đóng vai trò vừa là Control Plane (Server Nodes) vừa là Worker Nodes (hoặc tách biệt tùy nhu cầu). Ba Node là số lượng tối thiểu để đạt được sự đồng thuận (quorum) cho cơ sở dữ liệu nhúng etcd của K3s.
- 01 Thẻ IP bổ sung (Floating IP / Failover IP): Đây sẽ là địa chỉ IP ảo (VIP) dùng để truy cập vào cụm K3s API Server một cách xuyên suốt.
Hướng dẫn triển khai chi tiết từng bước
Bước 1: Chuẩn bị môi trường và cấu hình các biến hệ thống
Trước tiên, hãy đảm bảo tất cả các VPS có thể kết nối Internet và thông suốt các cổng mạng nội bộ với nhau. Đăng nhập vào Node đầu tiên (chúng ta tạm gọi là k3s-master-1) bằng quyền root và khai báo các thông tin môi trường cấu hình:
export VIP=203.0.113.100
export INTERFACE=eth0
export KVVERSION=v0.6.4Lưu ý: Thay thế 203.0.113.100 bằng địa chỉ IP ảo của bạn và eth0 bằng tên giao diện mạng chính xác trên VPS.
Bước 2: Khởi tạo cấu hình Kube-VIP Manifest
Vì Kube-VIP cần phải chạy ngay khi K3s khởi động để cung cấp IP ảo cho chính API Server, chúng ta sẽ triển khai Kube-VIP dưới dạng Static Pod. Hãy tạo thư mục chứa manifest cho K3s:
mkdir -p /var/lib/rancher/k3s/agent/pod-manifests/Tiếp theo, sử dụng Docker hoặc Podman để tải image Kube-VIP và sinh file cấu hình manifest tự động:
kvversion=$(curl -s [https://api.github.com/repos/kube-vip/kube-vip/releases/latest](https://api.github.com/repos/kube-vip/kube-vip/releases/latest) | jq -r .name)
alias kube-vip="docker run --network host --rm ghcr.io/kube-vip/kube-vip:$kvversion"
kube-vip manifest pod \
--interface $INTERFACE \
--address $VIP \
--controlplane \
--services \
--arp \
--leaderElection | tee /var/lib/rancher/k3s/agent/pod-manifests/kube-vip.yamlĐoạn lệnh trên sẽ tạo ra một file định nghĩa Pod cho Kube-VIP với các tham số bật tính năng Leader Election và quản lý IP Control Plane.
Bước 3: Khởi tạo Node K3s Server đầu tiên với cơ sở dữ liệu nhúng (etcd)
Bây giờ, tiến hành cài đặt K3s trên k3s-master-1. Chúng ta cần truyền tham số --tls-san để chứng chỉ SSL của Kubernetes chấp nhận địa chỉ IP ảo (VIP), đồng thời chỉ định cụm sử dụng etcd thay cho SQLite mặc định:
curl -sfL [https://get.k3s.io](https://get.k3s.io) | sh -s - server \
--cluster-init \
--tls-san=$VIP \
--disable servicelbSau khi lệnh thực thi thành công, kiểm tra xem IP ảo đã được gán vào giao diện mạng của Node 1 hay chưa bằng lệnh ip addr show $INTERFACE. Bạn cũng có thể kiểm tra trạng thái của static pod Kube-VIP thông qua kubectl get pods -n kube-system.
Bước 4: Lấy Token và gia nhập các Node Control Plane tiếp theo
Để các Node thứ hai và thứ ba gia nhập vào cụm với vai trò Control Plane HA, chúng ta cần lấy chuỗi Token bảo mật từ Node đầu tiên:
cat /var/lib/rancher/k3s/server/node-tokenSao chép file cấu hình static pod kube-vip.yaml từ Node 1 sang Node 2 và Node 3 vào cùng thư mục /var/lib/rancher/k3s/agent/pod-manifests/.
Truy cập vào Node 2 (k3s-master-2) và Node 3 (k3s-master-3), thực hiện lệnh cài đặt K3s gia nhập cụm, hướng thẳng đích đến địa chỉ IP ảo (VIP):
export VIP=203.0.113.100
export TOKEN="K109876543210::server:your_token_here"
curl -sfL [https://get.k3s.io](https://get.k3s.io) | sh -s - server \
--server https://$VIP:6443 \
--token=$TOKEN \
--tls-san=$VIP \
--disable servicelbHệ thống K3s sẽ tự động cấu hình tính năng thiết lập cụm etcd phân tán qua cả 3 node, đảm bảo tính toàn vẹn dữ liệu.
Kiểm tra khả năng chịu lỗi (Failover Test)
Để chứng minh hệ thống vận hành High Availability thành công ổn định, bạn có thể thực hiện một kịch bản thử nghiệm phá hủy đơn giản:
- Từ máy tính cá nhân, cấu hình file
kubeconfigtrỏ về địa chỉ IP ảo[https://203.0.113.100:6443](https://203.0.113.100:6443)và chạy lệnh liên tục:watch -n 1 kubectl get nodes. - Thực hiện tắt nguồn đột ngột Node 1 (đang giữ vai trò Leader của IP ảo).
- Kết quả kỳ vọng: Lệnh
kubectlcó thể bị khựng lại trong khoảng từ 3 đến 5 giây. Ngay sau đó, Kube-VIP trên Node 2 hoặc Node 3 sẽ phát hiện Node 1 mất tín hiệu, tự động kích hoạt cơ chế bầu chọn và kéo IP ảo về phía mình. Cụm Kubernetes tiếp tục phản hồi bình thường mà không bị gián đoạn dịch vụ hệ thống quản trị.
Kết luận và Đánh giá tối ưu chi phí
Việc kết hợp K3s và Kube-VIP mang lại một giải pháp kiến trúc hạ tầng cực kỳ tinh gọn nhưng mạnh mẽ cho các doanh nghiệp doanh nghiệp hiện đại. Phương pháp này mang lại nhiều lợi ích thực tiễn:
- Tối ưu chi phí tối đa: Tiết kiệm ngân sách thuê các dịch vụ Cloud Load Balancer hoặc chi phí vận hành thêm các node trung gian cho HAProxy/Keepalived.
- Giảm thiểu độ phức tạp: Toàn bộ cấu hình HA nằm gọn trong Kubernetes manifest, dễ dàng quản lý bằng các công cụ GitOps như ArgoCD hoặc FluxCD.
- Tận dụng hiệu năng hiệu quả: Thích hợp hoàn hảo cho các nhà cung cấp VPS giá rẻ (như DigitalOcean, Linode, Vultr hoặc các nhà cung cấp hạ tầng tại Việt Nam) khi triển khai môi trường Production nhỏ và môi trường Staging.
Hy vọng bài viết này giúp bạn làm chủ công nghệ Kube-VIP để tự tin thiết kế những hệ thống container có tính sẵn sàng cao, hoạt động bền bỉ với chi phí tối ưu nhất.
