Trong bài viết này ta sẽ tìm hiểu về vòng đời của một Kubernetes pod nhé.
Nếu chưa biết Pod là gì hãy xem lại blog này để nắm được khái niệm cơ bản và thực hành hands-on tạo và quản lý các pod nhé.
Để hiểu về vòng đời của một pod, ta sẽ xem qua:
Các giai đoạn của pod (pod phases)
Điều kiện của pod (pod conditions)
Trạng thái container (container status)
Để hiểu rõ hơn ta lấy 1 ví dụ như sau:
An init container to fetch an API secret in the runtime. Có một init container để fetch API secret trong runtime.
container-01 (java-api) chạy ứng dụng java
container-02 (log-reader) fetch logs của ứng dụng và gửi chúng về một log forwarder.
Ta sẽ tìm hiểu vòng đời của pod thông qua việc triển khai pod với yêu cầu như ví dụ trên.
Các giai đoạn của pod (Pod Phases)
Một pod khi được triển khai sẽ bao gồm các giai đoạn:
Giai đoạn | Mô tả |
Pending | Pod đã được tạo nhưng chưa thể chạy được. |
Running | Có ít nhất một container đang chạy hoặc đang trong quá trình khởi động hoặc khởi động lại. |
Succeeded | Mọi container đã được hoàn tất. |
Failed | Ít nhất một container đã fail. |
Unknown | API server không thể lấy trạng thái của pod. |
Trong ví dụ tại phần trước ta sẽ gọi pod của ta là java-api-pod nhé.
Các giai đoạn khi triển khai pod đó sẽ như sau:
1. Pending Phase
When you deploy the api-pod, it will be in the pending phase. Before the Pod moves to the “Running” phase, the init container will run to completion before any other containers start.
Khi bắt đầu triển khai, pod sẽ ở giai đoạn pending. Trước khi pod chuyển sang Running, init container sẽ hoàn tất công việc của mình trước khi bất kì container chính nào khởi động.
Dưới đây là các trường hợp lỗi phổ biến khi Pod bị đứng tại giai đoạn Pending:
Thiếu CPU và RAM cho pod.
Volume của pod chưa được khai báo hoặc không khả dụng.
Kubernetes không thể pull các container image.
Init container không thể khởi động hoặc hoàn thành.
Nếu init container fail và restartPolicy được đặt là Never thì pod sẽ chuyển trực tiếp sang giai đoạn Failed.
2. Running Phase
Sau khi init container hoàn thành công việc - như trong ví dụ của ta là hoàn tất fetch secret, pod sẽ chuyển sang trạng thái Running. Cả container-01 và container-02 đều sẽ được khởi động. Pod sẽ đứng ở giai đoạn này cho tới khi ứng dụng của ta fail thì nó sẽ tự động chuyển sang giai đoạn Failed.
3. Succeeded Phase:
Giai đoạn này không khả dụng cho ứng dụng java của ta vì Succeeded được dùng cho các container đã hoàn thành công việc của chúng và đã exit.
Ứng dụng của ta sẽ chạy không ngừng cho tới khi ta trực tiếp ngưng nó lại nên ứng dụng này sẽ không thể tới giai đoạn này trừ khi ta muốn dừng nó lại.
Succeeded áp dụng cho các pod Kubernetes Job/Cronjob Object.
4. Failed Phase
Nếu init container, java container hoặc log container fail hoặc exit vì lý do nào đó thì pod sẽ chuyển sang giai đoạn Failed.
Các trường hợp pod chuyển sang Failed có thể là:
Init container hoặc container chính exit và restartPolicy là Never.
Nếu một node fail và pod bị xóa từ node đó nhưng không thể chuyển sang node nào khác thì nó sẽ dừng ở trạng thái Failed.
Nếu một pod có bật activeDeadlineSeconds (thường là dùng cho Job và Cronjob) và vượt quá thời gian giới hạn thì pod sẽ bị terminate và đánh dấu là Failed.
Bạn xóa pod bằng cách thủ công và nó không thể terminate thì sẽ chuyển sang Failed.
5. Unknown Phase
Nếu vì lý do nào đó api-server không thể lấy trạng thái Pod nó sẽ được đánh dấu là "Unknown".
Pod Conditions
Các giai đoạn của pod cho ta cập nhật tổng quan về trạng thái hiện tại của pod còn các điều kiện của pod (Pod conditions) cho ta thông tin chi tiết về quá trình lập lịch, readiness và quá trình khởi tạo.
Nếu bạn describe
một pod, bạn có thể thấy phần condition như dưới đây. Các condition là một phần của object PodStatus.