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 |
看客户端和服务端版本,差太多会有兼容问题 |
| 命令 | 说明 |
|---|---|
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 用 |
| 状态 | 什么意思,怎么查 |
|---|---|
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,线上只跑
apply。kubectl edit改出来的东西下一次发布就没了。写 YAML 可以先用 YAML/JSON 互转 和 Properties/.env 转换 过一遍。 - 相关:Docker 常用命令、Linux 常用命令、docker 转 compose、HTTP 状态码。