前言
如果說 Kubernetes 是雲原生時代的作業系統,那 kubectl 就是它的命令列介面。身為 K8s 維運工程師,每天都會與 kubectl 打交道。本文從維運實戰的角度出發,整理一份按照日常工作場景分類的 kubectl 指令速查表,方便你在不同情境下快速找到需要的指令。
環境準備:自動補全
在開始之前,強烈建議先啟用 kubectl 的自動補全功能,能大幅提升工作效率:
# Bash 環境(需先安裝 bash-completion)
source <(kubectl completion bash)
# Zsh 環境
source <(kubectl completion zsh)
場景一:叢集與上下文管理
# 查看目前的 kubeconfig 設定
kubectl config view
# 查看目前使用的上下文
kubectl config current-context
# 切換叢集上下文
kubectl config use-context my-cluster-name
# 設定預設的 namespace
kubectl config set-context --current --namespace=my-namespace
場景二:日常資源查看
# 列出所有 namespace 下的 Pod
kubectl get pods --all-namespaces
# 列出 Pod 並帶上更多資訊(IP、Node 等)
kubectl get pods -o wide
# 查看資源的詳細資訊
kubectl describe pods my-pod
kubectl describe nodes my-node
# 取得 Pod 的 YAML 定義
kubectl get pod my-pod -o yaml
# 按重啟次數排序 Pod
kubectl get pods --sort-by='.status.containerStatuses[0].restartCount'
# 依標籤篩選 Pod
kubectl get pods --selector=app=cassandra
# 列出所有 Service,依名稱排序
kubectl get services --sort-by=.metadata.name
場景三:應用部署與更新
# 透過 YAML 檔案建立資源
kubectl apply -f ./my-manifest.yaml
# 使用整個目錄的設定檔
kubectl apply -f ./dir
# 更新 Deployment 的容器映像
kubectl set image deployment/nginx nginx=nginx:1.9.1
# 查看滾動更新狀態
kubectl rollout status deployment/frontend
# 查看部署歷史
kubectl rollout history deployment/nginx
# 回滾到上一個版本
kubectl rollout undo deployment nginx
# 回滾到特定版本
kubectl rollout undo deployment/nginx --to-revision=3
# 輪替重啟(不變更映像但重啟所有 Pod)
kubectl rollout restart deployment/frontend
場景四:除錯與故障排除
# 查看 Pod 日誌
kubectl logs my-pod
# 即時追蹤日誌(類似 tail -f)
kubectl logs -f my-pod
# 多容器 Pod 指定容器查看日誌
kubectl logs my-pod -c my-container
# 查看上一個實例的日誌(Pod 重啟後)
kubectl logs my-pod --previous
# 進入 Pod 的互動式終端
kubectl exec -it my-pod -- /bin/sh
# 在 Pod 中執行指令
kubectl exec my-pod -- ls /
# 本機連接埠轉發
kubectl port-forward my-pod 5000:6000
# 檔案複製
kubectl cp /tmp/foo my-pod:/tmp/bar
kubectl cp my-pod:/tmp/bar /tmp/foo
場景五:擴縮容與資源管理
# 手動擴縮容
kubectl scale deployment/nginx --replicas=3
# 停止所有 Pod(縮容到 0)
kubectl scale deployment/nginx --replicas=0
# 設定自動擴縮容
kubectl autoscale deployment foo --min=2 --max=10
# 設定資源限制
kubectl set resources deployment nginx -c=nginx \
--limits=cpu=200m,memory=512Mi \
--requests=cpu=100m,memory=256Mi
# 查看 Pod 的資源使用情況
kubectl top pod -n my-namespace
# 查看 Node 的資源使用情況
kubectl top node
場景六:節點維護
# 標記節點不可排程
kubectl cordon my-node
# 排空節點上的 Pod
kubectl drain my-node --ignore-daemonsets --delete-emptydir-data
# 恢復節點排程
kubectl uncordon my-node
# 設定汙點
kubectl taint nodes foo dedicated=special-user:NoSchedule
# 查看所有節點上的汙點
kubectl get nodes -o=custom-columns=\
NodeName:.metadata.name,\
TaintKey:.spec.taints[*].key,\
TaintValue:.spec.taints[*].value,\
TaintEffect:.spec.taints[*].effect
場景七:修補與進階操作
# 策略合併修補
kubectl patch node k8s-node-1 -p '{"spec":{"unschedulable":true}}'
# JSON Patch 格式更新
kubectl patch pod valid-pod --type='json' \
-p='[{"op":"replace","path":"/spec/containers/0/image","value":"new-image"}]'
# 比較即時狀態與清單檔案的差異
kubectl diff -f ./my-manifest.yaml
# 編輯線上資源
kubectl edit svc/my-service
常用輸出格式
| 參數 | 說明 |
|---|---|
-o yaml |
YAML 格式 |
-o json |
JSON 格式 |
-o wide |
顯示額外欄位 |
-o name |
僅顯示資源名稱 |
-o jsonpath='{...}' |
自訂 JSONPath 查詢 |
小結
kubectl 指令非常多,但日常工作中真正高頻使用的其實就那幾十個。建議把自己最常用的指令設定成 shell alias,例如 alias k=kubectl、alias kgp='kubectl get pods' 等,配合自動補全功能,可以讓你的維運效率翻倍。遇到不確定的指令可以隨時用 kubectl explain 或 kubectl <command> --help 來查閱。

發佈留言