kubectl 命令速查
本篇汇总日常运维和排障中最常用的 kubectl 命令,以表格为主、随手可查。每条命令只给最简用法示例,字段原理和详细讲解见各正篇章节。
文中 <pod-name>、<deploy-name> 这类尖括号包裹的内容都是占位符,使用时替换成实际的资源名。
集群与节点
集群信息与 API 发现
| 命令 | 作用 | 示例 |
|---|---|---|
kubectl cluster-info | 查看控制平面和核心组件地址 | kubectl cluster-info |
kubectl version | 查看客户端与服务器版本 | kubectl version |
kubectl api-resources | 列出集群支持的全部资源类型、简写和作用域 | kubectl api-resources |
kubectl api-versions | 列出集群支持的全部 API 版本 | kubectl api-versions |
kubectl explain | 查看资源字段的文档说明 | kubectl explain pod.spec.containers |
节点管理
| 命令 | 作用 | 示例 |
|---|---|---|
kubectl get nodes | 列出所有节点及状态 | kubectl get nodes -o wide |
kubectl describe node | 查看节点详情(容量、已分配资源、污点等) | kubectl describe node <node-name> |
kubectl top node | 查看节点 CPU/内存用量(需 metrics-server) | kubectl top node |
kubectl cordon | 标记节点不可调度,不驱逐已有 Pod | kubectl cordon <node-name> |
kubectl uncordon | 恢复节点可调度 | kubectl uncordon <node-name> |
kubectl drain | 驱逐节点上的 Pod 并标记不可调度,节点维护前使用 | kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-data |
drain 前先确认
drain 会驱逐节点上所有可驱逐的 Pod。DaemonSet 管理的 Pod 不受驱逐影响、但要加 --ignore-daemonsets 才能执行;使用了 emptyDir 的 Pod 需要 --delete-emptydir-data。维护完成后记得 uncordon,否则节点一直处于不可调度状态。
工作负载
查看与描述
| 命令 | 作用 | 示例 |
|---|---|---|
kubectl get | 列出资源,类型可用简写(po/deploy/svc/cm 等) | kubectl get pods -n default |
kubectl describe | 查看资源详情,末尾的 Events 是排障重点 | kubectl describe pod <pod-name> |
创建、修改与删除
| 命令 | 作用 | 示例 |
|---|---|---|
kubectl apply -f | 按 YAML 声明式创建或更新资源,日常首选 | kubectl apply -f deployment.yaml |
kubectl create | 命令式快速创建,适合临时测试 | kubectl create deployment nginx --image=nginx |
kubectl delete -f | 按 YAML 删除资源 | kubectl delete -f deployment.yaml |
kubectl delete | 按类型和名称删除 | kubectl delete pod <pod-name> |
kubectl edit | 用编辑器在线修改资源,保存即生效 | kubectl edit deployment <deploy-name> |
kubectl patch | 局部更新指定字段,适合脚本化修改 | kubectl patch deployment <deploy-name> -p '{"spec":{"replicas":3}}' |
kubectl scale | 调整副本数 | kubectl scale deployment <deploy-name> --replicas=5 |
delete Pod 不等于删除应用
直接 kubectl delete pod 删掉由 Deployment 管理的 Pod,控制器会立刻重建一个新 Pod。想真正停掉应用要删它的上级控制器(如 Deployment),或用 kubectl scale 把副本数缩到 0。
滚动发布与回滚
| 命令 | 作用 | 示例 |
|---|---|---|
kubectl rollout status | 查看发布进度,发布脚本里常用它等待完成 | kubectl rollout status deployment/<deploy-name> |
kubectl rollout history | 查看发布历史(每次更新的 revision) | kubectl rollout history deployment/<deploy-name> |
kubectl rollout undo | 回滚到上一版本,可加 --to-revision 指定版本 | kubectl rollout undo deployment/<deploy-name> |
kubectl rollout restart | 触发滚动重启,不改 YAML 也能让 Pod 重建 | kubectl rollout restart deployment/<deploy-name> |
kubectl rollout pause / resume | 暂停/恢复发布,暂停期间的改动不会触发滚动更新 | kubectl rollout pause deployment/<deploy-name> |
# 典型的发布-观察-回滚流程
kubectl set image deployment/web web=nginx:1.27 # 更新镜像触发滚动发布
kubectl rollout status deployment/web # 阻塞等待发布完成
kubectl rollout history deployment/web # 确认 revision 记录
kubectl rollout undo deployment/web --to-revision=2 # 出问题回滚到指定版本
服务与网络
| 命令 | 作用 | 示例 |
|---|---|---|
kubectl get svc | 列出 Service | kubectl get svc -o wide |
kubectl get endpoints | 查看 Service 后端实际 Pod 地址,排查「Service 不通」必看 | kubectl get endpoints <svc-name> |
kubectl get ingress | 列出 Ingress 及域名、地址 | kubectl get ingress |
kubectl expose | 为现有资源快速创建 Service | kubectl expose deployment <deploy-name> --port=80 --target-port=8080 --type=NodePort |
kubectl port-forward | 把集群内端口转发到本地,调试时免暴露服务 | kubectl port-forward pod/<pod-name> 8080:80 |
# 转发 Service 端口到本地,访问 localhost:8080 即打到集群内 80 端口
kubectl port-forward svc/<svc-name> 8080:80
# 转发 Deployment 也是可以的,kubectl 会自动选其中一个 Pod
kubectl port-forward deployment/<deploy-name> 8080:80
配置与存储
| 命令 | 作用 | 示例 |
|---|---|---|
kubectl get cm | 列出 ConfigMap | kubectl get configmap |
kubectl describe cm | 查看 ConfigMap 内容 | kubectl describe cm <cm-name> |
kubectl create configmap | 从文件或目录命令式创建 ConfigMap | kubectl create configmap <cm-name> --from-file=app.conf |
kubectl get secret | 列出 Secret | kubectl get secret |
kubectl create secret | 命令式创建 Secret | kubectl create secret generic <secret-name> --from-literal=password=mypassword |
kubectl get pv | 列出 PersistentVolume(集群级资源) | kubectl get pv |
kubectl get pvc | 列出 PersistentVolumeClaim 及绑定状态 | kubectl get pvc |
kubectl get sc | 列出 StorageClass | kubectl get storageclass |
# Secret 的值是 base64 编码,用 jsonpath 取出后解码查看
kubectl get secret <secret-name> -o jsonpath='{.data.password}' | base64 -d
排障调试
日志
| 命令 | 作用 | 示例 |
|---|---|---|
kubectl logs | 查看容器日志 | kubectl logs <pod-name> |
kubectl logs -f | 持续跟踪日志输出 | kubectl logs -f <pod-name> |
kubectl logs --previous | 查看上一个已退出容器的日志,排查 CrashLoopBackOff 必用 | kubectl logs <pod-name> --previous |
kubectl logs -c | 多容器 Pod 指定容器名 | kubectl logs <pod-name> -c <container-name> |
kubectl logs --tail | 只看最后 N 行 | kubectl logs <pod-name> --tail=100 |
kubectl logs --since | 只看最近一段时间 | kubectl logs <pod-name> --since=10m |
kubectl logs -l | 按标签同时查看多个 Pod 的日志 | kubectl logs -l app=nginx --tail=20 |
进入容器与拷贝文件
| 命令 | 作用 | 示例 |
|---|---|---|
kubectl exec -it | 在容器内执行交互式命令(排障主入口) | kubectl exec -it <pod-name> -- /bin/sh |
kubectl exec | 在容器内执行单条命令 | kubectl exec <pod-name> -- cat /etc/hosts |
kubectl cp | 本地与容器之间互相拷贝文件 | kubectl cp <pod-name>:/tmp/app.log ./app.log |
# 多容器 Pod 用 -c 指定容器,进入指定命名空间的 Pod 加 -n
kubectl exec -it <pod-name> -c <container-name> -n <namespace> -- /bin/bash
# 把本地文件上传到容器(方向反过来)
kubectl cp ./config.yaml <pod-name>:/etc/app/config.yaml
资源用量与事件
| 命令 | 作用 | 示例 |
|---|---|---|
kubectl top pod | 查看 Pod CPU/内存用量(需 metrics-server) | kubectl top pod -A |
kubectl top pod --containers | 细分到容器级别 | kubectl top pod <pod-name> --containers |
kubectl get events | 查看命名空间事件 | kubectl get events -n default |
kubectl get events --sort-by | 按时间排序看事件,最新排在最后 | kubectl get events --sort-by=.metadata.creationTimestamp -A |
kubectl get events -w | 实时监听事件流 | kubectl get events -w -n default |
权限检查
| 命令 | 作用 | 示例 |
|---|---|---|
kubectl auth can-i | 检查当前用户是否有某项权限 | kubectl auth can-i create deployments |
kubectl auth can-i --list | 列出当前用户在命名空间下的全部权限 | kubectl auth can-i --list -n default |
kubectl auth can-i --as | 模拟其他用户/ServiceAccount 检查权限 | kubectl auth can-i delete pods --as=system:serviceaccount:default:<sa-name> |
输出与筛选技巧
输出格式
| 命令 | 作用 | 示例 |
|---|---|---|
-o wide | 输出额外列(Pod IP、所在节点等) | kubectl get pods -o wide |
-o yaml | 输出完整 YAML 定义,可直接改完复用 | kubectl get pod <pod-name> -o yaml |
-o json | 输出完整 JSON 定义,方便 jq 处理 | kubectl get pod <pod-name> -o json |
-o jsonpath | 按表达式精确提取字段 | 见下方示例 |
--show-labels | 在列表末尾追加标签列 | kubectl get pods --show-labels |
# 取所有 Pod 的名称和 IP,适合脚本处理
kubectl get pods -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.podIP}{"\n"}{end}'
# 取所有 Pod 使用的镜像列表
kubectl get pods -o jsonpath='{.items[*].spec.containers[*].image}'
# 取节点内网 IP
kubectl get nodes -o jsonpath='{.items[*].status.addresses[?(@.type=="InternalIP")].address}'
jsonpath 速记
表达式以 { 开头、以 } 结尾;.items[*] 遍历列表,{range ...}{end} 可以自定义每条输出的拼接格式,\t 和 \n 要写成 {"\t"}、{"\n"} 这种单独引用形式。表达式里带空格时整体要用单引号包住。
筛选、排序与监听
| 命令 | 作用 | 示例 |
|---|---|---|
-l | 按标签筛选,支持等值和集合运算 | kubectl get pods -l app=nginx,tier=frontend |
--field-selector | 按资源字段筛选(非标签字段用它) | kubectl get pods --field-selector=status.phase=Running |
--sort-by | 按字段排序,常用于时间和名称 | kubectl get pods --sort-by=.metadata.creationTimestamp |
-A | 跨全部命名空间查看(--all-namespaces 简写) | kubectl get pods -A |
-w | 持续监听资源变化(--watch 简写) | kubectl get pods -w |
--no-headers | 不输出表头,方便脚本处理 | kubectl get pods --no-headers |
# 集合运算:environment 属于 prod 或 qa,且不带 frontend 标签
kubectl get pods -l 'environment in (prod, qa), !frontend'
# 找出非 Running 状态的 Pod
kubectl get pods -A --field-selector=status.phase!=Running
kubeconfig 与 Context 管理
Context 查看与切换
| 命令 | 作用 | 示例 |
|---|---|---|
kubectl config get-contexts | 列出所有 context,带 * 号的是当前项 | kubectl config get-contexts |
kubectl config current-context | 只显示当前 context 名 | kubectl config current-context |
kubectl config use-context | 切换当前 context | kubectl config use-context <context-name> |
kubectl config set-context | 新增或修改 context,可绑定默认命名空间 | kubectl config set-context <context-name> --namespace=default |
kubectl config delete-context | 删除指定 context | kubectl config delete-context <context-name> |
kubectl config get-clusters / get-users | 列出配置里的集群/用户条目 | kubectl config get-clusters |
kubectl config view | 查看合并后的完整配置 | kubectl config view --minify |
多配置文件管理
# 默认配置文件是 ~/.kube/config,KUBECONFIG 环境变量可合并多份配置(冒号分隔)
export KUBECONFIG=~/.kube/config:~/.kube/prod.yaml
# 把合并结果固化为单个文件
kubectl config view --flatten > ~/.kube/merged.yaml
# 单次命令临时指定配置文件,不改全局状态
kubectl --kubeconfig=~/.kube/prod.yaml get nodes
context 是什么
一个 context 是「集群 + 用户凭据 + 默认命名空间」的三元组合。use-context 切换之后,后续所有 kubectl 命令都指向新集群。操作生产集群前先 kubectl config current-context 确认当前指向,是个能救命的习惯。