文章背景图

kubectl 常用命令手册:查询、日志、发布、回滚与排障

2026-07-25
4
-
- 分钟

kubectl 是操作 Kubernetes API 的主要命令行工具。真正高效的用法,不是背下所有子命令,而是掌握“先确认上下文、再查询状态、然后缩小范围、最后执行变更”的固定流程。

这篇文章合并整理了两份旧命令笔记,并删除了已经弃用或依赖旧 Docker 运行时的做法。

一、先确认当前集群和上下文

任何变更前,先确认 kubectl 正在操作哪个集群:

kubectl config current-context

kubectl config get-contexts

kubectl cluster-info

切换上下文:

kubectl config use-context <CONTEXT_NAME>

查看命名空间:

kubectl get namespace

命令中明确指定命名空间:

kubectl get pod -n <NAMESPACE>

生产环境最常见的误操作之一,就是上下文或命名空间选错。执行删除、扩容、回滚前应再次确认。

二、发现集群支持的资源

查看 API 资源及其简称、是否属于命名空间:

kubectl api-resources

查看支持的 API 版本:

kubectl api-versions

查看资源字段结构:

kubectl explain deployment

kubectl explain deployment.spec.template.spec.containers

旧笔记里的 kubectl get cs 使用 ComponentStatus API,该 API 很早就已弃用。控制面健康检查应结合 API Server readyz、组件监控和实际工作负载状态:

kubectl get --raw='/readyz?verbose'

三、查询资源

查看当前命名空间的 Pod:

kubectl get pods

kubectl get pods -o wide

查看所有命名空间:

kubectl get pods -A

按标签筛选:

kubectl get pods -l app=web

同时查看多种资源:

kubectl get deployment,service,pod

持续观察状态变化:

kubectl get pods -w

查看某个对象的详细信息和事件:

kubectl describe pod <POD_NAME>

kubectl describe deployment <DEPLOYMENT_NAME>

查看近期事件:

kubectl get events --sort-by=.metadata.creationTimestamp

get 适合看列表和概要,describe 适合看配置、状态、调度结果及事件。

四、查看容器日志

查看 Pod 日志:

kubectl logs <POD_NAME>

持续跟踪:

kubectl logs -f <POD_NAME>

多容器 Pod 指定容器:

kubectl logs <POD_NAME> -c <CONTAINER_NAME>

查看上一次已退出容器的日志:

kubectl logs <POD_NAME> -c <CONTAINER_NAME> --previous

只看最近一段时间:

kubectl logs <POD_NAME> --since=30m

也可以按控制器查看日志:

kubectl logs deployment/<DEPLOYMENT_NAME> --all-pods=true

旧笔记把日志路径固定为 /var/lib/docker/containers。现代集群可能使用 containerd、CRI-O 或其他 CRI 运行时,底层路径不应写死。应用排障优先使用 kubectl logs;节点级问题再结合 journalctl、crictl 和具体运行时文档。

五、进入容器执行命令

打开交互式 Shell:

kubectl exec -it <POD_NAME> -- sh

指定容器:

kubectl exec -it <POD_NAME> -c <CONTAINER_NAME> -- sh

执行单条命令:

kubectl exec <POD_NAME> -- env

有些精简镜像没有 bash、curl 甚至 sh。不要为了排障临时修改生产镜像,可以评估使用 kubectl debug 创建临时调试容器:

kubectl debug -it <POD_NAME> --image=<DEBUG_IMAGE>

调试镜像同样应来自可信仓库,并受安全策略约束。

六、声明式创建和更新

上线前先校验:

kubectl apply --dry-run=server --validate=strict -f app.yaml

查看差异:

kubectl diff -f app.yaml

应用清单:

kubectl apply -f app.yaml

查看最终对象:

kubectl get deployment <NAME> -o yaml

推荐把 YAML 存入版本控制并通过 apply 管理。kubectl create -f 适合首次创建,但持续维护时应保持统一的对象管理方式,避免多套工具同时覆盖字段。

七、Deployment 发布与回滚

修改镜像:

kubectl set image deployment/web web=<IMAGE>:<TAG>

等待发布完成:

kubectl rollout status deployment/web

查看发布历史:

kubectl rollout history deployment/web

查看指定修订版本:

kubectl rollout history deployment/web --revision=<REVISION>

回滚到上一版:

kubectl rollout undo deployment/web

回滚到指定版本:

kubectl rollout undo deployment/web --to-revision=<REVISION>

触发滚动重启:

kubectl rollout restart deployment/web

旧命令中的 --record 已经不适合作为现代发布记录方案。更可靠的做法是使用 Git 提交、镜像摘要、CI/CD 记录和变更审计来追踪发布来源。

八、扩缩容与暂停发布

扩容到 5 个副本:

kubectl scale deployment/web --replicas=5

查看副本状态:

kubectl get deployment web

kubectl get replicaset -l app=web

暂停和恢复 Deployment 发布:

kubectl rollout pause deployment/web

kubectl rollout resume deployment/web

手工 scale 可能被 HorizontalPodAutoscaler 再次调整。如果资源启用了自动扩缩容,应先理解 HPA 的期望状态,避免两套控制逻辑互相覆盖。

九、临时访问应用

把 Deployment 暴露为 Service:

kubectl expose deployment web --port=80 --target-port=8080

本地临时端口转发:

kubectl port-forward service/web 8080:80

随后访问:

curl http://127.0.0.1:8080/

直接访问 Pod IP 通常只适合在集群网络内排查。面向用户的稳定入口应该通过 Service、Ingress、Gateway 或负载均衡器提供。

十、检查权限

确认当前身份:

kubectl auth whoami

检查自己能否执行某项操作:

kubectl auth can-i delete pods -n production

检查某个用户或服务账号权限:

kubectl auth can-i list secrets \

--as=system:serviceaccount:<NAMESPACE>:<SERVICE_ACCOUNT> \

-n <NAMESPACE>

排查 Forbidden 时,不要第一时间授予 cluster-admin。先确认身份、命名空间、Role、ClusterRole 和绑定关系,并遵循最小权限原则。

十一、常见故障的查询顺序

Pod 启动失败时,可以按下面顺序检查:

1. kubectl get pod -o wide

2. kubectl describe pod <POD_NAME>

3. kubectl logs <POD_NAME> --all-containers=true

4. kubectl logs <POD_NAME> --previous

5. kubectl get events --sort-by=.metadata.creationTimestamp

6. kubectl get pvc、service、endpointslice 等依赖资源

7. 必要时检查节点、kubelet、容器运行时和 CNI

如果 Pod 一直 Pending,重点看调度事件、资源请求、污点与容忍、节点选择、PVC 和拓扑限制。

如果处于 CrashLoopBackOff,重点看当前与 previous 日志、启动命令、配置、Secret、探针和依赖服务。

如果 Service 无流量,检查 selector 是否匹配 Pod 标签,以及 EndpointSlice 是否存在:

kubectl get service <SERVICE_NAME> -o yaml

kubectl get endpointslice -l kubernetes.io/service-name=<SERVICE_NAME>

十二、删除操作要谨慎

删除清单中的资源:

kubectl delete -f app.yaml

按名称删除:

kubectl delete deployment web

不要在未确认上下文、命名空间、标签范围和回收策略时批量删除。特别要注意 StatefulSet、PVC、Namespace、CRD 和带级联关系的资源;删除对象可能同时影响后端数据或大量从属资源。

总结

kubectl 的核心工作流可以概括为:确认上下文 → 查询资源 → describe 与 logs 缩小范围 → diff 和 dry-run 预览变更 → apply 执行 → rollout 与事件验证结果。把这套顺序养成习惯,比单纯收集大量命令更有价值。

参考资料:

https://kubernetes.io/docs/reference/kubectl/quick-reference/

https://kubernetes.io/docs/reference/kubectl/generated/

https://kubernetes.io/docs/reference/kubectl/generated/kubectl_rollout/

原创

kubectl 常用命令手册:查询、日志、发布、回滚与排障

本文链接: kubectl 常用命令手册:查询、日志、发布、回滚与排障

本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

评论交流

文章目录