📦 Vòng đời Container trong Kubernetes và Docker
Hiểu rõ vòng đời của container (hoặc pod trong Kubernetes) từ khi tạo đến khi ngừng hoạt động là rất quan trọng để tích hợp các hook lifecycle của Spring Boot với các hook trong Kubernetes như postStart, preStop, và các probes để kiểm tra trạng thái sẵn sàng.
Mục lục
- 1. Các giai đoạn vòng đời Pod trong Kubernetes
- 2. Hook vòng đời Container
- 3. Probes kiểm tra trạng thái sẵn sàng và sống
- 4. Sơ đồ vòng đời Container
- 5. Thực hành tốt nhất
- 6. Những cạm bẫy thường gặp
- 7. Mẹo tối ưu hiệu suất
- 8. Giải quyết sự cố
- 9. FAQ
1️⃣ Các giai đoạn vòng đời Pod trong Kubernetes
Một pod trong Kubernetes (bao gồm một hoặc nhiều container) trải qua các giai đoạn chính sau:
| Giai đoạn | Mô tả |
|---|---|
| Pending | Đối tượng pod đã được Kubernetes chấp nhận, hình ảnh container đang được tải xuống. |
| ContainerCreating | Container đang được tạo và khởi tạo. |
| Running | Quá trình container đã bắt đầu. Pod có thể sẵn sàng hoặc không sẵn sàng cho lưu lượng truy cập. |
| Succeeded | Tất cả các container đã hoàn thành thành công (đối với jobs). |
| Failed | Các container đã bị ngừng hoạt động với lỗi. |
| Unknown | Kubernetes không thể xác định trạng thái của pod. |
2️⃣ Hook vòng đời Container
Kubernetes cho phép bạn gắn vào các sự kiện khởi động và dừng container.
a. Hook postStart
- Chạy ngay sau khi container được tạo, đồng thời với quá trình chính.
- Không chờ ứng dụng hoàn thành khởi tạo.
yaml
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "echo Container started"]
Trường hợp sử dụng:
- Tạo tệp tạm thời.
- Ghi lại các sự kiện khởi động container.
- Khởi tạo nhẹ nhàng không phụ thuộc vào ứng dụng.
b. Hook preStop
- Chạy trước khi container bị ngừng.
- Kubernetes cung cấp một khoảng thời gian ơn huệ kết thúc mặc định (thường là 30 giây) để hoàn thành các tác vụ.
yaml
lifecycle:
preStop:
exec:
command: ["/bin/sh", "-c", "echo Container stopping"]
Trường hợp sử dụng:
- Hủy đăng ký từ dịch vụ phát hiện.
- Xóa bộ nhớ cache đến lưu trữ bên ngoài.
- Thông báo cho các dịch vụ khác trước khi tắt.
3️⃣ Probes kiểm tra trạng thái sẵn sàng và sống
Đây là các kiểm tra mà Kubernetes sử dụng để quản lý lưu lượng pod và sức khỏe.
| Probe | Mục đích | Khi nào sử dụng |
|---|---|---|
| Liveness | Kiểm tra xem container có đang hoạt động hay không; khởi động lại nếu thất bại | Ngăn chặn vòng lặp lỗi |
| Readiness | Kiểm tra xem container có thể xử lý lưu lượng hay không | Kiểm soát lưu lượng cho đến khi khởi tạo hoàn tất |
Ví dụ về probe kiểm tra trạng thái sẵn sàng:
yaml
readinessProbe:
httpGet:
path: /actuator/health/readiness
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
Mẹo: Kết hợp ApplicationReadyEvent của Spring Boot với probe kiểm tra trạng thái sẵn sàng để pod chỉ nhận lưu lượng sau khi ứng dụng đã khởi tạo xong.
4️⃣ Sơ đồ vòng đời Container
plaintext
Pod scheduled
│
▼
Container image pulled
│
▼
Container created ──▶ postStart hook runs
│
▼
Application starts (e.g., Spring Boot)
│
▼
readinessProbe passes ──▶ Pod marked Ready, receives traffic
│
▼
Container running (serving requests)
│
▼
Shutdown initiated
│
▼
preStop hook runs
│
▼
Termination grace period
│
▼
Container stopped
5️⃣ Thực hành tốt nhất
-
Không đặt các tác vụ dài hạn trong hook
postStart
Điều này có thể làm chậm thời gian sẵn sàng của container và có thể bị ngắt nếu vượt quá thời gian giới hạn của hook. -
Sử dụng
preStopđể tắt dịch vụ một cách nhẹ nhàng
Đảm bảo rằng các hook tắt Spring Boot (như@PreDestroy) được kích hoạt. -
Kết hợp với các hook vòng đời của Spring Boot
ApplicationReadyEventcho khởi tạo cấp ứng dụng.@PreDestroyhoặcContextClosedEventcho dọn dẹp.- Các hook Kubernetes cho các vấn đề liên quan đến container.
-
Luôn kiểm tra các hook trong các kịch bản khởi động lại pod
Đảm bảo tính idempotency và tránh chặn khởi động pod.
6️⃣ Những cạm bẫy thường gặp
- Bỏ qua thời gian ơn huệ: Nhiều nhà phát triển không chú ý đến khoảng thời gian ơn huệ mà Kubernetes cung cấp, dẫn đến việc dịch vụ không kịp thời tắt.
- Không kiểm tra các hook: Không kiểm tra các hook trong các tình huống thực tế có thể dẫn đến các vấn đề khó khắc phục sau này.
7️⃣ Mẹo tối ưu hiệu suất
- Giảm thiểu các tác vụ trong
postStart: Giới hạn số lượng tác vụ trong hook này để không làm chậm quá trình khởi động. - Tối ưu hóa các probe: Đặt khoảng thời gian kiểm tra hợp lý để tránh việc khởi động lại không cần thiết.
8️⃣ Giải quyết sự cố
- Container không khởi động: Kiểm tra logs để xác định nguyên nhân. Sử dụng lệnh
kubectl logs <pod-name>để xem nhật ký. - Pod không sẵn sàng: Kiểm tra cấu hình readiness probe. Đảm bảo rằng endpoint được chỉ định đang hoạt động.
9️⃣ FAQ
1. Làm thế nào để kiểm tra trạng thái của một pod trong Kubernetes?
Sử dụng lệnh kubectl get pods để xem trạng thái của các pod trong namespace hiện tại.
2. Có thể sử dụng hook vòng đời trong Docker không?
Docker không hỗ trợ hook vòng đời giống như Kubernetes, nhưng bạn có thể sử dụng CMD hoặc ENTRYPOINT để thực hiện các tác vụ tương tự.
3. Tại sao cần sử dụng probes trong Kubernetes?
Probes giúp Kubernetes quyết định khi nào khởi động lại hoặc gửi lưu lượng đến container, đảm bảo rằng ứng dụng luôn sẵn sàng và khỏe mạnh.