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à thành phần cơ bản nhất để deploy và chạy một ứng dụng, được tạo và quản lý bởi kubernetes. Pod được dùng để nhóm và chạy một hoặc nhiều container lại với nhau trên cùng một worker node, những container trong một pod sẽ chia sẻ chung tài nguyên với nhau và không gian địa chỉ IP.

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 POD

Thành phần chính của Pod ở root level bao gồm:

  • 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: Nơi chứa thông tin khai báo của Pod và container của Pod

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ẻ lưu trữ và khối lượng: Pod có thể chia sẻ khối lượng lưu trữ, 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 là nơi chứa các container, đồng thời quản lý và phân phối chúng trên nhiều node trong một Cluster.

Pods đóng vai trò quan trọng trong việc mở rộng quy mô, sao chép và phân bổ tài nguyên trong Kubernetes. Chúng cho phép chúng ta mở rộng quy mô theo chiều ngang bằng cách tạo nhiều bản sao của nhóm, giúp xử lý công việc tăng lên một cách hiệu quả.

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

Trong Kubernetes, mỗi pod có một địa chỉ IP riêng sử dụng để giao tiếp. Các container trong pod có thể giao tiếp với nhau thông qua localhost vì chúng chia sẻ cùng một không gian mạng, địa chỉ IP và cổng mạng. Tuy nhiên, chúng cũng có thể sử dụng bộ nhớ chung và các semaphores SystemV để tương tác giữa các tiến trình.

Ngoài ra, các container cũng có thể giao tiếp với các container khác đang hoạt động trong các pod Kubernetes khác nhau. Vì mỗi pod có một địa chỉ IP riêng biệt và ngăn chặn giao tiếp cấp hệ điều hành nên nếu muốn giao tiếp chúng phải sử dụng mạng IP.

POD network là mạng nội bộ ảo trải dài qua tất cả các node trong cluster mà tất cả các pod kết nối với nhau thông qua mạng này

7. Các 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

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