Kubernetes Pod Không Phải Là Container — Bóc Tách Pause Container
Hầu hết mọi người khi mới học Kubernetes đều nghĩ: "Pod chẳng qua chỉ là một cái tên gọi khác của Docker container". Đây là một quan niệm sai lầm căn bản khiến bạn không thể hiểu được các mô hình nâng cao như Sidecar Pattern, Service Mesh (Istio), hay cơ chế chia sẻ bộ nhớ IPC.
1. Pod thực chất là gì?
Trong tài liệu chính thức của Kubernetes:
Pod là đơn vị triển khai nhỏ nhất có thể quản lý được, đại diện cho một nhóm gồm một hoặc nhiều container cùng chia sẻ tài nguyên mạng (Network), lưu trữ (Storage) và đặc tả vận hành.
2. Bí mật của Pause Container (Infra Container)
Khi bạn ra lệnh triển khai một Pod, Kubernetes không tạo container của bạn ngay lập tức. Thay vào đó, nó khởi chạy một container tí hon có tên là pause (dung lượng chỉ vài trăm KB).
Vai trò của Pause container:
- Giữ Network Namespace:
- Pause container tạo ra một Network Namespace riêng và giữ chặt lấy nó.
- Toàn bộ các container khác trong Pod (app chính, sidecar logging, envoy proxy) được cấu hình để chui chung vào Network Namespace của Pause container (--net=container:pause).
- Kết quả: Tất cả container trong cùng 1 Pod đều dùng chung một địa chỉ IP duy nhất và có thể giao tiếp với nhau siêu tốc qualocalhost! - Đóng vai trò tiến trình PID 1 (Init Process):
- Thu gom các tiến trình con bị mồ côi (Zombie processes) để tránh làm cạn kiệt bảng quản lý tiến trình của Linux kernel.
┌────────────────────────────────────────────────────────┐
│ KUBERNETES POD │
│ │
│ IP: 10.244.1.45 Shared Volumes: /data │
│ │
│ ┌──────────────────┐ │
│ │ PAUSE CONTAINER │ (Giữ Network Namespace & IP) │
│ └────────┬─────────┘ │
│ │ │
│ Joined to NetNS │
│ │ │
│ ┌────────▼─────────┐ ┌──────────────────────┐ │
│ │ App Container │ ──localhost:9090──▶│ Sidecar (Envoy) │ │
│ │ (Node.js/Go/Java)│ │ (Proxy / Logging) │ │
│ └──────────────────┘ └──────────────────────┘ │
└────────────────────────────────────────────────────────┘
3. Ứng dụng thực chiến của kiến trúc Multi-container Pod
- Sidecar Pattern: Tách riêng tác vụ phụ trợ (thu thập log đẩy lên ElasticSearch, giám sát metric Prometheus, đồng bộ SSL cert) ra khỏi container chứa logic nghiệp vụ chính.
- Init Containers: Chạy trước để thực hiện kiểm tra dependency (chờ Database sẵn sàng, chạy migrate database schema) rồi mới nhường quyền cho App chính khởi động.
