POD trong kubernetes là gì? Thành phần, đặc điểm

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.

Pod trong kubernetes là gì

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.

Đặc điểm của Pod K8s

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

Tầm quan trọng của Pod

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:

Replication Controller là gì

Kubenetes Deployments là gì ?

Nguyễn Tiến Trường

Mình viết về những điều nhỏ nhặt trong cuộc sống, Viết về câu chuyện những ngày không có em