Cập nhật Load Balancer nhanh hơn cho Service nhiều port
Mỗi port của Service type: LoadBalancer tương ứng với một pool trên Load Balancer. Khi node trong cluster thay đổi (thêm node, bớt node, autoscale, nâng cấp node pool), danh sách backend của mọi pool phải được cập nhật lại.
Mặc định, các pool được cập nhật lần lượt từng pool một. Service càng nhiều port thì thời gian cập nhật càng dài. Khi bật annotation batch-update-strategy, backend của tất cả các pool được cập nhật cùng lúc trong một lần. Load Balancer chỉ áp dụng cấu hình mới một lần, nên thời gian để backend trên Load Balancer khớp với node mới giảm đáng kể với Service nhiều port.
Khi nào nên bật?
Nên bật khi:
- Service có nhiều port (từ vài port trở lên), và
- Cluster thường xuyên thay đổi node (bật autoscaler, scale node pool, nâng cấp định kỳ).
Không cần bật khi Service chỉ có 1 port: không có khác biệt đáng kể.
Cách bật
Thêm annotation với giá trị "true" vào Service:
apiVersion: v1
kind: Service
metadata:
name: web
annotations:
loadbalancer.fptcloud.com/batch-update-strategy: "true"
spec:
type: LoadBalancer
ports:
- name: http
port: 80
targetPort: 8080
- name: https
port: 443
targetPort: 8443
Hoặc bật trên Service đang chạy:
kubectl annotate service web loadbalancer.fptcloud.com/batch-update-strategy="true" --overwrite
- Chỉ đúng chuỗi
"true"(chữ thường) mới bật tính năng. Các giá trị như"True","yes","1"được coi là tắt. - Không cần tạo lại Service hay Load Balancer. Thay đổi có hiệu lực từ lần cập nhật kế tiếp của Load Balancer.
- Bật hoặc tắt annotation không làm xóa hay tạo lại backend hiện có, không gây gián đoạn.
Cách tắt
Gỡ annotation, hoặc đặt giá trị "false":
kubectl annotate service web loadbalancer.fptcloud.com/batch-update-strategy-
Service quay về cách cập nhật từng pool như mặc định.
Kiểm tra
Xem event của Service:
kubectl describe service web
Khi mọi thứ bình thường, không có event cảnh báo liên quan. Các event có thể gặp:
| Event (Warning) | Ý nghĩa | Bạn cần làm gì |
|---|---|---|
LoadBalancerBatchUpdateSkipped | Annotation bị bỏ qua, Service vẫn được cập nhật theo cách mặc định. Thường do Load Balancer đang được dùng chung bởi nhiều Service | Không bắt buộc. Tính năng chỉ áp dụng cho Load Balancer dùng riêng cho một Service |
LoadBalancerBatchUpdateFallback | Khu vực (region) hoặc Load Balancer hiện chưa hỗ trợ cập nhật cùng lúc. Hệ thống tự chuyển sang cách cập nhật từng pool ngay trong lần đó và thử lại sau | Không cần làm gì. Backend vẫn được cập nhật bình thường |
LoadBalancerBatchUpdateEmptyMembers | Không xác định được địa chỉ IP của node để làm backend. Hệ thống giữ nguyên backend hiện tại để tránh mất kết nối và tự thử lại | Kiểm tra trạng thái node (kubectl get nodes -o wide). Nếu kéo dài, liên hệ hỗ trợ |
LoadBalancerBatchUpdateFailed | Load Balancer gặp lỗi khi áp dụng cấu hình mới. Hệ thống tự thử lại | Nếu event lặp lại liên tục, liên hệ hỗ trợ FPT Cloud kèm tên Service và namespace |
Lưu ý
- Tính năng chỉ ảnh hưởng tới cách cập nhật backend của Load Balancer đã tồn tại. Cấu hình listener, health check, IP của Load Balancer không thay đổi.
- Kết quả cuối cùng giống hệt cách cập nhật mặc định: cùng danh sách backend, cùng thuộc tính.
- Service không gắn annotation hoạt động như trước, không bị ảnh hưởng.
- Load Balancer dùng chung cho nhiều Service (annotation
loadbalancer.fptcloud.com/load-balancer-id) không áp dụng tính năng này. - Tạo mới Service vốn đã tạo đầy đủ backend trong một lần, nên annotation chỉ có tác dụng từ các lần cập nhật sau.
Câu hỏi thường gặp
Bật annotation có làm gián đoạn ứng dụng không? Không. Backend đang chạy được giữ nguyên, chỉ những node thay đổi mới được thêm hoặc gỡ.
Gõ sai giá trị annotation thì sao?
Mọi giá trị khác "true" được coi là tắt. Service tiếp tục cập nhật theo cách mặc định, không có rủi ro mất backend.
Region của tôi chưa hỗ trợ thì sao? Hệ thống tự chuyển về cách mặc định, backend vẫn được cập nhật. Bạn có thể giữ annotation, khi region được hỗ trợ tính năng sẽ tự có hiệu lực.
Cần quyền gì để bật?
Quyền update hoặc patch Service trong namespace, như khi sửa Service thông thường.