kubectl命令實戰寶典:Kubernetes集群管理與故障排查200+命令
一、概述
1.1 背景介紹
kubectl是Kubernetes官方提供的命令行工具,作為與Kubernetes集群交互的主要接口,它通過調用Kubernetes API Server實現對集群資源的全面管理。在生產環境中,運維工程師需要熟練掌握kubectl命令來完成日常的集群運維、應用部署、故障排查和性能優化等工作。
隨著容器化和云原生技術的普及,Kubernetes已成為容器編排的事實標準。然而,Kubernetes的復雜性也給運維人員帶來了挑戰。kubectl命令體系龐大,涵蓋資源管理、網絡配置、存儲編排、權限控制等多個維度,掌握這些命令對于高效運維至關重要。
本文檔系統整理了200+個kubectl實戰命令,涵蓋從基礎操作到高級技巧的完整知識體系,旨在幫助運維工程師快速定位問題、提升工作效率,并建立完善的Kubernetes運維能力。
1.2 技術特點
聲明式管理:支持通過YAML/JSON配置文件進行資源的聲明式管理,實現基礎設施即代碼(IaC)
多集群支持:通過context機制實現多集群、多環境的統一管理,支持快速切換操作目標
豐富的輸出格式:提供JSON、YAML、wide、custom-columns等多種輸出格式,便于數據提取和自動化處理
強大的過濾能力:支持label selector、field selector、JSONPath等多種過濾方式,精確定位目標資源
實時監控能力:通過watch機制實時監控資源狀態變化,支持日志流式輸出和事件追蹤
插件擴展機制:支持通過插件(kubectl plugins)擴展功能,與生態工具無縫集成
1.3 適用場景
日常運維管理:集群節點管理、資源配額設置、命名空間隔離、RBAC權限配置等常規運維操作
應用生命周期管理:應用部署、滾動更新、版本回滾、彈性伸縮、灰度發布等應用管理場景
故障診斷排查:Pod異常排查、網絡連通性測試、日志分析、事件追蹤、資源瓶頸定位等故障處理
性能優化調優:資源使用率分析、性能指標采集、容器資源限制調整、HPA/VPA配置優化
安全審計合規:Secret管理、網絡策略配置、Pod安全策略、審計日志查詢、漏洞掃描集成
自動化運維:CI/CD流水線集成、批量操作腳本、資源自動化巡檢、備份恢復自動化
1.4 環境要求
| 組件 | 版本要求 | 說明 |
|---|---|---|
| Kubernetes集群 | v1.20+ (推薦v1.24+) | 本文檔命令基于v1.24+版本,部分新特性需要更高版本支持 |
| kubectl客戶端 | 與集群版本差異不超過1個minor版本 | 建議kubectl版本與集群版本保持一致,避免API兼容性問題 |
| 操作系統 | Linux/macOS/Windows | 跨平臺支持,Linux環境下功能最完整 |
| 網絡連接 | 可訪問API Server(默認6443端口) | 需要配置kubeconfig文件,確保網絡連通性 |
| 權限要求 | 根據操作需求配置相應RBAC權限 | 建議生產環境使用最小權限原則,避免使用cluster-admin |
| 依賴工具 | jq、yq、grep、awk等(可選) | 用于高級數據處理和自動化腳本編寫 |
二、詳細步驟
2.1 準備工作
2.1.1 kubectl安裝與版本檢查
# 檢查kubectl版本(客戶端和服務端) kubectl version --short # 查看詳細版本信息 kubectl version --output=yaml # 檢查kubectl配置是否正確 kubectl cluster-info # 查看API Server地址和健康狀態 kubectl cluster-info dump | grep -i"cluster-info"
說明:kubectl版本應與Kubernetes集群版本保持兼容,版本差異不應超過一個minor版本。例如,kubectl 1.24可以與1.23、1.24、1.25版本的集群通信。
2.1.2 kubeconfig配置管理
# 查看當前kubeconfig文件路徑 echo$KUBECONFIG # 查看kubeconfig配置內容 kubectl config view # 查看原始配置(包含敏感信息) kubectl config view --raw # 查看當前使用的context kubectl config current-context # 列出所有可用的context kubectl config get-contexts # 列出所有集群配置 kubectl config get-clusters
說明:kubeconfig文件默認位于~/.kube/config,包含集群連接信息、認證憑據和上下文配置。生產環境建議對該文件設置嚴格的權限控制(chmod 600)。
2.2 核心配置
2.2.1 多集群Context管理
# 切換到指定context kubectl config use-context production-cluster # 創建新的context kubectl configset-context dev-context --cluster=dev-cluster --user=dev-admin --namespace=development # 修改context的默認命名空間 kubectl configset-context --current --namespace=kube-system # 刪除指定context kubectl config delete-context old-context # 重命名context kubectl config rename-context old-name new-name
說明:Context是集群、用戶和命名空間的組合,通過切換context可以快速在不同環境間切換。建議為不同環境(開發、測試、生產)配置獨立的context,避免誤操作。
2.2.2 集群憑據配置
# 設置集群信息 kubectl configset-cluster prod-cluster --server=https://k8s-api.example.com:6443 --certificate-authority=/path/to/ca.crt --embed-certs=true # 設置用戶憑據(證書認證) kubectl configset-credentials admin-user --client-certificate=/path/to/admin.crt --client-key=/path/to/admin.key --embed-certs=true # 設置用戶憑據(Token認證) kubectl configset-credentials token-user --token=eyJhbGciOiJSUzI1NiIsImtpZCI6... # 取消TLS驗證(僅用于測試環境) kubectl configset-clustertest-cluster --server=https://test-api:6443 --insecure-skip-tls-verify=true
說明:生產環境必須使用TLS加密通信,并驗證證書有效性。Token認證適用于ServiceAccount場景,證書認證適用于管理員用戶。--embed-certs=true會將證書內容嵌入kubeconfig文件,便于文件傳輸。
2.2.3 kubectl命令行補全配置
# Bash環境配置自動補全 echo'source <(kubectl completion bash)'?>> ~/.bashrc echo'alias k=kubectl'>> ~/.bashrc echo'complete -F __start_kubectl k'>> ~/.bashrc source~/.bashrc # Zsh環境配置自動補全 echo'source <(kubectl completion zsh)'?>> ~/.zshrc echo'alias k=kubectl'>> ~/.zshrc echo'compdef __start_kubectl k'>> ~/.zshrc source~/.zshrc # 驗證補全功能 kubectl get po# 應自動補全為 pods
說明:命令行補全可以大幅提升工作效率,減少輸入錯誤。配置別名k可以簡化日常操作,在生產環境中已成為事實標準。
2.3 啟動和驗證
2.3.1 集群連接驗證
# 驗證集群連接狀態 kubectl cluster-info # 查看集群組件狀態 kubectl get componentstatuses kubectl get cs # 簡寫形式 # 檢查API Server健康狀態 kubectl get --raw /healthz kubectl get --raw /livez kubectl get --raw /readyz # 查看API資源列表 kubectl api-resources # 查看API版本 kubectl api-versions
2.3.2 權限驗證
# 檢查當前用戶權限 kubectl auth can-i create deployments kubectl auth can-i delete pods --namespace=production kubectl auth can-i'*''*'# 檢查是否有集群管理員權限 # 模擬其他用戶權限檢查 kubectl auth can-i list secrets --as=systemdefault:myapp # 查看當前用戶可訪問的資源 kubectl auth can-i --list # 查看指定命名空間的權限 kubectl auth can-i --list --namespace=kube-system
說明:權限驗證是運維操作前的必要步驟,可以避免因權限不足導致的操作失敗。生產環境應遵循最小權限原則,定期審計用戶權限配置。
三、示例代碼和配置
3.1 集群管理命令(50+)
3.1.1 節點管理命令
# 查看所有節點 kubectl get nodes kubectl get nodes -o wide # 顯示更多信息(IP、OS、內核版本等) # 查看節點詳細信息 kubectl describe node node-name # 查看節點資源使用情況 kubectl top nodes kubectl top nodes --sort-by=cpu kubectl top nodes --sort-by=memory # 標記節點為不可調度(維護模式) kubectl cordon node-name # 恢復節點為可調度狀態 kubectl uncordon node-name # 驅逐節點上的所有Pod(優雅驅逐) kubectl drain node-name --ignore-daemonsets --delete-emptydir-data # 強制驅逐(跳過PDB限制) kubectl drain node-name --ignore-daemonsets --force --grace-period=0 # 給節點打標簽 kubectl label nodes node-name env=production kubectl label nodes node-name disktype=ssd # 刪除節點標簽 kubectl label nodes node-name env- # 修改節點標簽 kubectl label nodes node-name env=staging --overwrite # 查看帶特定標簽的節點 kubectl get nodes -l env=production kubectl get nodes -l disktype=ssd,env=production # 給節點添加污點(Taint) kubectl taint nodes node-name key=value:NoSchedule kubectl taint nodes node-name dedicated=gpu:NoExecute # 刪除節點污點 kubectl taint nodes node-name key:NoSchedule- # 查看節點污點信息 kubectl describe node node-name | grep -i taint
說明:節點管理是集群運維的基礎操作。cordon用于臨時禁止調度,drain用于節點維護前的Pod遷移。污點(Taint)和容忍(Toleration)機制用于控制Pod調度到特定節點。
3.1.2 命名空間管理命令
# 查看所有命名空間 kubectl get namespaces kubectl get ns # 簡寫形式 # 創建命名空間 kubectl create namespace development kubectl create ns staging # 查看命名空間詳細信息 kubectl describe namespace production # 刪除命名空間(會刪除該命名空間下所有資源) kubectl delete namespace old-project # 給命名空間打標簽 kubectl label namespace production env=prod kubectl label namespace production team=backend # 查看命名空間標簽 kubectl get namespace --show-labels # 設置默認命名空間(當前context) kubectl configset-context --current --namespace=production # 查看命名空間資源配額 kubectl get resourcequota -n production kubectl describe resourcequota -n production # 查看命名空間限制范圍 kubectl get limitrange -n production kubectl describe limitrange -n production
說明:命名空間是Kubernetes中的邏輯隔離單元,用于多租戶環境的資源隔離。刪除命名空間會級聯刪除其下所有資源,操作需謹慎。
3.1.3 資源配額管理命令
# 創建資源配額 kubectl create quota dev-quota --hard=cpu=10,memory=20Gi,pods=20 -n development # 查看所有資源配額 kubectl get resourcequota --all-namespaces kubectl get quota -A # 簡寫形式 # 查看資源配額詳情 kubectl describe quota dev-quota -n development # 通過YAML文件創建資源配額 cat <
說明:ResourceQuota用于限制命名空間的資源使用量,防止資源過度消耗。生產環境建議為每個命名空間配置合理的資源配額。
3.1.4 RBAC權限管理命令
# 查看所有角色(Role) kubectl get roles -A kubectl get role -n kube-system # 查看集群角色(ClusterRole) kubectl get clusterroles kubectl get clusterrole admin -o yaml # 查看角色綁定(RoleBinding) kubectl get rolebindings -A kubectl get rolebinding -n production # 查看集群角色綁定(ClusterRoleBinding) kubectl get clusterrolebindings # 創建角色 kubectl create role pod-reader --verb=get,list,watch --resource=pods -n development # 創建集群角色 kubectl create clusterrole deployment-manager --verb=get,list,create,delete --resource=deployments # 創建角色綁定 kubectl create rolebinding dev-pod-reader --role=pod-reader --user=john -n development # 創建集群角色綁定 kubectl create clusterrolebinding cluster-admin-binding --clusterrole=cluster-admin --user=admin@example.com # 將角色綁定到ServiceAccount kubectl create rolebinding app-reader --role=pod-reader --serviceaccount=default:myapp -n production # 查看角色詳細權限 kubectl describe role pod-reader -n development kubectl describe clusterrole admin
說明:RBAC是Kubernetes的核心安全機制,通過Role/ClusterRole定義權限,通過RoleBinding/ClusterRoleBinding將權限授予用戶或ServiceAccount。生產環境應避免直接使用cluster-admin角色。
3.1.5 ServiceAccount管理命令
# 查看所有ServiceAccount kubectl get serviceaccounts -A kubectl get sa -n default # 簡寫形式 # 創建ServiceAccount kubectl create serviceaccount myapp -n production # 查看ServiceAccount詳情 kubectl describe sa myapp -n production # 獲取ServiceAccount的Token kubectl create token myapp -n production kubectl create token myapp --duration=8760h -n production # 指定有效期 # 查看ServiceAccount關聯的Secret kubectl get sa myapp -n production -o jsonpath='{.secrets[0].name}' # 刪除ServiceAccount kubectl delete sa myapp -n production
說明:ServiceAccount是Pod訪問API Server的身份憑證。Kubernetes 1.24+版本不再自動創建長期有效的Token Secret,需要使用kubectl create token命令動態生成。
3.2 工作負載管理命令(50+)
3.2.1 Pod管理命令
# 查看所有Pod kubectl get pods -A kubectl get po -n production # 簡寫形式 # 查看Pod詳細信息 kubectl get pods -o wide kubectl describe pod nginx-pod -n production # 創建Pod(命令行方式) kubectl run nginx --image=nginx:1.21 --port=80 # 創建Pod并設置資源限制 kubectl run nginx --image=nginx:1.21 --requests='cpu=100m,memory=256Mi' --limits='cpu=200m,memory=512Mi' # 創建臨時調試Pod kubectl run debug-pod --image=busybox --rm -it -- sh # 查看Pod日志 kubectl logs nginx-pod -n production kubectl logs nginx-pod -n production --tail=100 kubectl logs nginx-pod -n production --since=1h kubectl logs nginx-pod -n production -f # 實時查看 # 查看多容器Pod的特定容器日志 kubectl logs nginx-pod -c sidecar-container -n production # 查看Pod的前一個實例日志(Pod重啟后) kubectl logs nginx-pod --previous -n production # 進入Pod執行命令 kubectlexec-it nginx-pod -n production -- bash kubectlexecnginx-pod -n production -- ls /var/log # 多容器Pod指定容器執行命令 kubectlexec-it nginx-pod -c nginx-container -n production -- sh # 復制文件到Pod kubectl cp /local/file.txt production/nginx-pod:/tmp/file.txt # 從Pod復制文件 kubectl cp production/nginx-pod:/var/log/nginx/access.log ./access.log # 查看Pod資源使用情況 kubectl top pod -n production kubectl top pod --sort-by=cpu -A kubectl top pod --sort-by=memory -n production # 刪除Pod kubectl delete pod nginx-pod -n production # 強制刪除Pod kubectl delete pod nginx-pod -n production --force --grace-period=0 # 根據標簽刪除Pod kubectl delete pods -l app=nginx -n production
說明:Pod是Kubernetes中最小的調度單元。kubectl logs和kubectl exec是日常運維中最常用的命令。強制刪除Pod可能導致數據丟失,僅在必要時使用。
3.2.2 Deployment管理命令
# 查看所有Deployment kubectl get deployments -A kubectl get deploy -n production # 簡寫形式 # 創建Deployment kubectl create deployment nginx --image=nginx:1.21 --replicas=3 # 查看Deployment詳情 kubectl describe deployment nginx -n production # 擴縮容Deployment kubectl scale deployment nginx --replicas=5 -n production # 自動擴縮容(HPA) kubectl autoscale deployment nginx --min=3 --max=10 --cpu-percent=80 # 更新鏡像(滾動更新) kubectlsetimage deployment/nginx nginx=nginx:1.22 -n production # 查看滾動更新狀態 kubectl rollout status deployment/nginx -n production # 查看滾動更新歷史 kubectl rollouthistorydeployment/nginx -n production # 回滾到上一個版本 kubectl rollout undo deployment/nginx -n production # 回滾到指定版本 kubectl rollout undo deployment/nginx --to-revision=2 -n production # 暫停滾動更新 kubectl rollout pause deployment/nginx -n production # 恢復滾動更新 kubectl rollout resume deployment/nginx -n production # 重啟Deployment(重建所有Pod) kubectl rollout restart deployment/nginx -n production
說明:Deployment是最常用的工作負載控制器,支持滾動更新和版本回滾。rollout命令是管理應用發布的核心工具,生產環境建議保留足夠的歷史版本用于快速回滾。
3.2.3 StatefulSet和DaemonSet管理命令
# 查看StatefulSet kubectl get statefulsets -A kubectl get sts -n production # 簡寫形式 # 創建StatefulSet(需要YAML文件) kubectl apply -f mysql-statefulset.yaml # 擴縮容StatefulSet kubectl scale statefulset mysql --replicas=5 -n production # 查看StatefulSet滾動更新狀態 kubectl rollout status statefulset/mysql -n production # 刪除StatefulSet但保留Pod kubectl delete statefulset mysql --cascade=orphan -n production # 查看DaemonSet kubectl get daemonsets -A kubectl get ds -n kube-system # 簡寫形式 # 查看DaemonSet詳情 kubectl describe daemonset fluentd -n kube-system # 更新DaemonSet鏡像 kubectlsetimage daemonset/fluentd fluentd=fluentd:v1.15 -n kube-system # 查看DaemonSet滾動更新狀態 kubectl rollout status daemonset/fluentd -n kube-system
說明:StatefulSet用于有狀態應用(如數據庫),提供穩定的網絡標識和持久化存儲。DaemonSet確保每個節點運行一個Pod副本,常用于日志收集、監控代理等場景。
3.2.4 Job和CronJob管理命令
# 創建一次性Job kubectl create job backup --image=backup-tool:latest # 查看Job kubectl getjobs-A kubectl describe job backup -n production # 查看Job的Pod kubectl get pods --selector=job-name=backup -n production # 刪除Job及其Pod kubectl delete job backup -n production # 創建CronJob kubectl create cronjob daily-backup --image=backup-tool:latest --schedule="0 2 * * *" # 查看CronJob kubectl get cronjobs -A kubectl get cj -n production # 簡寫形式 # 手動觸發CronJob kubectl create job manual-backup --from=cronjob/daily-backup -n production # 暫停CronJob kubectl patch cronjob daily-backup -p'{"spec":{"suspend":true}}'-n production # 恢復CronJob kubectl patch cronjob daily-backup -p'{"spec":{"suspend":false}}'-n production
說明:Job用于一次性任務,CronJob用于定時任務。CronJob的schedule格式遵循標準Cron表達式。生產環境建議設置合理的successfulJobsHistoryLimit和failedJobsHistoryLimit。
3.3 網絡和服務管理命令(40+)
3.3.1 Service管理命令
# 查看所有Service kubectl get services -A kubectl get svc -n production # 簡寫形式 # 創建ClusterIP類型Service kubectl create service clusterip nginx --tcp=80:80 # 創建NodePort類型Service kubectl create service nodeport nginx --tcp=80:80 --node-port=30080 # 創建LoadBalancer類型Service kubectl create service loadbalancer nginx --tcp=80:80 # 通過Deployment暴露Service kubectl expose deployment nginx --port=80 --target-port=8080 --type=ClusterIP # 查看Service詳情 kubectl describe service nginx -n production # 查看Service的Endpoints kubectl get endpoints nginx -n production kubectl get ep nginx -n production # 簡寫形式 # 編輯Service kubectl edit service nginx -n production # 刪除Service kubectl delete service nginx -n production
說明:Service是Kubernetes中的服務發現和負載均衡機制。ClusterIP用于集群內部訪問,NodePort用于外部訪問,LoadBalancer用于云環境的負載均衡器集成。
3.3.2 Ingress管理命令
# 查看所有Ingress kubectl get ingress -A kubectl get ing -n production # 簡寫形式 # 查看Ingress詳情 kubectl describe ingress web-ingress -n production # 創建Ingress(需要YAML文件) kubectl apply -f ingress.yaml # 查看Ingress Controller kubectl get pods -n ingress-nginx kubectl logs -f deployment/ingress-nginx-controller -n ingress-nginx # 編輯Ingress kubectl edit ingress web-ingress -n production # 刪除Ingress kubectl delete ingress web-ingress -n production
說明:Ingress提供HTTP/HTTPS路由功能,是集群外部訪問服務的標準方式。需要先部署Ingress Controller(如Nginx Ingress、Traefik等)才能使用Ingress資源。
3.3.3 NetworkPolicy和DNS命令
# 查看網絡策略 kubectl get networkpolicies -A kubectl get netpol -n production # 簡寫形式 # 查看網絡策略詳情 kubectl describe networkpolicy deny-all -n production # 創建網絡策略(需要YAML文件) kubectl apply -f network-policy.yaml # 刪除網絡策略 kubectl delete networkpolicy deny-all -n production # 查看CoreDNS配置 kubectl get configmap coredns -n kube-system -o yaml # 查看CoreDNS Pod kubectl get pods -n kube-system -l k8s-app=kube-dns # 測試DNS解析 kubectl run dnsutils --image=tutum/dnsutils --rm -it -- nslookup kubernetes.default # 查看Service的DNS記錄 kubectl run dnsutils --image=tutum/dnsutils --rm -it -- nslookup nginx.production.svc.cluster.local
說明:NetworkPolicy用于實現Pod級別的網絡隔離,需要CNI插件支持(如Calico、Cilium)。DNS是服務發現的基礎,Service的完整域名格式為
. .svc.cluster.local。 3.4 存儲管理命令(30+)
3.4.1 PersistentVolume和PVC命令
# 查看PersistentVolume kubectl get persistentvolumes kubectl get pv # 簡寫形式 # 查看PV詳情 kubectl describe pv pv-name # 查看PersistentVolumeClaim kubectl get persistentvolumeclaims -A kubectl get pvc -n production # 簡寫形式 # 查看PVC詳情 kubectl describe pvc data-pvc -n production # 創建PVC(需要YAML文件) kubectl apply -f pvc.yaml # 刪除PVC kubectl delete pvc data-pvc -n production # 查看PVC使用情況 kubectl get pvc -o custom-columns=NAME:.metadata.name,STATUS:.status.phase,VOLUME:.spec.volumeName,CAPACITY:.status.capacity.storage,STORAGECLASS:.spec.storageClassName -n production
說明:PV是集群級別的存儲資源,PVC是命名空間級別的存儲請求。PVC與PV通過StorageClass動態綁定,或通過標簽選擇器靜態綁定。
3.4.2 StorageClass命令
# 查看StorageClass kubectl get storageclasses kubectl get sc # 簡寫形式 # 查看StorageClass詳情 kubectl describe storageclass standard # 設置默認StorageClass kubectl patch storageclass standard -p'{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}' # 取消默認StorageClass kubectl patch storageclass standard -p'{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'
說明:StorageClass定義了動態存儲供應的參數,包括存儲提供者、回收策略、卷綁定模式等。集群可以有多個StorageClass,但只能有一個默認StorageClass。
3.4.3 ConfigMap和Secret管理命令
# 查看ConfigMap kubectl get configmaps -A kubectl get cm -n production # 簡寫形式 # 創建ConfigMap(從文字) kubectl create configmap app-config --from-literal=database.host=mysql.prod --from-literal=database.port=3306 # 創建ConfigMap(從文件) kubectl create configmap nginx-config --from-file=nginx.conf # 創建ConfigMap(從目錄) kubectl create configmap app-configs --from-file=./configs/ # 查看ConfigMap內容 kubectl get configmap app-config -o yaml kubectl describe configmap app-config -n production # 編輯ConfigMap kubectl edit configmap app-config -n production # 刪除ConfigMap kubectl delete configmap app-config -n production # 查看Secret kubectl get secrets -A kubectl get secret -n production # 創建Generic類型Secret kubectl create secret generic db-secret --from-literal=username=admin --from-literal=password=P@ssw0rd # 創建TLS類型Secret kubectl create secret tls tls-secret --cert=path/to/tls.crt --key=path/to/tls.key # 創建Docker Registry類型Secret kubectl create secret docker-registry regcred --docker-server=registry.example.com --docker-username=user --docker-password=password --docker-email=user@example.com # 查看Secret內容(Base64編碼) kubectl get secret db-secret -o yaml # 解碼Secret內容 kubectl get secret db-secret -o jsonpath='{.data.password}'| base64 -d # 刪除Secret kubectl delete secret db-secret -n production
說明:ConfigMap用于存儲非敏感配置數據,Secret用于存儲敏感信息(密碼、Token、證書等)。Secret數據以Base64編碼存儲,但并非加密,生產環境建議使用外部密鑰管理系統(如Vault、Sealed Secrets)。
3.5 高級命令和技巧(30+)
3.5.1 資源查詢和過濾命令
# 使用Label Selector查詢 kubectl get pods -l app=nginx kubectl get pods -l'env in (prod,staging)' kubectl get pods -l app=nginx,tier=frontend # 使用Field Selector查詢 kubectl get pods --field-selector status.phase=Running kubectl get pods --field-selector metadata.namespace=production kubectl get events --field-selector involvedObject.kind=Pod # 查看所有命名空間的資源 kubectl get pods --all-namespaces kubectl get pods -A # 簡寫形式 # 按時間排序 kubectl get pods --sort-by=.metadata.creationTimestamp kubectl get pods --sort-by=.status.startTime # 自定義列輸出 kubectl get pods -o custom-columns=NAME:.metadata.name,STATUS:.status.phase,NODE:.spec.nodeName,IP:.status.podIP # 查看資源的特定字段 kubectl get nodes -o jsonpath='{.items[*].status.addresses[?(@.type=="InternalIP")].address}' # 查看Pod的容器鏡像 kubectl get pods -o jsonpath='{range .items[*]}{.metadata.name}{" "}{.spec.containers[*].image}{" "}{end}'
說明:Label Selector和Field Selector是資源過濾的核心機制。JSONPath提供了強大的數據提取能力,適用于自動化腳本和數據分析場景。
3.5.2 資源管理和調試命令
# 查看資源定義(Dry Run) kubectl create deployment nginx --image=nginx --dry-run=client -o yaml # 應用資源配置 kubectl apply -f deployment.yaml kubectl apply -f ./manifests/ # 應用目錄下所有YAML文件 # 聲明式管理(記錄變更歷史) kubectl apply -f deployment.yaml --record # 查看資源變更差異 kubectl diff -f deployment.yaml # 替換資源(強制更新) kubectl replace -f deployment.yaml --force # 修補資源(Patch) kubectl patch deployment nginx -p'{"spec":{"replicas":5}}' kubectl patch deployment nginx --type='json'-p='[{"op":"replace","path":"/spec/replicas","value":5}]' # 實時監控資源變化 kubectl get pods -w kubectl get events -w # 查看資源使用的API版本 kubectl explain pod kubectl explain deployment.spec.strategy
說明:apply是聲明式管理的推薦方式,支持增量更新。patch用于局部修改資源,支持strategic、merge、json三種策略。--dry-run=client可以預覽資源定義而不實際創建。
3.5.3 事件和調試命令
# 查看集群事件 kubectl get events -A kubectl get events --sort-by=.metadata.creationTimestamp # 查看特定資源的事件 kubectl get events --field-selector involvedObject.name=nginx-pod # 查看最近的事件 kubectl get events --sort-by='.lastTimestamp'| tail -20 # 使用kubectl debug調試Pod(需要Kubernetes 1.23+) kubectl debug nginx-pod -it --image=busybox --target=nginx-container # 創建調試副本Pod kubectl debug nginx-pod -it --copy-to=nginx-debug --container=debugger --image=busybox
說明:Events是故障排查的重要信息源,記錄了資源的狀態變化和異常情況。kubectl debug是Kubernetes 1.23+引入的新特性,提供了更便捷的Pod調試能力。
四、最佳實踐和注意事項
4.1 最佳實踐
4.1.1 性能優化
使用資源限制和請求:為所有Pod設置合理的resources.requests和resources.limits,避免資源爭搶
# 查看未設置資源限制的Pod kubectl get pods -A -o json | jq'.items[] | select(.spec.containers[].resources.limits == null) | .metadata.name'
啟用HPA自動擴縮容:根據CPU/內存使用率自動調整副本數
kubectl autoscale deployment nginx --min=3 --max=10 --cpu-percent=70
使用親和性和反親和性:優化Pod調度分布,提高可用性
Pod反親和性:確保同一應用的Pod分散在不同節點
節點親和性:將Pod調度到特定類型的節點(如SSD節點)
優化鏡像拉取策略:使用imagePullPolicy: IfNotPresent減少鏡像拉取時間
# 查看Pod的鏡像拉取策略 kubectl get pods -o jsonpath='{range .items[*]}{.metadata.name}{" "}{.spec.containers[*].imagePullPolicy}{" "}{end}'
4.1.2 安全加固
最小權限原則:避免使用cluster-admin角色,為每個應用創建專用ServiceAccount
# 檢查使用cluster-admin的綁定 kubectl get clusterrolebindings -o json | jq'.items[] | select(.roleRef.name=="cluster-admin") | .metadata.name'
啟用Pod安全策略:限制特權容器、主機網絡、主機路徑掛載等高危操作
# 查看以特權模式運行的Pod kubectl get pods -A -o json | jq'.items[] | select(.spec.containers[].securityContext.privileged==true) | .metadata.name'
使用NetworkPolicy隔離網絡:實現命名空間級別的網絡隔離
# 檢查是否配置了網絡策略 kubectl get networkpolicies -A
定期輪換Secret和證書:避免使用長期有效的憑證
# 查看Secret的創建時間 kubectl get secrets -A -o json | jq'.items[] | {name: .metadata.name, age: .metadata.creationTimestamp}'
4.1.3 高可用配置
配置PodDisruptionBudget:保證滾動更新和節點維護時的最小可用副本數
# 創建PDB kubectl create pdb nginx-pdb --selector=app=nginx --min-available=2 # 查看PDB狀態 kubectl get pdb -A
使用多副本部署:生產環境至少3個副本,跨多個可用區部署
配置健康檢查:設置livenessProbe和readinessProbe確保服務可用性
# 查看未配置健康檢查的Pod kubectl get pods -A -o json | jq'.items[] | select(.spec.containers[].livenessProbe == null) | .metadata.name'
4.2 注意事項
4.2.1 配置注意事項
警告:以下操作可能導致服務中斷或數據丟失,操作前務必做好備份和驗證。
刪除命名空間前確認:刪除命名空間會級聯刪除所有資源,無法恢復
# 刪除前先查看命名空間下的所有資源 kubectl get all -n namespace-name
謹慎使用強制刪除:--force --grace-period=0可能導致數據不一致
# 僅在Pod長時間處于Terminating狀態時使用 kubectl delete pod stuck-pod --force --grace-period=0
生產環境禁用--insecure-skip-tls-verify:會導致中間人攻擊風險
注意資源配額限制:超出配額會導致Pod無法創建
# 檢查命名空間配額使用情況 kubectl describe quota -n production
4.2.2 常見錯誤
錯誤現象 原因分析 解決方案 ImagePullBackOff 鏡像不存在或無權限拉取 檢查鏡像名稱、標簽和imagePullSecrets配置 CrashLoopBackOff 容器啟動后立即退出 查看日志排查應用錯誤,檢查啟動命令和健康檢查配置 Pending狀態 資源不足或調度失敗 檢查節點資源、污點容忍、親和性配置 OOMKilled 內存超限被殺死 增加內存限制或優化應用內存使用 Evicted 節點資源壓力導致驅逐 檢查節點磁盤和內存使用,調整資源配置 五、故障排查和監控
5.1 故障排查
5.1.1 日志查看
# 查看Pod日志(最近100行) kubectl logs nginx-pod --tail=100 -n production # 查看最近1小時的日志 kubectl logs nginx-pod --since=1h -n production # 實時查看日志 kubectl logs -f nginx-pod -n production # 查看所有容器日志(多容器Pod) kubectl logs nginx-pod --all-containers=true-n production # 查看崩潰前的日志 kubectl logs nginx-pod --previous -n production # 導出日志到文件 kubectl logs nginx-pod -n production > pod.log
5.1.2 常見問題排查
問題一:Pod一直處于Pending狀態
# 查看Pod詳情和事件 kubectl describe pod nginx-pod -n production # 檢查節點資源 kubectl top nodes # 查看調度失敗原因 kubectl get events --field-selector involvedObject.name=nginx-pod -n production
解決方案:
檢查節點是否有足夠資源(CPU、內存)
檢查Pod的nodeSelector、親和性、污點容忍配置
確認PVC是否成功綁定
問題二:Service無法訪問
# 檢查Service配置 kubectl describe service nginx-svc -n production # 檢查Endpoints是否正常 kubectl get endpoints nginx-svc -n production # 測試Service連通性 kubectl runtest-pod --image=busybox --rm -it -- wget -O- http://nginx-svc.production.svc.cluster.local
解決方案:
確認Service的selector與Pod標簽匹配
檢查Pod是否處于Ready狀態
驗證網絡策略是否阻止了流量
問題三:PVC無法綁定
癥狀:PVC一直處于Pending狀態
排查:檢查StorageClass是否存在,PV容量是否滿足要求
解決:創建匹配的PV或調整PVC的存儲請求大小
5.2 性能監控
5.2.1 關鍵指標監控
# 查看節點資源使用 kubectl top nodes # 查看Pod資源使用 kubectl top pods -A --sort-by=cpu kubectl top pods -A --sort-by=memory # 查看容器資源使用 kubectl top pod nginx-pod --containers -n production # 查看集群資源分配情況 kubectl describe nodes | grep -A 5"Allocated resources"
5.2.2 監控指標說明
指標名稱 正常范圍 告警閾值 說明 CPU使用率 <70% >85% 持續高CPU可能導致性能下降 內存使用 <80% >90% 接近限制可能觸發OOM Pod重啟次數 0 >5次/小時 頻繁重啟表明應用不穩定 磁盤使用率 <80% >85% 磁盤滿會導致Pod驅逐 六、總結
6.1 技術要點回顧
kubectl基礎配置:掌握kubeconfig管理、context切換、命令行補全等基礎技能
資源管理命令:熟練使用200+命令管理集群、工作負載、網絡、存儲等各類資源
故障排查技巧:掌握日志查看、事件分析、調試工具等故障診斷方法
最佳實踐:遵循安全加固、性能優化、高可用配置等生產環境最佳實踐
6.2 進階學習方向
Kubernetes高級特性:深入學習Operator、CRD、Admission Webhook等擴展機制
學習資源:Kubernetes官方文檔、《Kubernetes Operators》
實踐建議:嘗試開發自定義Operator,實現業務自動化
云原生生態工具:掌握Helm、Kustomize、ArgoCD等配置管理和GitOps工具
學習資源:CNCF項目文檔、云原生社區
實踐建議:構建完整的CI/CD流水線,實現自動化部署
可觀測性體系:建立Prometheus+Grafana+Loki+Jaeger完整監控體系
學習資源:Prometheus官方文檔、Grafana教程
實踐建議:搭建生產級監控告警系統
6.3 參考資料
Kubernetes官方文檔- 最權威的Kubernetes學習資源
kubectl命令參考- kubectl完整命令手冊
Kubernetes GitHub倉庫- 源碼和Issue追蹤
CNCF云原生社區- 云原生技術生態和最佳實踐
Kubernetes中文社區- 中文學習資源和技術交流
附錄
A. 命令速查表
# 資源簡寫對照 po # pods svc # services deploy# deployments rs # replicasets ds # daemonsets sts # statefulsets cm # configmaps ns # namespaces pv # persistentvolumes pvc # persistentvolumeclaims sa # serviceaccounts ing # ingresses netpol# networkpolicies # 常用命令組合 kubectl get pods -A -o wide --sort-by=.metadata.creationTimestamp # 查看所有Pod并按創建時間排序 kubectl get events --sort-by='.lastTimestamp'-A # 查看所有事件按時間排序 kubectl top pods -A --sort-by=cpu # 查看Pod CPU使用率排序 kubectl get pods -o jsonpath='{range .items[*]}{.metadata.name}{" "}{.status.phase}{" "}{end}'# 自定義輸出格式
B. 配置參數詳解
資源限制參數:
requests.cpu: CPU請求量,調度時保證的最小CPU資源(如100m表示0.1核)
requests.memory: 內存請求量,調度時保證的最小內存資源(如256Mi)
limits.cpu: CPU限制量,容器可使用的最大CPU資源
limits.memory: 內存限制量,超出會觸發OOM Kill
健康檢查參數:
initialDelaySeconds: 容器啟動后首次探測延遲時間
periodSeconds: 探測間隔時間
timeoutSeconds: 探測超時時間
successThreshold: 連續成功次數閾值
failureThreshold: 連續失敗次數閾值
C. 術語表
術語 英文 解釋 命名空間 Namespace Kubernetes中的邏輯隔離單元,用于多租戶環境 工作負載 Workload 在Kubernetes上運行的應用程序,包括Deployment、StatefulSet等 服務發現 Service Discovery 通過Service資源實現的Pod間通信機制 持久化卷 Persistent Volume 集群級別的存儲資源,獨立于Pod生命周期 標簽選擇器 Label Selector 通過標簽篩選資源的機制 污點容忍 Taint/Toleration 控制Pod調度到特定節點的機制 親和性 Affinity Pod或節點間的調度偏好規則 滾動更新 Rolling Update 逐步替換Pod實現零停機更新 水平擴縮容 HPA 根據指標自動調整Pod副本數 準入控制 Admission Control API請求的驗證和變更機制
-
集群
+關注
關注
0文章
149瀏覽量
17684 -
命令
+關注
關注
5文章
758瀏覽量
23894 -
kubernetes
+關注
關注
0文章
273瀏覽量
9523
原文標題:kubectl命令實戰寶典:Kubernetes集群管理與故障排查200+命令
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
Kubernetes kubectl命令行工具詳解
評論