首页 > 工具箱 > K8s 常用命令

Kubernetes 常用命令

kubectl 速查表,按「排查一个线上问题」的实际顺序编排:先确认集群和命名空间,再 get / describe / logs,最后才是发布回滚。下面另附常见 Pod 异常状态怎么看。

先搞清楚在哪个集群

八成的「命令没生效」都是因为连错了集群或命名空间。

命令 说明
kubectl config get-contexts 列出所有上下文,带 * 的是当前用的那个
kubectl config use-context prod 切换集群。生产操作前先跑这条确认一下
kubectl config set-context --current --namespace=myns 把当前上下文的默认命名空间改掉,省得每条都加 -n
kubectl cluster-info 看 API Server 地址,确认连的是不是你以为的那套
kubectl get ns 列出所有命名空间
kubectl version --short 看客户端和服务端版本,差太多会有兼容问题

看状态

排查从这里开始,顺序基本是 get → describe → logs。

命令 说明
kubectl get pods -n myns 列出 Pod。加 -o wide 能看到所在节点和 Pod IP
kubectl get pods -A 所有命名空间的 Pod,找不到东西时先用它扫一遍
kubectl get pods -w 持续watch状态变化,发布时盯着看
kubectl get all -n myns 一次看全 Deployment / Service / Pod / ReplicaSet
kubectl describe pod mypod 最有用的一条。底部 Events 会直接告诉你为什么起不来:镜像拉不到、调度不上、探针失败
kubectl get events --sort-by=.lastTimestamp 按时间看集群事件,整体出问题时用
kubectl get pod mypod -o yaml 看 Pod 的完整定义,包括被 webhook 注入的内容
kubectl get deploy,svc,ing -n myns 同时列多种资源,逗号分隔
kubectl get pods --field-selector status.phase!=Running 只看不正常的 Pod
kubectl get nodes -o wide 看节点状态、版本、内外网 IP
kubectl top pod / kubectl top node 看实际 CPU / 内存用量,需要装 metrics-server

日志与进容器

命令 说明
kubectl logs -f mypod 跟踪日志
kubectl logs --tail=200 mypod 只看最后 200 行
kubectl logs mypod -c sidecar 多容器 Pod 要用 -c 指定容器
kubectl logs --previous mypod 看上一个已崩溃实例的日志。CrashLoopBackOff 时唯一能看到真实报错的办法
kubectl logs -l app=myapp --tail=50 按标签一次看多个 Pod 的日志
kubectl exec -it mypod -- sh 进容器。注意中间那个 -- 不能少
kubectl exec mypod -- env 不进去,只跑一条命令看结果
kubectl cp mypod:/app/dump.log ./dump.log 从 Pod 里拷文件出来
kubectl port-forward pod/mypod 8080:80 把 Pod 端口转发到本地,不用暴露 Service 就能调试
kubectl port-forward svc/mysvc 3306:3306 同样可以转发到 Service,本地连集群里的数据库
kubectl debug -it mypod --image=busybox --target=app 往运行中的 Pod 里塞一个临时排查容器(1.23+),适合镜像里什么工具都没有的情况

发布与回滚

命令 说明
kubectl apply -f deploy.yaml 声明式下发,日常都该用它而不是 create
kubectl apply -f ./manifests/ 下发整个目录
kubectl diff -f deploy.yaml 先看这次 apply 会改什么,再决定要不要下发
kubectl set image deploy/myapp app=myapp:1.2 只换镜像,最常见的发布动作
kubectl rollout status deploy/myapp 等待并观察本次发布是否成功,CI 里常接在 set image 后面
kubectl rollout history deploy/myapp 看历史版本
kubectl rollout undo deploy/myapp 回滚到上一版。加 --to-revision=3 回到指定版本
kubectl rollout restart deploy/myapp 不改配置,滚动重启所有 Pod(改了 ConfigMap 后常用)
kubectl scale deploy/myapp --replicas=5 手动改副本数
kubectl delete pod mypod 删掉一个 Pod。有控制器管着的话会立刻重建,这就是「重启」单个实例的办法
kubectl delete -f deploy.yaml 按定义文件删除对应资源

配置与密钥

命令 说明
kubectl get cm -n myns 列出 ConfigMap
kubectl create cm myconf --from-file=app.conf 用文件创建 ConfigMap
kubectl create secret generic mysec --from-literal=password=s3cr3t 创建 Secret
kubectl get secret mysec -o jsonpath='{.data.password}' | base64 -d 解出 Secret 的值。Secret 只是 base64,不是加密,谁能读它谁就拿到明文
kubectl describe cm myconf 看 ConfigMap 内容
kubectl edit deploy/myapp 直接编辑线上资源。应急可以,但改完记得同步回仓库,否则下次 apply 就被覆盖

节点维护

命令 说明
kubectl cordon node-1 标记节点不可调度,新 Pod 不会再排上来
kubectl drain node-1 --ignore-daemonsets --delete-emptydir-data 把节点上的 Pod 驱逐走,下线维护前的标准动作
kubectl uncordon node-1 维护完恢复调度
kubectl taint nodes node-1 key=value:NoSchedule 打污点,只有带对应容忍的 Pod 才能调度上去
kubectl label nodes node-1 disktype=ssd 给节点打标签,配合 nodeSelector 用

Pod 状态不对时看哪里

状态 什么意思,怎么查
ImagePullBackOff / ErrImagePull 镜像拉不下来:tag 写错、私有仓库没配 imagePullSecrets、或者节点访问不了仓库。describe pod 的 Events 里有具体原因。
CrashLoopBackOff 容器起来就挂,K8s 在不断重试。kubectl logs --previous 看上一次崩溃的日志,那里才有真正的报错。
Pending 调度不上去:资源不够(看 describe 里的 Insufficient cpu/memory)、有污点没容忍、或者 PVC 还没绑定。
Init:0/1 卡在 initContainer,去看那个容器的日志:kubectl logs mypod -c init-xxx
OOMKilled 内存超了 limit 被内核杀掉。要么调大 limits,要么真去查内存泄漏——调大只是把问题推后。
Terminating 卡住 一般是 Pod 有 finalizer 没执行完,或者 preStop 钩子 / 优雅退出超时。可以看 describe,实在不行 --force --grace-period=0(但要清楚这会留下残留)。
Service 通不了 先确认 Service 的 selector 和 Pod 的 labels 对得上:kubectl get endpoints mysvc,Endpoints 为空就是选择器没匹配上。

几个省事的习惯

  • alias k=kubectl,再配上官方的补全脚本(source <(kubectl completion bash)),一天能少敲几千个字符。
  • 危险操作前先 kubectl config get-contexts 确认集群。给生产上下文的终端换个显眼的背景色,比任何规范都管用。
  • -o jsonpath 比 grep 可靠得多,例如 kubectl get pods -o jsonpath='{.items[*].spec.containers[*].image}' 一把列出所有镜像。想调 jsonpath 表达式可以先用 JSONPath 测试 试。
  • 所有 YAML 都进 git,线上只跑 applykubectl edit 改出来的东西下一次发布就没了。写 YAML 可以先用 YAML/JSON 互转Properties/.env 转换 过一遍。
  • 相关:Docker 常用命令Linux 常用命令docker 转 composeHTTP 状态码