Nguyên nhân gần như luôn là race giữa việc gỡ Pod khỏi Endpoints và việc container nhận SIGTERM — hai việc này chạy song song, không tuần tự.
Khi Pod bị xóa, cùng lúc:
- endpoints controller cập nhật EndpointSlice, rồi kube-proxy trên từng node viết lại iptables/IPVS
- kubelet gửi
SIGTERMcho container. Nhánh - mất vài trăm ms tới vài giây để lan hết cluster. Nếu app tắt ngay khi nhận SIGTERM, các request đang được route tới nó theo bảng cũ sẽ rơi vào cổng đã đóng → 502
Cách khắc phục, kết hợp cả ba:
yaml
lifecycle:
preStop:
exec: { command: ["sleep", "10"] } # cho endpoint kip lan truyen
terminationGracePeriodSeconds: 45 # phai > preStop + thoi gian drainpreStopsleep: hoãn SIGTERM đủ lâu để mọi kube-proxy ngừng gửi traffic mới.- Graceful shutdown trong app: nhận SIGTERM thì ngừng nhận connection mới nhưng xử lý nốt request đang chạy rồi mới thoát. Nếu app không handle SIGTERM, sau
terminationGracePeriodSecondsnó bịSIGKILLvà cắt ngang request. maxUnavailable: 0cùngmaxSurge: 1để luôn có đủ Pod sẵn sàng trong lúc thay.
Kiểm chứng bằng cách chạy load test liên tục trong lúc kubectl rollout restart và đếm số request non-2xx.