1. kubectl 基础概述
作为 Kubernetes 集群管理的瑞士军刀,kubectl 是与 API Server 交互的核心命令行工具。我每天平均要执行上百次 kubectl 命令,这些命令就像老朋友的暗号,能快速获取集群状态、排查问题。对于刚接触 Kubernetes 的工程师,掌握这些命令相当于拿到了打开容器世界的钥匙。
kubectl 命令遵循标准的 CLI 模式:kubectl [command] [TYPE] [NAME] [flags]。其中 command 包括 create/get/describe/delete 等操作动词,TYPE 指资源类型(如 pod/deployment/service),NAME 是具体的资源名称。这种结构设计让命令组合变得非常灵活,比如 kubectl get pods -n kube-system 可以查看系统命名空间下的所有 Pod。
重要提示:生产环境执行删除操作前务必先使用
--dry-run=client参数模拟执行,避免误操作。我就曾因忘记这个参数导致整个测试环境被清空,花了半天时间重建。
2. 集群状态探查命令
2.1 资源查看三板斧
get 是最常用的探查命令,配合不同资源类型和输出格式能应对各种场景:
bash复制# 查看默认命名空间的 Pod(简写 po)
kubectl get pods
# 查看所有命名空间的 Deployment(简写 deploy)
kubectl get deployments -A
# 以宽格式显示更多字段
kubectl get pods -o wide
# 显示完整的资源定义(适合调试)
kubectl get pod nginx-7cd4f6d4f9-2h5wp -o yaml
describe 命令相当于资源的体检报告,能显示详细的事件日志和配置:
bash复制# 查看 Pod 的详细状态和事件
kubectl describe pod/nginx
# 排查 Service 的端点问题
kubectl describe svc/nginx-service
logs 是排查应用问题的首选工具,几个实用技巧:
bash复制# 查看单个容器日志(-c 指定容器名)
kubectl logs nginx-pod -c nginx-container
# 实时跟踪日志(类似 tail -f)
kubectl logs -f deployment/nginx
# 显示最近1小时的日志
kubectl logs --since=1h pod/nginx
2.2 高级查询技巧
通过字段选择器和标签筛选可以精准定位资源:
bash复制# 查找所有运行失败的 Pod
kubectl get pods --field-selector=status.phase=Failed
# 筛选带有 app=nginx 标签的 Pod
kubectl get pods -l app=nginx
# 显示各节点的资源分配情况
kubectl top nodes
# 查看 Pod 的资源使用量
kubectl top pods
3. 资源管理操作
3.1 创建与更新资源
从 YAML 文件创建资源是最规范的做法:
bash复制# 创建 Deployment
kubectl create -f nginx-deployment.yaml
# 先验证 YAML 语法再应用
kubectl apply --validate=true --dry-run=client -f config.yaml
apply 命令是声明式管理的核心,它会自动计算差异并应用变更:
bash复制# 应用配置变更(记录版本号便于回滚)
kubectl apply -f deployment.yaml --record
# 查看变更历史
kubectl rollout history deployment/nginx
# 回滚到上一个版本
kubectl rollout undo deployment/nginx
3.2 调试与维护命令
exec 命令相当于进入容器的 SSH:
bash复制# 在 Pod 的容器中执行命令
kubectl exec -it nginx-pod -- /bin/bash
# 在特定容器中启动调试会话
kubectl exec -it pod/mypod -c debug-container -- sh
port-forward 是本地调试的神器:
bash复制# 将本地 8080 转发到 Pod 的 80 端口
kubectl port-forward pod/nginx 8080:80
# 转发到 Service
kubectl port-forward svc/nginx-service 8080:80
4. 故障排查实战技巧
4.1 问题诊断命令组合
当 Pod 处于 CrashLoopBackOff 状态时,我常用的排查流程:
bash复制# 1. 查看 Pod 状态
kubectl get pods -o wide
# 2. 检查详细事件
kubectl describe pod/problem-pod
# 3. 查看崩溃容器的日志
kubectl logs pod/problem-pod --previous
# 4. 进入容器检查环境
kubectl exec -it pod/problem-pod -- sh
4.2 高级调试工具
kubectl debug 是 Kubernetes 1.20+ 引入的调试利器:
bash复制# 创建临时调试容器(共享进程命名空间)
kubectl debug -it pod/nginx --image=busybox --target=nginx
# 使用 Ephemeral 容器调试
kubectl debug --attach -it pod/nginx --image=ubuntu --container=debugger
5. 实用配置技巧
5.1 命令别名与自动补全
在 ~/.bashrc 中添加这些配置能提升效率:
bash复制# 常用别名
alias k='kubectl'
alias kgp='kubectl get pods'
alias kaf='kubectl apply -f'
# 自动补全设置
source <(kubectl completion bash)
complete -F __start_kubectl k
5.2 kubeconfig 多集群管理
bash复制# 查看当前上下文
kubectl config current-context
# 切换集群上下文
kubectl config use-context prod-cluster
# 合并多个 kubeconfig 文件
KUBECONFIG=~/.kube/config:~/.kube/prod-config kubectl config view --flatten > merged-config
6. 生产环境注意事项
-
慎用 force delete:直接删除卡在 Terminating 状态的资源可能导致孤儿对象
bash复制# 先尝试优雅删除 kubectl delete pod/nginx --grace-period=60 # 万不得已再强制删除 kubectl delete pod/nginx --force --grace-period=0 -
资源限额检查:使用
-o custom-columns自定义输出列bash复制kubectl get pods -o custom-columns="NAME:.metadata.name,CPU_REQ:.spec.containers[*].resources.requests.cpu,MEM_REQ:.spec.containers[*].resources.requests.memory" -
批量操作防护:通过
--chunk-size控制大规模集群的查询量bash复制
kubectl get pods --chunk-size=500
我习惯在桌面便签上记录这些常用命令组合,毕竟再熟练的工程师也难免会突然忘记某个参数。特别是在凌晨处理线上故障时,这些肌肉记忆般的命令能节省宝贵的排查时间。