Kubernetes là công cụ quản lý container phổ biến hiện nay, và một trong những khái niệm cốt lõi của nó chính là POD. Vậy, Pod trong Kubernetes là gì? Chúng ta sẽ tìm hiểu chi tiết qua bài viết này.
Xem thêm:
Containerd là gì ? So sánh Docker và Containerd
Container runtime là gì ? 2 loại phổ biến
1. POD là gì?
Pod là đơn vị nhỏ nhất và cơ bản nhất trong Kubernetes. Bạn có thể coi nó là “cái hộp” để chứa các container. Một Pod có thể chứa 1 hoặc nhiều container, nhưng thường thì mỗi Pod chỉ chứa 1 container cho đơn giản.
Tất cả container trong Pod chạy chung trên cùng một node, chia sẻ cùng IP, network, và volume.
Pod được tạo bằng cách sử dụng lệnh kubectl gọi tới API của Kubernetes hoặc được lưu lại dưới dạng file yaml và được cài đặt vào Kubernetes.

2. Các thành phần của một Pod
Thành phần chính của Pod ở root level bao gồm:
- apiVersion: Phiên bản API
- Kind: Nơi phân loại tài nguyên
- Metadata: Nơi chứa thông tin metadata của Pod (tên, nhãn,…)
- Spec: Khai báo container, volume, network…
Một số tham số trong spec của Pod:
- HostAliases: Phần khai báo cho Pod
- InitContainers: Phần khai báo thông tin của initContainer
- Container: Thông tin chi tiết về Container trong Pod
- Volumes: Phần khai báo volume của Pod
- RestartPolicy: Có 3 giá trị là Always, OnFailure, và Never
- Affinity: Phần khai báo các thuộc tính liên quan tới schedule Pod
Ví dụ:
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
3. Đặc điểm của Kubernetes Pod
Kubernetes Pod có 3 đặc điểm chính:
- Chứa một hoặc nhiều container: Một Pod có thể chứa một hoặc nhiều hơn một container đã được lên lịch và triển khai cùng trên một node.
- Dùng chung tài nguyên: Các container trong Pod hoạt động trên cùng một không gian mạng và có thể giao tiếp với như bằng localhost.
- Chia sẻ volume: Pod có thể chia sẻ volume, cho phép chia sẻ dữ liệu và duy trì tính nhất quán giữa các container trong cùng một Pod.

4. Tầm quan trọng của Pod
Pod chính là nơi chạy ứng dụng của bạn. Trong Kubernetes, khi bạn muốn deploy một service, thật ra bạn đang deploy một nhóm Pod được quản lý bởi các đối tượng cao hơn như Deployment, ReplicaSet…
Pod giúp bạn:
- Mở rộng ứng dụng dễ dàng (scale)
- Quản lý resource và phân bổ workload hiệu quả
- Đảm bảo tính linh hoạt, tự động và resilience

