Kubernetes Pod - K8s 的最小運作單位
在 Kubernetes 中,我們不會直接部署容器 (Container),而是部署 Pod。 Pod 是 K8s 中可供建立與部署的 最小運作單位。
什麼是 Pod?
Pod 就像是一個「豆莢」,裡面包裹著一個或多個容器 (Container)。 同一個 Pod 內的容器會:
- 共享網路 (Network Namespace):它們有相同的 IP 位址,可以透過
localhost互相溝通。 - 共享儲存 (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
你會看到 STATUS 從 ContainerCreating 變成 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。