作为 Kubernetes 集群管理的瑞士军刀,kubectl 是每个云原生工程师的必备工具。经过多年在生产环境的摸爬滚打,我整理了这份覆盖日常运维全场景的 kubectl 命令手册,包含大量官方文档未提及的实战技巧和避坑指南。
在实际企业环境中,我们通常需要同时管理多个 Kubernetes 集群。kubectl 通过 kubeconfig 文件实现多集群切换,这是每个工程师必须掌握的核心技能。
bash复制# 查看当前使用的上下文(当前连接的集群)
kubectl config current-context
# 列出所有可用上下文
kubectl config get-contexts
# 切换上下文到生产集群
kubectl config use-context prod-cluster
# 设置默认命名空间(避免每次输入-n参数)
kubectl config set-context --current --namespace=production
经验分享:建议为不同环境创建别名,如
alias kprod='kubectl config use-context prod-cluster',可以大幅提高工作效率。
熟练使用自动补全可以提升至少 30% 的操作效率。以下是针对不同 shell 的配置方法:
bash复制# Bash 自动补全
source <(kubectl completion bash)
echo 'source <(kubectl completion bash)' >> ~/.bashrc
# Zsh 自动补全
source <(kubectl completion zsh)
echo 'source <(kubectl completion zsh)' >> ~/.zshrc
# 设置常用别名
alias k=kubectl
complete -o default -F __start_kubectl k # 为别名也启用补全
kubectl 支持多种输出格式,根据场景选择合适的形式可以更高效地获取信息:
bash复制# 宽格式输出(显示更多列信息)
kubectl get pods -o wide
# 查看完整的资源定义(用于排查配置问题)
kubectl get pod nginx -o yaml
# 自定义列输出(只显示关键信息)
kubectl get pods -o custom-columns=NAME:.metadata.name,STATUS:.status.phase,NODE:.spec.nodeName
# JSONPath 提取特定字段(适合脚本处理)
kubectl get pods -o jsonpath='{.items[*].metadata.name}'
bash复制# 查看集群基本信息
kubectl cluster-info
# 查看所有 API 资源类型及其缩写
kubectl api-resources
# 查看 Pod 资源的字段说明(排查 YAML 配置必备)
kubectl explain pod
kubectl explain pod.spec.containers --recursive
节点维护是运维常见场景,正确的操作顺序可以避免服务中断:
bash复制# 标记节点为不可调度(准备维护)
kubectl cordon worker-node-1
# 安全驱逐节点上的 Pod(--ignore-daemonsets 忽略 DaemonSet)
kubectl drain worker-node-1 --ignore-daemonsets --delete-emptydir-data
# 维护完成后恢复节点
kubectl uncordon worker-node-1
注意事项:执行 drain 前务必确认 Pod 有多个副本或能够容忍中断,否则可能导致服务不可用。
bash复制# 查看节点资源分配情况
kubectl describe node worker-node-1 | grep -A 10 "Allocated resources"
# 查看命名空间资源配额
kubectl describe resourcequota -n production
# 查看资源使用排行(需安装 metrics-server)
kubectl top pods --all-namespaces --sort-by=cpu
kubectl top pods --all-namespaces --sort-by=memory
bash复制# 应用/更新资源配置(推荐方式)
kubectl apply -f deployment.yaml
# 查看部署状态
kubectl rollout status deployment/nginx
# 生成部署模板(不实际执行)
kubectl create deployment nginx --image=nginx:1.25 --dry-run=client -o yaml > deploy.yaml
bash复制# 更新镜像版本
kubectl set image deployment/nginx nginx=nginx:1.25
# 查看更新历史
kubectl rollout history deployment/nginx
# 回滚到上一个版本
kubectl rollout undo deployment/nginx
# 回滚到特定版本
kubectl rollout undo deployment/nginx --to-revision=2
bash复制# 手动调整副本数
kubectl scale deployment/nginx --replicas=5
# 创建自动扩缩容策略
kubectl autoscale deployment/nginx --min=2 --max=10 --cpu-percent=70
# 查看 HPA 状态
kubectl get hpa
kubectl describe hpa nginx
bash复制# 1. 查看 Pod 状态
kubectl get pod faulty-pod -o wide
# 2. 查看详细事件
kubectl describe pod faulty-pod
# 3. 查看容器日志
kubectl logs faulty-pod
kubectl logs faulty-pod --previous # 查看崩溃前的日志
# 4. 进入容器调试
kubectl exec -it faulty-pod -- /bin/sh
bash复制# 创建临时调试 Pod
kubectl run debug --image=busybox --rm -it --restart=Never -- sh
# 在容器内测试服务连通性
nslookup my-service.default.svc.cluster.local
wget -qO- http://my-service:8080
# 本地端口转发(调试服务)
kubectl port-forward svc/my-service 8080:80
bash复制# 查看节点资源使用
kubectl top nodes
# 查看 Pod 资源使用
kubectl top pods
# 查看 Pod 内各容器资源使用
kubectl top pods --containers
# 查看资源分配情况
kubectl describe node | grep -A 10 "Allocated resources"
bash复制# 批量删除 Evicted 状态的 Pod
kubectl get pods -A --field-selector status.phase=Failed -o json | kubectl delete -f -
# 重启命名空间下所有 Deployment
kubectl get deployments -n production -o name | xargs -I {} kubectl rollout restart {} -n production
# 批量添加标签
kubectl label pods --all env=production
bash复制# 修改 Deployment 副本数
kubectl patch deployment nginx -p '{"spec":{"replicas":3}}'
# 使用 JSON Patch 修改镜像
kubectl patch deployment nginx --type=json -p='[{"op":"replace","path":"/spec/template/spec/containers/0/image","value":"nginx:1.25"}]'
bash复制# krew 插件管理器安装
(
set -x; cd "$(mktemp -d)" &&
OS="$(uname | tr '[:upper:]' '[:lower:]')" &&
ARCH="$(uname -m | sed -e 's/x86_64/amd64/' -e 's/\(arm\)\(64\)\?.*/\1\2/' -e 's/aarch64$/arm64/')" &&
KREW="krew-${OS}_${ARCH}" &&
curl -fsSLO "https://github.com/kubernetes-sigs/krew/releases/latest/download/${KREW}.tar.gz" &&
tar zxvf "${KREW}.tar.gz" &&
./"${KREW}" install krew
)
# 安装常用插件
kubectl krew install neat # 清理 YAML 输出
kubectl krew install tree # 资源依赖关系树
kubectl krew install who-can # 权限检查
在实际运维中,有几个关键点需要特别注意:
资源限制:务必为 Pod 设置合理的 requests 和 limits,避免资源争抢导致节点不稳定
就绪探针:所有服务都应配置就绪探针,确保流量只转发到真正准备好的 Pod
滚动更新策略:根据业务特点配置适当的 maxUnavailable 和 maxSurge 参数
Pod 中断预算:使用 PDB 确保关键服务在维护期间保持最小可用副本数
日志收集:建立集中式日志收集系统,避免依赖 kubectl logs 查看历史日志
这份手册涵盖了 kubectl 90% 的日常使用场景,建议收藏备用。随着 Kubernetes 版本更新,部分命令可能会有变化,建议定期查看官方文档获取最新信息。