跳到主要内容

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标记节点不可调度,不驱逐已有 Podkubectl 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列出 Servicekubectl get svc -o wide
kubectl get endpoints查看 Service 后端实际 Pod 地址,排查「Service 不通」必看kubectl get endpoints <svc-name>
kubectl get ingress列出 Ingress 及域名、地址kubectl get ingress
kubectl expose为现有资源快速创建 Servicekubectl 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列出 ConfigMapkubectl get configmap
kubectl describe cm查看 ConfigMap 内容kubectl describe cm <cm-name>
kubectl create configmap从文件或目录命令式创建 ConfigMapkubectl create configmap <cm-name> --from-file=app.conf
kubectl get secret列出 Secretkubectl get secret
kubectl create secret命令式创建 Secretkubectl 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列出 StorageClasskubectl 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切换当前 contextkubectl config use-context <context-name>
kubectl config set-context新增或修改 context,可绑定默认命名空间kubectl config set-context <context-name> --namespace=default
kubectl config delete-context删除指定 contextkubectl 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 确认当前指向,是个能救命的习惯。