Kubernetes Pod - K8s 的最小運作單位

在 Kubernetes 中,我們不會直接部署容器 (Container),而是部署 Pod。 Pod 是 K8s 中可供建立與部署的 最小運作單位

什麼是 Pod?

Pod 就像是一個「豆莢」,裡面包裹著一個或多個容器 (Container)。 同一個 Pod 內的容器會:

  1. 共享網路 (Network Namespace):它們有相同的 IP 位址,可以透過 localhost 互相溝通。
  2. 共享儲存 (Storage Volumes):可以掛載相同的 Volume 來交換資料。
雖然 Pod 可以包含多個容器,但最常見的模式是 One Container per Pod。多容器模式通常用於 Sidecar 模式(例如:Log 收集器、Proxy)。

定義第一個 Pod (YAML)

在 K8s 中,我們習慣使用 YAML 檔案來宣告資源。 建立一個名為 first-pod.yaml 的檔案:

# first-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: my-nginx-pod
  labels:
    app: nginx
spec:
  containers:
    - name: nginx-container
      image: nginx:latest
      ports:
        - containerPort: 80

YAML 結構解析

  • apiVersion: v1 (Pod 屬於核心 API)。
  • kind: Pod (資源類型)。
  • metadata: 元數據,包含 name (Pod 名稱) 和 labels (標籤,用於管理與搜尋)。
  • spec: 規格,定義 Pod 裡面要跑什麼容器 (containers 陣列)。

常用 Pod 指令

建立 Pod

kubectl apply -f first-pod.yaml

輸出:pod/my-nginx-pod created

查看 Pod 狀態

kubectl get pods

你會看到 STATUSContainerCreating 變成 Running。 加上 -o wide 可以看到 Pod 被分配到的 IP 和 Node:

kubectl get pods -o wide

查看詳細資訊 (Debug 必備)

如果 Pod 跑不起來,用這個指令看原因(例如 ImagePullBackOff, CrashLoopBackOff):

kubectl describe pod my-nginx-pod

重點看最下方的 Events 區塊。

查看容器 Log

kubectl logs my-nginx-pod

如果有多個容器,需加上 -c <container-name>

進入容器執行指令

類似 docker exec

kubectl exec -it my-nginx-pod -- /bin/bash
# 或者
kubectl exec -it my-nginx-pod -- sh

刪除 Pod

kubectl delete pod my-nginx-pod

或者透過 YAML 檔案刪除:

kubectl delete -f first-pod.yaml

存取 Pod (Port Forwarding)

Pod 雖然有 IP,但這個 IP 是叢集內部 (Cluster IP) 的,外部無法直接存取。 在開發測試階段,我們可以用 port-forward 將本機 port 對應到 Pod port:

# 將本機的 8080 對應到 Pod 的 80
kubectl port-forward my-nginx-pod 8080:80

現在打開瀏覽器訪問 http://localhost:8080,你應該會看到 Nginx 的歡迎頁面!

總結

Pod 是 K8s 的原子單位,但它有生命週期問題:Pod 死掉不會自己復活。 如果是節點故障或手動刪除,Pod 就沒了。

為了確保服務的高可用性 (High Availability),我們需要更高級的控制器來管理 Pod,那就是 ReplicaSet