Cách cài đặt Keepalived bằng Docker

Giới thiệu về Keepalived

Keepalived là một dịch vụ phần mềm được thiết kế để nâng cao khả năng sẵn sàng (High Availability - HA) của hệ thống. Nó hoạt động dựa trên giao thức VRRP (Virtual Router Redundancy Protocol) để quản lý các địa chỉ IP ảo (VIP), cho phép các địa chỉ này "trôi" (failover) tự động giữa các máy chủ trong một cụm, đảm bảo dịch vụ luôn hoạt động ngay cả khi một máy chủ gặp sự cố.

Cấu trúc tệp cấu hình Keepalived

Tệp cấu hình Keepalived (thường là keepalived.conf) chứa các phần chính sau:

  • dinh_nghia_toan_cau (global_defs): Chứa các cài đặt toàn cục như email thông báo, định danh router, và các tùy chọn bảo mật.
  • vrrp_script: Định nghĩa các script để kiểm tra trạng thái của dịch vụ. Keepalived sẽ chạy các script này định kỳ để quyết định ưu tiên của máy chủ.
  • vrrp_instance: Định nghĩa một phiên bản VRRP cụ thể, bao gồm vai trò (MASTER/BACKUP), ID router ảo, ưu tiên, địa chỉ IP ảo, và các cài đặt xác thực.

Dưới đây là một ví dụ về cấu hình, với các tên biến và script được đổi mới để minh họa:

global_defs {
  # Định nghĩa toàn cục
  notification_email {
    admin@domain.com
  }
  notification_email_from alert@domain.com
  smtp_server mail.domain.com
  router_id NODE_A
}

vrrp_script kiem_tra_apache { # Script kiểm tra dịch vụ Apache
  script "/usr/local/bin/check_apache.sh" # Đường dẫn đến script kiểm tra
  interval 5 # Chạy script mỗi 5 giây
  weight -20 # Giảm ưu tiên nếu script thất bại
}

vrrp_instance CLUSTER_VIP {
  state MASTER # Vai trò của máy chủ
  interface eth0 # Card mạng sử dụng
  virtual_router_id 51 # ID router ảo, phải giống trên tất cả các node
  priority 150 # Ưu tiên, số càng cao càng được chọn làm MASTER
  advert_int 1 # Khoảng thời gian đồng bộ (giây)
  authentication {
    auth_type PASS
    auth_pass mysecret
  }
  virtual_ipaddress {
    192.168.1.100 # Địa chỉ IP ảo
  }
  track_script {
    kiem_tra_apache # Theo dõi script kiểm tra dịch vụ
  }
}

Triển khai Keepalived với Docker

Chúng ta sẽ triển khai Keepalived trên hai node: một node chính (MASTER) và một node dự phòng (BACKUP). Môi trường được giả định đã có Docker và Docker Compose.

Môi trường

Node Card mạng Vai trò IP ảo (VIP)
192.168.56.100 eth0 Node chính 192.168.56.120
192.168.56.101 eth0 Node dự phòng 192.168.56.120

Phương pháp 1: Sử dụng biến môi trường

Đây là cách triển khai nhanh bằng cách truyền các tham số cấu hình qua biến môi trường.

Node chính

# Khởi động container Keepalived trên node chính
docker run -d \
--name keepalived-chinh \
--net=host \
-e MANG_LUOI="eth0" \
-e UU_TIEN="150" \
-e NUT_DOI_NHAT="#PYTHON2BASH:['192.168.56.100', '192.168.56.101']" \
-e IP_AO="192.168.56.120" \
-e TRANG_THAI="MASTER" \
--privileged=true \
osixia/keepalived:stable --loglevel debug

Node dự phòng

# Khởi động container Keepalived trên node dự phòng
docker run -d \
--name keepalived-du_phong \
--net=host \
-e MANG_LUOI="eth0" \
-e UU_TIEN="100" \
-e NUT_DOI_NHAT="#PYTHON2BASH:['192.168.56.100', '192.168.56.101']" \
-e IP_AO="192.168.56.120" \
-e TRANG_THAI="BACKUP" \
--privileged=true \
osixia/keepalived:stable --loglevel debug

Phương pháp 2: Sử dụng tệp cấu hình tùy chỉnh

Cách này linh hoạt hơn, cho phép bạn định nghĩa cấu hình chi tiết trong một tệp.

Node chính

# 1. Tạo thư mục và tệp cấu hình
mkdir -p /data/keepalived/conf/
cat > /data/keepalived/conf/keepalived.conf <<EOF
global_defs {
  default_interface eth0
}

vrrp_instance CLUSTER_VIP {
  interface eth0
  state MASTER
  virtual_router_id 51
  priority 150
  unicast_peer {
    192.168.56.100
    192.168.56.101
  }
  virtual_ipaddress {
     192.168.56.120
  }
  authentication {
    auth_type PASS
    auth_pass d0cker
  }
}
EOF

# 2. Khởi động container với tệp cấu hình
docker run -d \
--name keepalived-chinh \
-v /data/keepalived/conf/keepalived.conf:/container/service/keepalived/assets/keepalived.conf \
--net=host \
--privileged=true \
osixia/keepalived:stable --loglevel debug --copy-service

Node dự phòng

# 1. Tạo thư mục và tệp cấu hình
mkdir -p /data/keepalived/conf/
cat > /data/keepalived/conf/keepalived.conf <<EOF
global_defs {
  default_interface eth0
}

vrrp_instance CLUSTER_VIP {
  interface eth0
  state BACKUP
  virtual_router_id 51
  priority 100
  unicast_peer {
    192.168.56.100
    192.168.56.101
  }
  virtual_ipaddress {
     192.168.56.120
  }
  authentication {
    auth_type PASS
    auth_pass d0cker
  }
}
EOF

# 2. Khởi động container với tệp cấu hình
docker run -d \
--name keepalived-du_phong \
-v /data/keepalived/conf/keepalived.conf:/container/service/keepalived/assets/keepalived.conf \
--net=host \
--privileged=true \
osixia/keepalived:stable --loglevel debug --copy-service

Kiểm tra và mô phỏng lỗi

Sau khi khởi động, trên node chính, bạn có thể sử dụng lệnh ip a để thấy IP ảo 192.168.56.120 đã được gán cho card mạng eth0.

Để kiểm tra cơ chế failover, hãy dừng container trên node chính:

docker stop keepalived-chinh

Khi đó, IP ảo sẽ tự động "trôi" sang node dự phòng. Bạn có thể kiểm tra lại bằng lệnh ip a trên node dự phòng.

Các vấn đề thường gặp

  • IP ảo không được giải phóng: Nếu cả hai node cùng giữ IP ảo sau khi dừng dịch vụ, bạn có thể xóa IP ảo thủ công bằng lệnh: ip addr del 192.168.56.120/24 dev eth0.
  • Kiểm tra sức khỏe dịch vụ: Bạn có thể sử dụng script để kiểm tra trạng thái của một dịch vụ (ví dụ: Apache) và tự động hạ cấp ưu tiên hoặc tắt Keepalived nếu dịch vụ không hoạt động.

Thẻ: docker keepalived high-availability vrrp virtual-ip

Đăng vào ngày 27 tháng 5 lúc 16:13