K8s · 工作負載 · 第 11 課 · · 8min read

kubectl 進階:port-forward、dry-run、--watch 你都會用嗎?

kubectl 不是只有 get / apply / delete。port-forward 讓你連進 Pod、--dry-run=client 先看 YAML 對不對、-w 即時觀察狀態變化。會這些等於從新手變熟手。

#kubectl #進階 #port-forward #dry-run
章節目錄 · 11

kubectl 不是只有 get / apply / delete

學完 Pod CRUDSidecar 後,你已經會基本的 kubectl 操作。但 kubectl 有很多進階技巧,會這幾招你就從新手變熟手

  • -o wide / -o yaml / -o jsonpath — 看更多欄位、看完整資源、提取單一欄位
  • port-forward — 不開 Service 也能臨時連進 Pod
  • --dry-run=client — 自動產生 YAML 模板(再也不用背欄位)
  • explain — 內建文件查欄位定義
  • --watch / -w — 即時觀察狀態變化
這篇逐一示範。

-o wide:看 Pod IP 跟 Node

kubectl get pods
# 預設只看到 NAME / READY / STATUS / RESTARTS / AGE

kubectl get pods -o wide
# 多了 IP / NODE / NOMINATED NODE / READINESS GATES

實用場景:

  • 想確認 Pod 跑在哪個 Node 上(多節點叢集除錯)
  • 想知道 Pod IP 直接 curl

-o yaml:看完整的 K8s 資源定義

kubectl get pod my-nginx -o yaml

K8s 會印出完整的 Pod YAML,包括你沒寫但 K8s 自動填的欄位(status、events、defaults)。

實用場景:

  • 想確認某個欄位有沒有生效
  • 想 copy 現成的 Pod YAML 改一改用
也可以只取單一欄位(jsonpath):

kubectl get pod my-nginx -o jsonpath='{.status.podIP}'
# 印出 Pod IP

kubectl get pods -o jsonpath='{.items[*].metadata.name}'
# 印出所有 Pod 名字(空白分隔)

port-forward:臨時通道連進 Pod

Pod 跑在叢集裡面,你電腦上打 http://localhost:8080 連不到 — Service / Ingress 還沒學。先用 port-forward 開個臨時通道:

kubectl port-forward pod/my-nginx 8080:80
# 把 Pod 的 80 port 映射到你電腦的 8080
# 終端機會卡住,這是正常的(通道在運作)

# 開另一個終端機
curl http://localhost:8080
# 會看到 nginx 歡迎頁

按 Ctrl+C 停止 port-forward → 通道斷掉。

⚠️ port-forward 只是除錯工具,不是正式對外的方式。終端機關掉就斷,而且它直接連 Pod、繞過 Service。正式對外要用 Service / Ingress(Day 5、Day 6 會教)。

--dry-run=client:自動產生 YAML 模板

不用再背 apiVersion: v1kind: Pod — 用 kubectl run--dry-run=client -o yaml 自動產:

kubectl run my-nginx --image=nginx:1.27 --dry-run=client -o yaml

輸出:

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: my-nginx
  name: my-nginx
spec:
  containers:
  - image: nginx:1.27
    name: my-nginx
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

直接導出存檔:

kubectl run my-nginx --image=nginx:1.27 --dry-run=client -o yaml > pod.yaml

Deployment 也行

kubectl create deployment nginx-deploy --image=nginx:1.27 --replicas=3 \
  --dry-run=client -o yaml > deployment.yaml

Service:

kubectl expose deployment nginx-deploy --port=80 --target-port=80 \
  --dry-run=client -o yaml > service.yaml

kubectl explain:內建文件查欄位

忘記某個欄位怎麼寫?不用查文件:

kubectl explain pod.spec
# 列出 spec 底下所有欄位 + 說明

kubectl explain pod.spec.containers
# 列出 containers 列表的每個欄位

kubectl explain pod.spec.volumes
# 看支援哪些 Volume 類型(emptyDir、hostPath、configMap、secret、persistentVolumeClaim 等)

kubectl explain --recursive pod.spec.containers
# 把 containers 底下所有層級全展開

--watch / -w:即時觀察狀態變化

kubectl get pods --watch
# 終端機停在那裡,每當有 Pod 狀態變化就多印一行
# 按 Ctrl+C 停止

實用場景:

  • 觀察 Pod 從 Pending → ContainerCreating → Running 的過程
  • 觀察 CrashLoopBackOff 的退避節奏(10s → 20s → 40s)
  • 觀察 Deployment 滾動更新(新 Pod 起來 → 舊 Pod 收掉)

自動補全 + alias(讓打字快 5 倍)

bash 自動補全

# 加到 ~/.bashrc 或 ~/.zshrc
source <(kubectl completion bash)   # bash
source <(kubectl completion zsh)    # zsh

之後可以 Tab 補完 Pod 名字、context、namespace…

alias

# 加到 ~/.bashrc / ~/.zshrc
alias k=kubectl

之後 k get pods 就行。再進階一點可以裝 kubectl-aliases,幾百個常用組合。

縮寫對照表(背起來打字快)

完整縮寫
podspo
servicessvc
deploymentsdeploy
replicasetsrs
statefulsetssts
daemonsetsds
persistentvolumespv
persistentvolumeclaimspvc
configmapscm
namespacesns
組合用:
k get deploy,rs,po
# 一行看完 Deployment + ReplicaSet + Pod

重點整理

  • -o wide 看 Pod IP / Node,-o yaml 看完整定義,-o jsonpath 取單一欄位
  • port-forward 是臨時除錯通道,不是正式對外方式
  • --dry-run=client -o yaml 自動產 YAML 模板,告別背欄位
  • kubectl explain 是內建文件,比 Google 快
  • --watch 即時觀察狀態變化
  • 設好 source <(kubectl completion) + alias k=kubectl 打字快 5 倍

下一步

kubectl run 預設不能傳環境變數,但 MySQL 一定要 MYSQL_ROOT_PASSWORD。下一篇示範在 K8s 上跑 MySQL:環境變數注入,學會 env 區塊的三種寫法。