EasyDebug.NET

kubectl 常用命令速查表

上下文、Pod、部署、回滾、Service 等九類命令,含可直接套用的示例

共 90 條命令

kubectl config get-contexts上下文與清單查詢

列出所有集群上下文,切錯集群是常見事故

kubectl config get-contexts
kubectl config use-context prod上下文與清單查詢

切換當前上下文,操作前先確認這一條

kubectl config use-context prod-cn
kubectl config current-context上下文與清單查詢

查看當前在哪個集群,腳本里可做前置校驗

kubectl config current-context
kubectl config set-context --current --namespace=staging上下文與清單查詢

把默認命名空間固定下來,省去每次 -n

kubectl config set-context --current --namespace=staging
kubectl get ns上下文與清單查詢

列出命名空間

kubectl get ns
kubectl get all -n app上下文與清單查詢

一次看某命名空間下的主要資源

kubectl get all -n app
kubectl get pods -o wide上下文與清單查詢

多顯示 IP 與所在節點,排查調度與網絡必備

kubectl get pods -o wide -n app
kubectl get pods -A上下文與清單查詢

查所有命名空間的 Pod

kubectl get pods -A --field-selector=status.phase!=Running
kubectl get pods -w上下文與清單查詢

持續監聽列表變化,滾動更新時觀察用

kubectl get pods -w -n app
kubectl get pod web-0 -o yaml上下文與清單查詢

導出某個資源的完整 YAML(含運行時狀態)

kubectl get pod web-0 -o yaml > pod-backup.yaml
kubectl get deploy web -o yaml --export上下文與清單查詢

導出時去掉集群生成的字段,方便重新套用

kubectl get deploy web -o yaml -n app
kubectl explain deploy.spec.strategy上下文與清單查詢

在終端查字段含義與取值範圍,不用翻文檔

kubectl explain deploy.spec.strategy --recursive
kubectl api-resources上下文與清單查詢

列出集群支持的所有資源類型與簡寫

kubectl api-resources --namespaced=true
kubectl apply -f deploy.yaml上下文與清單查詢

聲明式應用配置,重複執行安全

kubectl apply -f k8s/ -n app
kubectl delete -f deploy.yaml上下文與清單查詢

按文件刪除資源

kubectl delete -f k8s/ -n app
kubectl create ns staging上下文與清單查詢

創建命名空間

kubectl create ns staging
kubectl describe pod <pod>Pod 操作

查看 Pod 詳情,末尾 Events 段是排障重點

kubectl describe pod web-0 -n app
kubectl logs <pod>Pod 操作

查看容器日誌

kubectl logs web-0 -n app --tail=200
kubectl logs -f <pod> -c appPod 操作

跟蹤指定容器日誌,多容器 Pod 必須帶 -c

kubectl logs -f web-0 -c app -n app
kubectl logs --previous <pod>Pod 操作

看上一次崩潰前的日誌,CrashLoopBackOff 必用

kubectl logs web-0 --previous -n app
kubectl logs --since=10m <pod>Pod 操作

只看最近一段時間的日誌

kubectl logs web-0 --since=10m --timestamps -n app
kubectl exec -it <pod> -- shPod 操作

進入容器,多數精簡鏡像沒有 bash

kubectl exec -it web-0 -n app -- /bin/sh
kubectl exec <pod> -- envPod 操作

查看容器內實際生效的環境變量

kubectl exec web-0 -n app -- printenv
kubectl cp ./local.txt <pod>:/tmp/Pod 操作

在本地與 Pod 之間複製文件

kubectl cp ./dump.sql app/web-0:/tmp/dump.sql
kubectl port-forward <pod> 8080:80Pod 操作

把 Pod 端口轉發到本地,調試未暴露的服務

kubectl port-forward pod/web-0 8080:80 -n app
kubectl run tmp --rm -it --image=busybox -- shPod 操作

臨時排錯容器,退出即清理

kubectl run tmp --rm -it --image=busybox:1.36 --restart=Never -- sh
kubectl get pod <pod> -o jsonpath="{.status.podIP}"Pod 操作

取 Pod IP,方便寫進腳本

kubectl get pod web-0 -o jsonpath="{.status.podIP}" -n app
kubectl delete pod <pod>Pod 操作

刪除 Pod,被控制器管理的會自動重建

kubectl delete pod web-0 -n app
kubectl delete pod <pod> --grace-period=0 --forcePod 操作

強制刪除卡在 Terminating 的 Pod

kubectl delete pod web-0 --grace-period=0 --force -n app
kubectl get pod <pod> -o jsonpath="{.status.containerStatuses[*].restartCount}"Pod 操作

看重啓次數,判斷是否在反覆崩潰

kubectl get pod web-0 -o jsonpath="{.status.containerStatuses[*].restartCount}" -n app
kubectl get deploy部署與擴縮容

