Sunday, March 9, 2025

Các tùy chọn thiết lập Kubernetes High Availability

-

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 keepalivedhaproxy
    • Sử dụng kube-vip

3. Thiết Lập Load Balancer Với keepalivedhaproxy

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 + haproxykube-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ằng nginx hoặc một load balancer phần cứng).
  • Có thể chạy độc lập: keepalivedhaproxy 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 (keepalivedhaproxy), đ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ý haproxykeepalived 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 hay keepalived, 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.
  • 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 + haproxykube-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ý HAkhô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.

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ế.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories