Chuyển đến nội dung chính

Bài 2: Pod không phải là container

Pod là cái vỏ chia sẻ mạng, ổ đĩa và vòng đời. Và Pod trần thì không ai dựng lại.

Xem bản video

Câu mở đầu của mọi hướng dẫn

"Pod là đơn vị nhỏ nhất của Kubernetes, và trong Pod có một container." Vế đầu đúng. Vế sau chỉ là trường hợp phổ biến, không phải định nghĩa.

Ba thứ dùng chung — đây mới là định nghĩa

một địa chỉcả Pod chỉ có một IP; các container gọi nhau qua localhost
một ổ đĩakhai một volume là cả hai cùng gắn được
một vòng đời, một máyluôn xếp lên cùng một node, và cùng biến mất với nhau

Hệ quả bạn sẽ gặp ngay

Hai container trong cùng Pod không thể cùng mở cổng 80. Không phải Kubernetes cấm — chúng nằm chung một không gian mạng, y như hai tiến trình trên cùng một máy.

listen tcp :80: bind: address already in use

Khi nào mới nên cho ở ghép

Khi tách ra thì cả hai đều vô nghĩa. Ba khuôn mẫu:

  • init container — chạy trước, xong hẳn rồi container chính mới khởi động
  • sidecar — chạy song song suốt đời container chính
  • ambassador — proxy cho mọi kết nối đi ra ngoài

Sidecar từng chỉ là một quy ước, và nó vỡ đúng lúc tắt: container chính xong việc mà sidecar vẫn chạy thì Pod không bao giờ kết thúc. Từ Kubernetes 1.28 mới có sidecar thật — khai trong initContainers với restartPolicy: Always; bật sẵn từ 1.29 và ổn định từ 1.33.

Khuôn mẫu ngược lại

Hai container cần mở rộng theo hai nhịp khác nhau thì đừng nhét chung. Pod là đơn vị nhân bản, nên nhân ba Pod là nhân ba mọi thứ bên trong. Không thể có ba bản web mà một bản sidecar.

Vì sao gần như không ai viết kind: Pod

Pod tạo bằng tay là Pod không có ai sở hữu. Không vòng lặp nào ghi nó vào mong muốn của mình, nên máy chết là nó chết theo và không có gì dựng lại.

Thêm một điều hay bị hiểu nhầm: Pod không bao giờ chuyển sang máy khác. Nó gắn vào một node ngay lúc được xếp, và gắn là vĩnh viễn. Cái bạn thấy khi máy chết là Pod cũ mất hẳn và một Pod hoàn toàn mới ra đời — tên khác, IP khác.

Mang gì đi

  • Pod là cái vỏ, không phải tên gọi khác của container
  • Ghép chung chỉ khi tách ra thì vô nghĩa — và không bao giờ khi hai bên khác nhịp mở rộng
  • Luôn để Deployment, Job hoặc DaemonSet đứng tên Pod

Nguồn: Sidecar Containers