列出 Deployment 及副本就緒情況

kubectl get deploy -n app -o wide
kubectl scale deploy/web --replicas=3部署與擴縮容

調整副本數,擴容最直接的方式

kubectl scale deploy/web --replicas=3 -n app
kubectl set image deploy/web web=app:1.1部署與擴縮容

滾動更新鏡像版本

kubectl set image deploy/web web=registry.example.com/app:1.1 -n app
kubectl edit deploy/web部署與擴縮容

直接編輯線上配置,保存即生效

kubectl edit deploy/web -n app
kubectl patch deploy/web --type=merge -p "{\"spec\":{\"replicas\":2}}"部署與擴縮容

用一行 JSON 改字段,腳本里比 edit 合適

kubectl patch deploy/web --type=merge -p "{\"spec\":{\"replicas\":2}}" -n app
kubectl autoscale deploy/web --min=2 --max=10 --cpu-percent=70部署與擴縮容

配置水平自動擴縮容

kubectl autoscale deploy/web --min=2 --max=10 --cpu-percent=70 -n app
kubectl get rs部署與擴縮容

查看 ReplicaSet,歷史版本都留在這裡

kubectl get rs -n app
kubectl get deploy web -o jsonpath="{.spec.template.spec.containers[*].image}"部署與擴縮容

確認線上實際跑的是哪個鏡像

kubectl get deploy web -o jsonpath="{.spec.template.spec.containers[*].image}" -n app
kubectl annotate deploy/web note="release-1.1"部署與擴縮容

打註釋,記錄發佈信息

kubectl annotate deploy/web note="release-1.1" --overwrite -n app
kubectl label deploy/web tier=web部署與擴縮容

打標籤,供 Service 選擇器與選擇器查詢使用

kubectl label deploy/web tier=web --overwrite -n app
kubectl rollout status deploy/web發佈與回滾

觀察滾動更新進度,發佈後必看

kubectl rollout status deploy/web -n app --timeout=120s
kubectl rollout history deploy/web發佈與回滾

查看歷史版本與變更原因

kubectl rollout history deploy/web -n app
kubectl rollout undo deploy/web發佈與回滾

回滾到上一個版本,出事後最快止血

kubectl rollout undo deploy/web -n app
kubectl rollout undo deploy/web --to-revision=2發佈與回滾

回滾到指定版本,先看 history 再定

kubectl rollout undo deploy/web --to-revision=2 -n app
kubectl rollout restart deploy/web發佈與回滾

原地重啓全部 Pod,配置變更後常用

kubectl rollout restart deploy/web -n app
kubectl rollout pause deploy/web發佈與回滾

暫停發佈,配合 set image 可在觀察後再放行

kubectl rollout pause deploy/web -n app
kubectl rollout resume deploy/web發佈與回滾

恢復被暫停的發佈

kubectl rollout resume deploy/web -n app
kubectl get svcService 與網絡

列出 Service 及其 ClusterIP 與端口

kubectl get svc -n app -o wide
kubectl get endpoints webService 與網絡

查看 Service 背後真實的 Pod IP,為空說明選擇器沒匹配上

kubectl get endpoints web -n app
kubectl describe svc webService 與網絡

查看 Service 詳情,含選擇器與端口映射

kubectl describe svc web -n app
kubectl expose deploy/web --port=80 --target-port=8080Service 與網絡

為 Deployment 快速建一個 Service

kubectl expose deploy/web --port=80 --target-port=8080 --type=ClusterIP -n app
kubectl port-forward svc/web 8080:80Service 與網絡

轉發 Service 端口,不依賴 Ingress 就能本地驗證

kubectl port-forward svc/web 8080:80 -n app
kubectl get ingressService 與網絡

列出 Ingress 與暴露的域名

kubectl get ingress -n app
kubectl describe ingress webService 與網絡

查看 Ingress 規則與後端解析結果

kubectl describe ingress web -n app
kubectl get netpolService 與網絡

列出網絡策略,Pod 之間不通先查它

kubectl get netpol -n app
kubectl get svc web -o jsonpath="{.spec.clusterIP}"Service 與網絡

取 ClusterIP,寫進配置或腳本用

kubectl get svc web -o jsonpath="{.spec.clusterIP}" -n app
kubectl get cm配置與密鑰

列出 ConfigMap

kubectl get cm -n app
kubectl create cm app-config --from-file=app.yaml配置與密鑰

從文件創建 ConfigMap

kubectl create cm app-config --from-file=config/app.yaml -n app
kubectl describe cm app-config配置與密鑰

查看 ConfigMap 內容

kubectl describe cm app-config -n app
kubectl get secret配置與密鑰

列出 Secret,值默認是 base64 不是加密

kubectl get secret -n app
kubectl create secret generic db --from-literal=password=changeit配置與密鑰

