Chuyển tới nội dung chính

Pods

1. Pod là gì?​

  • Pod là đơn vị nhỏ nhất mà bạn tạo và quản lý trong Kubernetes.
  • Một Pod là một nhóm gồm một hoặc nhiều container. Thông thường 1 Pod = 1 container.
💡 Ghi nhớ
  • Scheduler xếp Pod lên node, không xếp container.
  • IP được cấp cho Pod (10.244.x.x), không cấp cho từng container.
  • kubectl không có lệnh "tạo container". Thứ nhỏ nhất bạn tạo được là Pod.

2. Scale bằng Pod, không bằng container​

Khi người dùng tăng, ta thêm Pod mới (có thể trên node khác), không thêm container vào Pod đang có.

3. Multi-container Pod​

  • Nhiều container cùng sống trong một Pod: chia sẻ network (gọi nhau qua localhost, không được trùng port) và storage (volume dùng chung).
  • Chúng được tạo và xóa cùng lúc.
  • Thường dùng cho helper / sidecar: container phụ trợ cho app chính (đẩy log, đồng bộ file…).
apiVersion: v1
kind: Pod
metadata:
name: web-helper
spec:
volumes:
- name: shared
emptyDir: {}
containers:
- name: web
image: nginx
volumeMounts:
- name: shared
mountPath: /usr/share/nginx/html
- name: helper
image: busybox
command: ["sh", "-c", "while true; do date > /data/index.html; sleep 5; done"]
volumeMounts:
- name: shared
mountPath: /data

pause container​

Mỗi Pod có một container ẩn tên pause. Nó giữ network namespace của Pod, để các container khác trong Pod dùng chung một IP. Xem trên node:

sudo crictl pods          # liệt kê pod trên node
sudo crictl ps # liệt kê container
Khái niệmÝ nghĩa
PodObject nhỏ nhất, 1 instance của app
ContainerTiến trình app chạy từ image
Pod IPMỗi Pod 1 IP (từ 10.244.0.0/16)
localhost trong PodContainer gọi nhau không qua mạng ngoài
Shared volumeStorage dùng chung trong Pod
pause containerGiữ network namespace cho Pod
Helper / sidecarContainer phụ trợ cho app chính
ScaleThêm/bớt Pod, không thêm container

4. Lệnh cơ bản​

kubectl run nginx --image=nginx              # tạo pod nhanh
kubectl get pods -o wide # xem pod, IP, node
kubectl describe pod nginx # chi tiết + events
kubectl exec -it nginx -- /bin/bash # vào trong container
kubectl delete pod nginx

Khi chạy kubectl run chuyện gì xảy ra?​

  1. kubectl gửi yêu cầu tới apiserver → lưu Pod vào etcd.
  2. Scheduler chọn node.
  3. kubelet trên node đó gọi containerd pull image nginx từ Docker Hub và chạy container.

5. Best practices​

  • Mỗi Pod nên có 1 container chính.
  • Không tạo Pod trực tiếp trong production, kể cả khi chỉ cần 1 bản. Hãy dùng Deployment, Job, hoặc StatefulSet (ứng dụng có trạng thái) – để Pod chết thì có Pod mới thay.