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