5. Trạng thái của một pod trong Kubernetes
Trạng thái của một pod trong Kubernetes có thể là một trong các trạng thái sau:
- Đang chờ xử lý (Pending): Tạo thành công Pod trong Cluster, nhưng một hoặc nhiều container không chạy.
- Đang chạy (Running): Pod đã được nhúng vào một node với tất cả các container của nó được tạo, chạy hoặc khởi động lại.
- Thành công (Succeeded): Các container của pod đã kết thúc thành công và pod sẽ không khởi động lại.
- Không thành công (Failed): Một container trong các pod không thể kết thúc hoặc xóa. Tất cả các pod đã kết thúc sẽ có trạng thái bằng không. Bất kỳ trạng thái khác được coi là thất bại.
- Không xác định (Unknown): Bộ điều khiển không thể xác định trạng thái của pod.
6. Pod Networking
- Mỗi Pod có một địa chỉ IP riêng.
- Các container trong cùng một Pod dùng localhost để nói chuyện với nhau.
- Để Pod này giao tiếp với Pod khác → dùng Cluster IP, hoặc thông qua Service để load balance và expose.
7. Một số lệnh thao tác với POD
– Liệt kê các Pod trong hệ thống:
controlplane ~ ✖ kubectl get pods NAME READY STATUS RESTARTS AGE nginx 1/1 Running 0 36s newpods-tmst8 1/1 Running 0 10s newpods-szxrd 1/1 Running 0 10s newpods-ljt98 1/1 Running 0 10s
– Tạo một pod với image=nginx:
controlplane ~ ✖ kubectl run nginx --image=nginx pod/nginx created controlplane ~ ➜ kubectl get pods NAME READY STATUS RESTARTS AGE nginx 1/1 Running 0 9s
– Xem thông tin của pod:
controlplane ~ ➜ kubectl describe pod newpods-tmst8
Name: newpods-tmst8
Namespace: default
Priority: 0
Service Account: default
Node: controlplane/192.168.87.206
Start Time: Sun, 02 Jun 2024 08:11:50 +0000
Labels: tier=busybox
Annotations: <none>
Status: Running
IP: 10.42.0.11
IPs:
IP: 10.42.0.11
Controlled By: ReplicaSet/newpods
Containers:
busybox:
Container ID: containerd://30a8dd3d4b2757feb474290f5bd861aa8be5c671b699090c1c1c99b260ccf933
Image: busybox
Image ID: docker.io/library/busybox@sha256:5eef5ed34e1e1ff0a4ae850395cbf665c4de6b4b83a32a0bc7bcb998e24e7bbb
Port: <none>
Host Port: <none>
Command:
sleep
1000
State: Running
Started: Sun, 02 Jun 2024 08:11:52 +0000
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-r2fcc (ro)
Conditions:
Type Status
PodReadyToStartContainers True
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
kube-api-access-r2fcc:
Type: Projected (a volume that contains injected data from multiple sources)
TokenExpirationSeconds: 3607
ConfigMapName: kube-root-ca.crt
ConfigMapOptional: <nil>
DownwardAPI: true
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 96s default-scheduler Successfully assigned default/newpods-tmst8 to controlplane
Normal Pulling 96s kubelet Pulling image "busybox"
Normal Pulled 95s kubelet Successfully pulled image "busybox" in 678ms (678ms including waiting)
Normal Created 95s kubelet Created container busybox
Normal Started 95s kubelet Started container busybox
– Xóa một pod:
controlplane ~ ➜ kubectl delete pod nginx pod "nginx" deleted
– Chỉnh sửa một pod:
kubectl edit pod redis kubectl apply -f redis-definition.yaml
Lệnh kubectl |
Chức năng chính |
|---|---|
get pods |
Liệt kê tất cả Pod trong namespace mặc định |
get pods -n <ns> |
Liệt kê Pod trong namespace cụ thể |
get pods -A |
Liệt kê Pod ở tất cả namespace |
get pod <name> |
Lấy thông tin nhanh của Pod |
describe pod <name> |
Chi tiết Pod: sự kiện, cấu hình, trạng thái |
get pods -o wide |
Thêm thông tin IP, node, container |
logs <pod> |
Xem log container đầu tiên trong Pod |
logs -f <pod> |
Xem log theo thời gian thực |
logs -c <container> <pod> |
Xem log container cụ thể trong Pod |
exec <pod> -- <cmd> |
Chạy lệnh trong container mặc định |
exec -it <pod> -- /bin/sh |
Mở terminal trong container |
port-forward <pod> 8080:80 |
Chuyển tiếp cổng từ máy tới Pod |
apply -f file.yaml |
Tạo/cập nhật Pod từ file YAML |
delete pod <name> |
Xoá một Pod cụ thể |
get pods --show-labels |
Hiển thị label của các Pod |
label pod <pod> key=val |
Thêm hoặc cập nhật label |
label pod <pod> key- |
Xoá label |
annotate pod <pod> key=val |
Thêm annotation |
get pods -l key=val |
Lọc Pod theo label |
top pods |
Xem CPU/RAM từng Pod |
debug <pod> -it --image=img |
Debug nhanh bằng container phụ |
get pods --field-selector=... |
Lọc Pod theo trạng thái |
get pods --sort-by=... |
Sắp xếp Pod theo thời gian |
get pods --watch |
Theo dõi thay đổi Pod theo thời gian thực |
cp <pod>:<path> <local> |
Copy file từ Pod về máy |
attach <pod> |
Gắn vào container đang chạy (như docker attach) |
Hy vọng rằng bài viết này đã giúp bạn nắm vững những kiến thức cơ bản của POD trong Kubernetes. Cảm ơn bạn đã tham khảo kubernetes cơ bản trên ttnguyen.net.
Bài viết liên quan: