kubectl 不是只有 get / apply / delete
學完 Pod CRUD 跟 Sidecar 後,你已經會基本的 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 改一改用
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: v1、kind: 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,幾百個常用組合。
縮寫對照表(背起來打字快)
| 完整 | 縮寫 |
|---|---|
| pods | po |
| services | svc |
| deployments | deploy |
| replicasets | rs |
| statefulsets | sts |
| daemonsets | ds |
| persistentvolumes | pv |
| persistentvolumeclaims | pvc |
| configmaps | cm |
| namespaces | ns |
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 區塊的三種寫法。