kubectl 命令详解
更新时间:2026-08-28。本文是「一个命令一个文档」系列,聚焦
kubectl——容器与云原生命令族(见容器与云原生命令族)。它是操作 Kubernetes 集群的唯一标准客户端。
kubectl 是 Kubernetes(K8s,容器编排系统,自动调度和管理容器集群)的命令行前端。K8s 把 docker 容器再包一层:用 Pod(最小调度单位,含一个或多个容器)、Deployment(保证副本数)、Service(稳定访问入口)等"资源"来描述期望状态,kubectl 就是声明和查询这些资源的工具。
一、核心资源与查看
kubectl get pods # 看所有 pod
kubectl get pods -n prod # 指定命名空间
kubectl get deploy,svc # 看 deployment 和 service
kubectl describe pod my-pod # 看详情(事件、状态、原因)——排障首选
kubectl logs my-pod # 看 pod 日志
kubectl logs my-pod -c sidecar # 多容器 pod 指定容器
get看列表、describe看细节(尤其是底部的 Events,记录调度失败、拉镜像超时等)、logs看应用输出——这是 K8s 排障的铁三角。-n指定命名空间别忘了,默认在default,看不着别的 ns 的资源。describe的 Events 经常直接告诉你"镜像拉不下来""节点资源不够",比瞎猜强。
二、进容器与端口转发
kubectl exec -it my-pod -- sh # 进 pod 开 shell
kubectl port-forward my-pod 8080:80 # 把本地 8080 转到 pod 80,本地调试用
kubectl cp my-pod:/var/log/app.log ./ # pod 与本地互拷文件
kubectl exec和docker exec类似,但注意--分隔 kubectl 参数和容器命令。port-forward很实用:pod 没暴露公网时,本地localhost:8080就能访问它,调试接口不用改服务暴露方式。
三、声明式部署:apply
kubectl apply -f deploy.yaml # 按 yaml 声明期望状态(创建或更新)
kubectl create -f deploy.yaml # 仅创建(已存在会报错)
kubectl delete -f deploy.yaml # 删除
kubectl get all -n prod # 看该 ns 下所有资源
apply是"声明式"——你描述"我要 3 个副本",K8s 自己想办法达成;重复apply同一文件是安全的幂等操作。create是"命令式"一次性建。日常一律用apply,便于版本管理和回滚。
四、滚动更新与回滚
kubectl set image deploy/myapp app=myapp:v2 # 改镜像触发滚动更新
kubectl rollout status deploy/myapp # 看更新进度
kubectl rollout undo deploy/myapp # 回滚到上一版
kubectl rollout history deploy/myapp # 看历史版本改 Deployment 的镜像,K8s 会逐个用新 pod 替换旧 pod(滚动更新,不中断服务)。出问题
rollout undo一键回滚——这是 K8s 对比裸 docker 最大的便利之一。发布前记得rollout history确认有可回退的版本。
五、上下文与集群切换
kubectl config get-contexts # 看有哪些集群上下文
kubectl config use-context prod-cluster # 切到生产集群(小心!)
kubectl config current-context # 当前在哪本地可能配了多个集群(开发/生产),
use-context切错集群、对着生产误操作是真实事故来源。动手前先current-context确认自己在哪,kubectl没有"你确定吗"的二次确认。
六、实战:pod 一直 CrashLoopBackOff
kubectl get pods -n prod # 看状态:CrashLoopBackOff
kubectl describe pod xxx -n prod # Events 看拉镜像/启动失败原因
kubectl logs xxx -n prod --previous # 看上一次崩溃的日志(--previous)CrashLoopBackOff 是容器起来就挂、K8s 反复重启。先 describe 看 Events(资源不足?探针失败?),再 logs --previous 看上一次为什么崩(配置错?依赖没连上?)。多数情况是应用启动报错,和 K8s 本身无关。底层调度与 cgroup 限制见 进程原理。
一句话总结
kubectl = K8s 集群客户端:get/describe/logs 三件套排障(Events 直指原因)、exec/port-forward/cp 进容器与转发、apply 声明式部署(幂等可回滚)、rollout undo 一键回退、config use-context 切集群务必先确认;先 current-context 防误操作生产。它是云原生运维的主操作台。