0
0
Lập trình
Flame Kris
Flame Krisbacodekiller

📦 Vòng đời Container trong Kubernetes và Docker

Đăng vào 3 tuần trước

• 6 phút đọc

Chủ đề:

KungFuTech

📦 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

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 Copy
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 Copy
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 Copy
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 Copy
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

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

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

  3. Kết hợp với các hook vòng đời của Spring Boot

    • ApplicationReadyEvent cho khởi tạo cấp ứng dụng.
    • @PreDestroy hoặc ContextClosedEvent cho dọn dẹp.
    • Các hook Kubernetes cho các vấn đề liên quan đến container.
  4. 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.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào