1. Tổng Quan
Khi triển khai một cluster Kubernetes trong môi trường production, khả năng High Availability (HA) là một yêu cầu quan trọng. Điều này đảm bảo hệ thống có thể tiếp tục hoạt động ngay cả khi một số node control plane hoặc node worker node bị lỗi.

Với các node worker, Kubernetes đã có sẵn cơ chế đảm bảo khả năng chịu lỗi nếu có đủ số lượng node. Tuy nhiên, để đảm bảo HA cho các node control plane và dịch vụ etcd
, chúng ta cần có sự chuẩn bị kỹ lưỡng.
Bài viết này sẽ cung cấp các phương án và ví dụ thực tế giúp bạn triển khai Kubernetes HA một cách hiệu quả với kubeadm
.
2. Cân Nhắc Khi Cấu Hình Load Balancer.
Khi triển khai nhiều control plane, bạn cần một load balancer để phân phối lưu lượng truy cập đến API Server của các control plane. Việc này giúp cluster Kubernetes có thể tiếp tục hoạt động nếu một hoặc nhiều control plane gặp sự cố.
Load balancer cũng cần có khả năng HA. Thông thường, chúng ta thiết lập nhiều host chạy load balancer với địa chỉ IP ảo (virtual IP – vIP). Khi một host bị lỗi, một host khác sẽ tiếp quản vIP để tiếp tục phục vụ.
- Dưới đây là hai giải pháp phổ biến để triển khai load balancer HA:
- Kết hợp
keepalived
vàhaproxy
- Sử dụng
kube-vip
- Kết hợp
3. Thiết Lập Load Balancer Với keepalived
Và haproxy
3.1. Cấu Hình keepalived
keepalived
quản lý địa chỉ IP ảo (vIP) và đảm bảo rằng chỉ có một node giữ địa chỉ này tại một thời điểm.
Tạo file config /etc/keepalived/keepalived.conf
:
! /etc/keepalived/keepalived.conf
global_defs {
router_id LVS_DEVEL
}
vrrp_script check_apiserver {
script "/etc/keepalived/check_apiserver.sh"
interval 3
weight -2
fall 10
rise 2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 101
authentication {
auth_type PASS
auth_pass 42
}
virtual_ipaddress {
192.168.1.100
}
track_script {
check_apiserver
}
}
Tạo file /etc/keepalived/check_apiserver.sh
để kiểm tra API Server:
#!/bin/sh
errorExit() {
echo "*** $*" 1>&2
exit 1
}
curl -sfk --max-time 2 https://localhost:6443/healthz -o /dev/null || errorExit "API Server không phản hồi"
3.2. Cấu Hình haproxy
Tạo file config /etc/haproxy/haproxy.cfg
:
frontend apiserver
bind *:6443
mode tcp
option tcplog
default_backend apiserverbackend
backend apiserverbackend
balance roundrobin
option httpchk
http-check connect ssl
http-check send meth GET uri /healthz
http-check expect status 200
server master1 192.168.1.101:6443 check verify none
server master2 192.168.1.102:6443 check verify none
server master3 192.168.1.103:6443 check verify none
Khởi động dịch vụ:
systemctl enable --now keepalived
systemctl enable --now haproxy
4. Thiết Lập Load Balancer Với kube-vip
kube-vip
là một giải pháp kết hợp cả quản lý địa chỉ vIP và cân bằng tải API Server trong một dịch vụ duy nhất.
4.1. Tạo Manifest Cho kube-vip
Thiết lập biến môi trường:
export VIP=192.168.1.100
export INTERFACE=eth0
Tạo manifest:
kube-vip manifest pod \
--interface $INTERFACE \
--vip $VIP \
--controlplane \
--arp \
--leaderElection | tee /etc/kubernetes/manifests/kube-vip.yaml
Nội dung manifest /etc/kubernetes/manifests/kube-vip.yaml
:
apiVersion: v1
kind: Pod
metadata:
name: kube-vip
namespace: kube-system
spec:
containers:
- args:
- manager
env:
- name: vip_arp
value: "true"
- name: vip_address
value: 192.168.1.100
- name: cp_enable
value: "true"
image: ghcr.io/kube-vip/kube-vip:v0.4.0
securityContext:
capabilities:
add:
- NET_ADMIN
- NET_RAW
volumeMounts:
- mountPath: /etc/kubernetes/admin.conf
name: kubeconfig
hostNetwork: true
volumes:
- hostPath:
path: /etc/kubernetes/admin.conf
name: kubeconfig
5. Khởi Tạo Cluster Kubernetes.
Sau khi thiết lập load balancer, bạn có thể khởi tạo cluster Kubernetes với lệnh:
kubeadm init --control-plane-endpoint "192.168.1.100:6443"
Sau khi hoàn tất, bạn có thể thêm các control plane khác vào cluster với lệnh:
kubeadm join 192.168.1.100:6443 --token <TOKEN> --discovery-token-ca-cert-hash sha256:<HASH> --control-plane
Việc lựa chọn giữa keepalived + haproxy
và kube-vip
để triển khai High Availability (HA) cho Kubernetes phụ thuộc vào yêu cầu cụ thể của bạn. Dưới đây là những điểm mạnh và hạn chế của từng giải pháp để bạn có thể đưa ra quyết định phù hợp:
🔹 Với Keepalived + Haproxy
✅ Ưu điểm:
- Đã được kiểm chứng: Đây là giải pháp truyền thống, lâu đời, ổn định và phổ biến trong môi trường production.
- Tính linh hoạt cao: Có thể dễ dàng điều chỉnh, thay thế hoặc mở rộng (ví dụ: thay
haproxy
bằngnginx
hoặc một load balancer phần cứng). - Có thể chạy độc lập:
keepalived
vàhaproxy
có thể chạy trên các máy không thuộc cluster Kubernetes, giúp giảm tải cho control plane. - Hỗ trợ TLS passthrough:
haproxy
có thể xử lý cân bằng tải mà không cần phải chấm dứt TLS.
❌ Nhược điểm:
- Cấu hình phức tạp hơn: Cần quản lý hai thành phần (
keepalived
vàhaproxy
), điều này có thể làm tăng độ phức tạp trong việc triển khai và bảo trì. - Chỉ hoạt động trong cùng một subnet:
keepalived
sử dụng VRRP, yêu cầu các control plane phải nằm trong cùng một subnet để quản lý vIP. - Không tích hợp sẵn với Kubernetes: Phải quản lý
haproxy
vàkeepalived
ngoài Kubernetes, dẫn đến việc giám sát và bảo trì khó khăn hơn.
🔹 Kube-vip
✅ Ưu điểm:
- Tích hợp tốt với Kubernetes:
kube-vip
được thiết kế dành riêng cho Kubernetes, có thể chạy như một static pod trên control plane. - Cấu hình đơn giản hơn: Không cần phải thiết lập riêng
haproxy
haykeepalived
, chỉ cần tạo manifest Kubernetes. - Hỗ trợ nhiều phương thức HA:
- Layer 2 (ARP): Giống
keepalived
, nhưng đơn giản hơn. - Layer 3 (BGP): Hỗ trợ giao thức BGP, giúp mở rộng dễ dàng hơn khi triển khai trên nhiều mạng khác nhau.
- Layer 2 (ARP): Giống
- Tích hợp với Leader Election: Tự động chọn leader trong cluster control plane mà không cần VRRP.
- Giảm độ phức tạp: Vì chạy dưới dạng một pod Kubernetes, không cần phải quản lý dịch vụ bên ngoài.
❌ Nhược điểm:
- Phụ thuộc vào Kubernetes:
kube-vip
chạy bên trong Kubernetes, nên nếu cluster Kubernetes chưa khởi động hoàn toàn, vIP có thể không hoạt động ngay lập tức. - Cần quyền truy cập API Server: Trong giai đoạn khởi tạo (
kubeadm init
),kube-vip
cần quyền truy cập API Server, điều này có thể yêu cầu một số bước thiết lập bổ sung. - BGP có thể yêu cầu cấu hình phức tạp hơn: Nếu sử dụng BGP thay vì ARP, bạn cần có một hệ thống mạng hỗ trợ BGP (ví dụ: các switch/router phải có khả năng BGP peering).
🏆 Nên chọn giải pháp nào?
Tiêu chí | keepalived + haproxy | kube-vip |
---|---|---|
Dễ triển khai | ❌ Khó hơn (cấu hình nhiều thành phần) | ✅ Dễ hơn (chạy như pod Kubernetes) |
Khả năng mở rộng | ✅ Cao (có thể thay đổi backend) | ✅ Cao (hỗ trợ Layer 2 và BGP) |
Độc lập với Kubernetes | ✅ Không phụ thuộc | ❌ Phụ thuộc vào Kubernetes |
Yêu cầu subnet chung | ❌ Có (VRRP yêu cầu subnet chung) | ✅ Không (BGP hỗ trợ mạng khác subnet) |
Bảo trì & Giám sát | ❌ Khó hơn (cần giám sát hai dịch vụ) | ✅ Dễ hơn (chạy trong Kubernetes) |
👉 Lựa chọn khuyến nghị:
- Nếu bạn đang triển khai Kubernetes trong một môi trường truyền thống (on-premise) với hạ tầng mạng cố định và cần tách biệt load balancer khỏi Kubernetes, thì
keepalived + haproxy
là lựa chọn tốt. - Nếu bạn muốn một giải pháp tích hợp tốt với Kubernetes, dễ triển khai, tự động quản lý HA và không muốn bảo trì nhiều dịch vụ bên ngoài, thì nên chọn
kube-vip
.
- Như vậy nên lựa chọn giải pháp nào?
- Dùng
kube-vip
nếu bạn muốn đơn giản hóa triển khai, chạy trên Kubernetes và không ngại việc tích hợp API Server. - Dùng
keepalived + haproxy
nếu bạn cần kiểm soát chi tiết hơn, muốn load balancer hoạt động độc lập, hoặc môi trường của bạn không hỗ trợkube-vip
.
- Dùng
6. Kết Luận
Việc triển khai Kubernetes HA yêu cầu thiết lập load balancer cho API Server. Bạn có thể sử dụng keepalived
kết hợp haproxy
hoặc kube-vip
để đảm bảo tính High Availability. Lựa chọn phương pháp nào phụ thuộc vào môi trường triển khai và yêu cầu cụ thể của bạn.
Hy vọng bài viết này giúp bạn hiểu rõ hơn về cách thiết lập Kubernetes HA và có thể áp dụng trong thực tế.