從字面量創建 Secret

kubectl create secret generic db --from-literal=password=changeit -n app
kubectl get secret db -o jsonpath="{.data.password}" | base64 -d配置與密鑰

解出 Secret 明文,排查配置不生效

kubectl get secret db -o jsonpath="{.data.password}" -n app | base64 -d
kubectl get sa配置與密鑰

列出 ServiceAccount,Pod 訪問 API 用的身份

kubectl get sa -n app
kubectl auth can-i get pods --as=system:serviceaccount:app:web配置與密鑰

驗證某個身份有沒有權限,RBAC 排查用

kubectl auth can-i get pods --as=system:serviceaccount:app:web -n app
kubectl get nodes節點與調度

列出節點與狀態

kubectl get nodes -o wide
kubectl describe node <node>節點與調度

查看節點詳情,含已分配資源與污點

kubectl describe node node-1
kubectl top nodes節點與調度

查看節點實際資源佔用,需裝 metrics-server

kubectl top nodes
kubectl top pods節點與調度

查看 Pod 資源佔用,定位誰在喫內存

kubectl top pods -n app --sort-by=memory
kubectl cordon <node>節點與調度

標記節點不可調度,但不影響已有 Pod

kubectl cordon node-1
kubectl drain <node> --ignore-daemonsets --delete-emptydir-data節點與調度

驅逐節點上的 Pod,維護前必做

kubectl drain node-1 --ignore-daemonsets --delete-emptydir-data
kubectl uncordon <node>節點與調度

恢復節點可調度

kubectl uncordon node-1
kubectl taint nodes node-1 dedicated=gpu:NoSchedule節點與調度

給節點加污點,只讓能容忍的 Pod 調度上去

kubectl taint nodes node-1 dedicated=gpu:NoSchedule
kubectl get events --sort-by=.lastTimestamp排障

按時間倒序看事件,集群層面的問題都在這

kubectl get events --sort-by=.lastTimestamp -n app | tail -30
kubectl get events -w排障

實時監聽事件流,復現問題時開着

kubectl get events -w -n app
kubectl get pod --field-selector=status.phase=Failed排障

篩出所有失敗狀態的 Pod

kubectl get pod --field-selector=status.phase=Failed -A
kubectl get pod <pod> -o jsonpath="{.status.conditions[?(@.type==\"Ready\")].reason}"排障

取未就緒原因,比翻 describe 快

kubectl get pod web-0 -o jsonpath="{.status.conditions[?(@.type==\"Ready\")].reason}" -n app
kubectl debug -it <pod> --image=busybox --target=app排障

給已有 Pod 注入臨時容器,共享進程命名空間

kubectl debug -it web-0 --image=busybox:1.36 --target=app -n app
kubectl debug node/<node> -it --image=busybox排障

在節點上開排錯 Pod,能看宿主機文件系統

kubectl debug node/node-1 -it --image=busybox:1.36
kubectl logs <pod> --all-containers排障

一次看 Pod 內所有容器日誌

kubectl logs web-0 --all-containers --prefix -n app
kubectl wait --for=condition=Ready pod/web-0 --timeout=60s排障

等待 Pod 就緒,腳本里做同步點

kubectl wait --for=condition=Ready pod/web-0 --timeout=60s -n app
kubectl get pod web-0 -o json | jq .status排障

配合 jq 精查狀態字段,比 jsonpath 好寫

kubectl get pod web-0 -o json -n app | jq .status
kubectl get pod web-0 -o yaml --show-managed-fields排障

看字段到底被誰改的,排查配置被篡改

kubectl get pod web-0 -o yaml --show-managed-fields -n app
kubectl cluster-info集群與資源

查看控制面地址與附加組件位置

kubectl cluster-info
kubectl version --short集群與資源

查看客戶端與服務端版本,注意版本偏差

kubectl version --short
kubectl apply --dry-run=server -f deploy.yaml集群與資源

服務端試跑,真校驗字段與准入策略但不落盤

kubectl apply --dry-run=server -f deploy.yaml -n app
kubectl diff -f deploy.yaml集群與資源

預覽 apply 會改哪些字段,變更前先看

kubectl diff -f deploy.yaml -n app
kubectl get pv,pvc集群與資源

查看存儲卷與聲明,Pending 多為存儲類問題

kubectl get pv,pvc -n app
kubectl get hpa集群與資源

查看自動擴縮容狀態與當前指標

kubectl get hpa -n app
kubectl get crd集群與資源

列出集群安裝的自定義資源定義

kubectl get crd | head -30
kubectl api-resources --verbs=list --namespaced -o name集群與資源

列出支持列舉的命名空間級資源,備份腳本常用

kubectl api-resources --verbs=list --namespaced -o name

這個工具不好用,或者遇到 bug?

去回報
站長的博客
提個建議