Kubernetes(K8s)常用命令全解析:從基礎到進階
引言:為什么掌握K8s命令是云原生時代的必備技能?
Kubernetes(簡稱K8s)作為容器編排的事實標準,已成為云原生應用部署、擴展和管理的核心平臺。其命令行工具kubectl
是與集群交互的主要入口,掌握其常用命令不僅能提高日常運維效率,更能深入理解K8s的資源模型(如聲明式API、控制器模式)和調度邏輯。
本文將系統梳理kubectl
命令,按資源管理、集群運維、部署與伸縮、故障排查、高級操作五大維度分類,涵蓋高頻使用、易混淆及進階命令,補充場景化示例與注意事項。
目錄
- Kubernetes(K8s)常用命令全解析:從基礎到進階
- 引言:為什么掌握K8s命令是云原生時代的必備技能?
- 一、資源管理基礎命令
- 1.1 資源查看(`kubectl get`)
- 1.2 資源創建(`kubectl create`與`kubectl apply`)
- 1.3 資源刪除(`kubectl delete`)
- 1.4 資源詳情查看(`kubectl describe`)
- 1.5 配置資源修改(`kubectl edit`)
- 二、集群管理命令
- 2.1 集群信息查看
- 2.2 節點管理
- 2.3 命名空間管理
- 三、部署與伸縮命令
- 3.1 Deployment管理
- 3.2 自動伸縮(HPA)
- 3.3 StatefulSet與DaemonSet
- 四、故障排查命令
- 4.1 Pod診斷
- 4.2 網絡診斷
- 4.3 存儲診斷
- 五、高級操作命令
- 5.1 標簽與注解管理
- 5.2 配置與密鑰管理(ConfigMap/Secret)
- 5.3 權限管理(RBAC)
- 5.4 作業與定時任務
- 六、易錯點與最佳實踐
- 總結
一、資源管理基礎命令
1.1 資源查看(kubectl get
)
最常用的命令之一,用于查詢集群中各類資源的狀態,支持多種輸出格式和過濾條件。
命令 | 作用 | 示例 | 補充說明 |
---|---|---|---|
kubectl get pods | 查看當前命名空間的所有Pod | kubectl get pods (簡寫成po ) | 輸出包含名稱、就緒數、狀態、重啟次數、年齡 |
kubectl get pods -n <namespace> | 查看指定命名空間的Pod | kubectl get po -n kube-system | -n 指定命名空間,如kube-system 是系統組件所在命名空間 |
kubectl get pods --all-namespaces | 查看所有命名空間的Pod | kubectl get po -A (-A 是簡寫) | 適合全局排查跨命名空間問題 |
kubectl get pods -o wide | 查看Pod的詳細信息 | kubectl get po -o wide | 額外顯示Pod的IP、所在節點、鏡像等 |
kubectl get pods -l <label> | 按標簽過濾Pod | kubectl get po -l app=nginx | 標簽是K8s資源關聯的核心,如Service通過標簽關聯Pod |
kubectl get deployments | 查看Deployment | kubectl get deploy (簡寫deploy ) | Deployment是無狀態應用的主要控制器 |
kubectl get services | 查看Service | kubectl get svc (簡寫svc ) | 輸出包含ClusterIP、端口映射等網絡信息 |
kubectl get nodes | 查看集群節點 | kubectl get no (簡寫no ) | 顯示節點狀態(Ready/NotReady)、角色、版本等 |
kubectl get namespaces | 查看命名空間 | kubectl get ns (簡寫ns ) | 命名空間用于資源隔離,默認有default 、kube-system 等 |
kubectl get <resource> -o yaml/json | 以YAML/JSON格式輸出資源詳情 | kubectl get pod nginx -o yaml | 用于查看資源的完整配置(如標簽、注解、調度策略等) |
1.2 資源創建(kubectl create
與kubectl apply
)
用于創建或更新集群資源,兩者的核心區別在于:create
是"命令式創建"(已存在則報錯),apply
是"聲明式更新"(存在則更新,不存在則創建)。
命令 | 作用 | 示例 | 適用場景 |
---|---|---|---|
kubectl create -f <file> | 通過配置文件創建資源 | kubectl create -f nginx-deploy.yaml | 僅用于新資源創建,重復執行會報錯 |
kubectl create <resource> <name> | 直接創建資源(簡單場景) | kubectl create deployment nginx --image=nginx:1.23 | 快速創建測試資源,不適合復雜配置 |
kubectl apply -f <file> | 通過配置文件創建或更新資源 | kubectl apply -f nginx-deploy.yaml | 生產環境推薦,支持增量更新(僅修改配置文件中變化的字段) |
kubectl apply -f <dir> | 批量處理目錄下的所有配置文件 | kubectl apply -f ./k8s-configs | 適合多資源協同部署(如Deployment+Service+ConfigMap) |
1.3 資源刪除(kubectl delete
)
用于刪除集群中的資源,支持按名稱、標簽、配置文件等方式刪除。
命令 | 作用 | 示例 | 注意事項 |
---|---|---|---|
kubectl delete <resource> <name> | 刪除指定名稱的資源 | kubectl delete pod nginx-7f9f6f5c9d-2xqkf | 僅刪除單個資源,需準確指定名稱 |
kubectl delete <resource> -l <label> | 按標簽刪除資源 | kubectl delete deploy -l app=nginx | 批量刪除同一標簽的資源,適合清理測試環境 |
kubectl delete -f <file> | 刪除配置文件定義的資源 | kubectl delete -f nginx-deploy.yaml | 與apply -f 對應,確保資源完整刪除 |
kubectl delete <resource> --all | 刪除當前命名空間的所有該類型資源 | kubectl delete pods --all | 謹慎使用,可能誤刪重要資源 |
kubectl delete pod <name> --grace-period=0 --force | 強制刪除Pod | kubectl delete pod nginx --grace-period=0 --force | 僅用于異常卡住的Pod(如狀態為Terminating但無法退出),可能導致數據不一致 |
1.4 資源詳情查看(kubectl describe
)
用于查看資源的詳細狀態(如事件、關聯資源、配置細節等),是故障排查的核心命令。
命令 | 作用 | 示例 | 關鍵輸出解讀 |
---|---|---|---|
kubectl describe <resource> <name> | 查看指定資源的詳細信息 | kubectl describe pod nginx | 重點關注Events 部分(如調度失敗、鏡像拉取錯誤原因) |
kubectl describe node <node-name> | 查看節點詳情 | kubectl describe node node-1 | 關注Conditions (節點健康狀態)、Allocatable (可分配資源)、Taints (污點,影響調度) |
kubectl describe svc <service-name> | 查看Service詳情 | kubectl describe svc nginx-svc | 關注Endpoints (后端Pod的IP:Port,為空則說明Pod未匹配標簽) |
1.5 配置資源修改(kubectl edit
)
用于在線編輯集群中已存在的資源配置(等效于修改YAML后apply
)。
kubectl edit deployment nginx # 編輯Deployment配置(自動打開默認編輯器)
kubectl edit svc nginx-svc -n dev # 編輯指定命名空間的Service
注意:編輯后需確保語法正確(如YAML縮進),保存后配置會自動生效(觸發滾動更新等操作)。
二、集群管理命令
2.1 集群信息查看
用于了解集群的基本狀態、版本及節點信息。
命令 | 作用 | 示例 | 輸出解讀 |
---|---|---|---|
kubectl cluster-info | 查看集群核心組件地址 | kubectl cluster-info | 顯示API Server、ETCD、CoreDNS等組件的訪問地址,若某組件未就緒會提示錯誤 |
kubectl cluster-info dump | 導出集群詳細信息 | kubectl cluster-info dump > cluster-dump.log | 包含所有資源配置、事件、日志片段,用于離線診斷 |
kubectl version | 查看版本信息 | kubectl version --short | 顯示客戶端(kubectl)和服務端(API Server)版本,需確保版本兼容(客戶端與服務端版本差不超過1個大版本) |
kubectl api-versions | 查看支持的API版本 | kubectl api-versions | 如apps/v1 (Deployment所在API組)、v1 (Pod、Service所在API組),不同資源可能屬于不同API組 |
kubectl api-resources | 查看支持的資源類型 | kubectl api-resources | 包含資源名稱、簡寫、API組、命名空間范圍(是否集群級)等,如pods 是命名空間級,nodes 是集群級 |
2.2 節點管理
用于節點的調度控制(如維護時標記不可調度)。
命令 | 作用 | 示例 | 場景說明 |
---|---|---|---|
kubectl cordon <node-name> | 標記節點為"不可調度" | kubectl cordon node-1 | 阻止新Pod調度到該節點,但不影響已運行的Pod(用于臨時維護) |
kubectl uncordon <node-name> | 解除"不可調度"標記 | kubectl uncordon node-1 | 允許新Pod調度到該節點 |
kubectl drain <node-name> --ignore-daemonsets | 排空節點(驅逐所有Pod) | kubectl drain node-1 --ignore-daemonsets | 用于節點下線維護,--ignore-daemonsets 跳過DaemonSet管理的Pod(DaemonSet要求所有節點運行) |
kubectl top node | 查看節點資源使用情況 | kubectl top node | 需部署metrics-server,顯示CPU/內存使用率,用于識別節點過載 |
2.3 命名空間管理
命名空間用于隔離集群資源(如開發、測試、生產環境分離)。
命令 | 作用 | 示例 | 注意事項 |
---|---|---|---|
kubectl create namespace <name> | 創建命名空間 | kubectl create ns dev | 命名空間名稱需符合DNS-1123規范(小寫字母、數字、-) |
kubectl delete namespace <name> | 刪除命名空間 | kubectl delete ns dev | 會遞歸刪除命名空間內所有資源,操作不可逆 |
kubectl config set-context --current --namespace=<name> | 切換默認命名空間 | kubectl config set-context --current --namespace=dev | 避免每次命令加-n <namespace> ,通過kubectl config view 查看當前上下文 |
三、部署與伸縮命令
3.1 Deployment管理
Deployment是最常用的無狀態應用部署控制器,支持滾動更新、回滾等功能。
命令 | 作用 | 示例 | 核心邏輯 |
---|---|---|---|
kubectl create deployment <name> --image=<image> | 創建Deployment | kubectl create deployment nginx --image=nginx:1.23 | 自動創建ReplicaSet和Pod,默認1個副本 |
kubectl scale deployment <name> --replicas=<num> | 調整副本數 | kubectl scale deploy nginx --replicas=3 | 擴縮容時通過ReplicaSet控制Pod數量,確保服務不中斷 |
kubectl rollout status deployment <name> | 查看滾動更新狀態 | kubectl rollout status deploy nginx | 顯示更新進度(如"3 out of 3 new replicas have been updated") |
kubectl rollout history deployment <name> | 查看更新歷史 | kubectl rollout history deploy nginx | 每個版本(revision)對應一次配置變更,包含變更時間、原因 |
kubectl rollout undo deployment <name> --to-revision=<num> | 回滾到指定版本 | kubectl rollout undo deploy nginx --to-revision=2 | 回滾會創建新ReplicaSet,逐步替換舊Pod,確保零 downtime |
3.2 自動伸縮(HPA)
Horizontal Pod Autoscaler(HPA)可根據CPU使用率、自定義指標自動調整副本數。
命令 | 作用 | 示例 | 配置說明 |
---|---|---|---|
kubectl autoscale deployment <name> --min=<min> --max=<max> --cpu-percent=<percent> | 創建HPA | kubectl autoscale deploy nginx --min=2 --max=5 --cpu-percent=80 | 當平均CPU使用率超過80%時擴容(最多5副本),低于閾值時縮容(最少2副本) |
kubectl get hpa | 查看HPA狀態 | kubectl get hpa | 顯示當前副本數、目標指標(如targets: 50%/80% )、最小/最大副本數 |
注意:HPA依賴metrics-server收集指標,需先部署(kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
)。
3.3 StatefulSet與DaemonSet
-
StatefulSet:用于部署有狀態應用(如數據庫、分布式系統),提供穩定的網絡標識(固定域名)和存儲(PVC模板)。
kubectl get statefulsets # 查看StatefulSet(簡寫sts) kubectl scale statefulset <name> --replicas=<num> # 調整副本數(需確保存儲可用)
-
DaemonSet:確保所有(或指定)節點運行相同的Pod(如日志收集器、監控代理、網絡插件)。
kubectl get daemonsets # 查看DaemonSet(簡寫ds) kubectl describe ds <name> # 查看調度節點選擇器(如通過標簽限制僅在特定節點運行)
四、故障排查命令
4.1 Pod診斷
Pod是K8s的最小部署單元,其故障排查是日常運維的重點。
命令 | 作用 | 示例 | 排查場景 |
---|---|---|---|
kubectl logs <pod-name> -f | 查看Pod日志(實時跟蹤) | kubectl logs nginx-7f9f6f5c9d-2xqkf -f | 定位應用運行時錯誤(如日志中的Exception) |
kubectl logs <pod-name> -c <container-name> | 查看指定容器的日志 | kubectl logs nginx-pod -c sidecar -f | 多容器Pod(如主應用+sidecar)需指定容器,否則默認第一個容器 |
kubectl exec -it <pod-name> -- <command> | 進入容器執行命令 | kubectl exec -it nginx-pod -- /bin/bash | 檢查容器內文件、網絡(如ping 、curl )、環境變量 |
kubectl cp <pod-name>:<path> <local-path> | 從Pod拷貝文件到本地 | kubectl cp nginx-pod:/etc/nginx/nginx.conf ./nginx.conf | 提取配置文件或日志文件離線分析 |
kubectl cp <local-path> <pod-name>:<path> | 從本地拷貝文件到Pod | kubectl cp ./index.html nginx-pod:/usr/share/nginx/html/ | 臨時替換應用文件(如調試靜態頁面) |
kubectl get events -n <namespace> --sort-by=.metadata.creationTimestamp | 查看命名空間事件 | kubectl get events -n dev --sort-by=.metadata.creationTimestamp | 定位Pod啟動失敗原因(如"FailedScheduling"調度失敗、"ErrImagePull"鏡像拉取失敗) |
4.2 網絡診斷
網絡問題是K8s中最常見的故障類型,需檢查Service、網絡策略、DNS等。
命令 | 作用 | 示例 | 排查邏輯 |
---|---|---|---|
kubectl get svc <name> -o wide | 查看Service網絡信息 | kubectl get svc nginx-svc -o wide | 確認ClusterIP、端口映射是否正確(如80:30080/TCP 表示集群內80端口映射到節點30080端口) |
kubectl describe svc <name> | 查看Service關聯的Endpoints | kubectl describe svc nginx-svc | Endpoints為空→檢查Pod標簽是否與Service的selector 匹配 |
kubectl port-forward <pod-name> <local-port>:<pod-port> | 本地端口轉發 | kubectl port-forward nginx-pod 8080:80 | 繞過Service直接訪問Pod,驗證Pod本身是否正常(排除Service配置問題) |
kubectl run -it --rm --image=busybox:1.35 dns-test -- nslookup <service-name> | 測試DNS解析 | kubectl run -it --rm --image=busybox:1.35 dns-test -- nslookup nginx-svc | 解析失敗→檢查CoreDNS是否正常(`kubectl get po -n kube-system |
kubectl get networkpolicies -n <namespace> | 查看網絡策略 | kubectl get networkpolicies -n dev | 若Pod間無法通信,檢查是否有網絡策略(NetworkPolicy)阻止流量 |
4.3 存儲診斷
存儲相關故障(如PVC綁定失敗、掛載異常)需檢查PV、PVC、存儲類等。
命令 | 作用 | 示例 | 排查方向 |
---|---|---|---|
kubectl get pv | 查看持久卷(PV) | kubectl get pv | 關注PV的STATUS (Available/ Bound/ Released),若PVC未綁定,檢查是否有匹配的PV(容量、訪問模式、存儲類一致) |
kubectl get pvc -n <namespace> | 查看持久卷聲明(PVC) | kubectl get pvc -n dev | Pending 狀態→PV不足或不匹配;Bound 狀態→正常綁定 |
kubectl describe pvc <name> -n <namespace> | 查看PVC綁定失敗原因 | kubectl describe pvc nginx-pvc -n dev | 事件中可能提示"no persistent volumes available for this claim and no storage class is set"(未指定存儲類且無可用PV) |
kubectl get storageclasses | 查看存儲類(StorageClass) | kubectl get sc | 存儲類用于動態創建PV,若PVC指定了存儲類,需確保該存儲類存在且可用 |
五、高級操作命令
5.1 標簽與注解管理
標簽(Label)用于資源分組和選擇(如Service關聯Pod),注解(Annotation)用于存儲非標識性元數據(如構建信息、運維說明)。
命令 | 作用 | 示例 | 規范說明 |
---|---|---|---|
kubectl label <resource> <name> <key>=<value> | 為資源添加標簽 | kubectl label pod nginx-pod env=dev | 標簽鍵需符合[a-z0-9A-Z_-] ,長度≤63字符 |
kubectl label <resource> <name> <key>=<new-value> --overwrite | 更新標簽 | kubectl label pod nginx-pod env=prod --overwrite | 必須加--overwrite ,否則無法更新已有標簽 |
kubectl label <resource> <name> <key>- | 刪除標簽 | kubectl label pod nginx-pod env- | 標簽鍵后加- 表示刪除 |
kubectl annotate <resource> <name> <key>=<value> | 為資源添加注解 | kubectl annotate pod nginx-pod build-id=12345 | 注解可存儲長文本(如JSON),不用于資源選擇,僅用于描述 |
5.2 配置與密鑰管理(ConfigMap/Secret)
-
ConfigMap:存儲非敏感配置(如應用參數),通過環境變量或文件掛載注入Pod。
kubectl create configmap nginx-conf --from-file=nginx.conf # 從文件創建 kubectl get configmaps # 查看ConfigMap(簡寫cm) kubectl describe cm nginx-conf # 查看配置內容
-
Secret:存儲敏感信息(如密碼、證書),默認base64編碼(非加密,需配合RBAC或外部密鑰管理)。
kubectl create secret generic db-creds --from-literal=username=admin --from-literal=password=123456 # 創建密鑰 kubectl get secrets # 查看Secret(簡寫secret) kubectl describe secret db-creds # 查看密鑰結構(值隱藏) kubectl get secret db-creds -o jsonpath='{.data.password}' | base64 -d # 解碼查看值(謹慎操作)
5.3 權限管理(RBAC)
基于角色的訪問控制(RBAC)用于管理集群資源的訪問權限,核心是"誰(Subject)能對什么資源(Resource)執行什么操作(Verb)"。
命令 | 作用 | 示例 | 權限范圍 |
---|---|---|---|
kubectl get roles -n <namespace> | 查看命名空間內的角色 | kubectl get roles -n dev | 角色(Role)僅作用于所在命名空間 |
kubectl get rolebindings -n <namespace> | 查看角色綁定 | kubectl get rolebindings -n dev | 角色綁定(RoleBinding)將角色與用戶(如ServiceAccount)關聯 |
kubectl get clusterroles | 查看集群級角色 | kubectl get clusterroles | 集群角色(ClusterRole)作用于全集群 |
kubectl get clusterrolebindings | 查看集群角色綁定 | kubectl get clusterrolebindings | 綁定集群角色與用戶 |
kubectl auth can-i <action> <resource> --as=<user> | 驗證用戶權限 | kubectl auth can-i get pods --as=dev-user | 快速確認權限配置是否生效(如返回yes /no ) |
5.4 作業與定時任務
-
Job:用于執行一次性任務(如數據備份、初始化),確保任務成功完成(即使節點故障)。
kubectl get jobs # 查看Job kubectl describe job <name> # 查看任務執行狀態(如成功的Pod數、失敗原因) kubectl delete job <name> # 刪除Job(會保留已完成的Pod,需手動刪除)
-
CronJob:用于執行定時任務(如日志清理、周期性報表生成),基于Cron表達式調度。
kubectl get cronjobs # 查看CronJob(簡寫cj) kubectl describe cronjob <name> # 查看調度規則(如`Schedule: 0 3 * * *`表示每天凌晨3點執行) kubectl create cronjob cleanup --image=busybox --schedule="0 3 * * *" -- rm -rf /tmp/* # 創建定時任務
六、易錯點與最佳實踐
-
命令縮寫與復數形式
資源簡寫需用復數(如kubectl get po
正確,kubectl get pod
錯誤),常見簡寫:pod→po
、deployment→deploy
、service→svc
、node→no
、namespace→ns
。 -
命名空間上下文
未指定-n
時默認操作default
命名空間,切換默認命名空間后(kubectl config set-context
),所有命令默認在該命名空間執行,避免跨命名空間誤操作。 -
create
vsapply
的選擇- 臨時測試用
create
(如kubectl create deployment test --image=nginx
); - 生產環境用
apply
(配合Git管理配置文件,支持版本控制和增量更新)。
- 臨時測試用
-
強制刪除的風險
--grace-period=0 --force
會跳過K8s的優雅終止流程,可能導致數據丟失(如數據庫未完成事務提交),僅用于Pod長時間卡在Terminating
狀態的極端場景。 -
日志查看技巧
- 多容器Pod必須用
-c
指定容器(如kubectl logs <pod> -c <container>
); - 實時日志加
-f
,配合--tail=<num>
查看最近N行(如kubectl logs <pod> -f --tail=100
); - 查看歷史日志可用
--previous
(如kubectl logs <pod> --previous
查看崩潰容器的日志)。
- 多容器Pod必須用
-
資源依賴關系
部署時需注意資源依賴順序:先創建ConfigMap/Secret,再創建Deployment(避免Pod啟動時配置文件不存在);先創建Deployment,再創建Service(確保Endpoints能關聯Pod)。 -
HPA不生效排查
- 檢查metrics-server是否運行(
kubectl get po -n kube-system | grep metrics-server
); - 確保Pod設置了資源請求(
resources.requests.cpu
),HPA基于請求值計算使用率; - 查看HPA事件(
kubectl describe hpa <name>
),可能提示"missing request for cpu"(未設置CPU請求)。
- 檢查metrics-server是否運行(
總結
Kubernetes命令的本質是與聲明式API交互的工具,掌握命令的同時需理解其背后的資源模型(如控制器模式、標簽選擇器、命名空間隔離)。高頻命令(get
、describe
、apply
)是日常運維的基石,而故障排查命令(logs
、exec
、events
)則是定位問題的關鍵。
建議通過實際場景練習(如部署Nginx→暴露Service→配置HPA→模擬故障排查)加深理解,并善用kubectl --help
和官方 cheatsheet 快速查詢。隨著實踐深入,命令會逐漸內化為運維直覺,助力高效管理K8s集群。