常用快捷命令
shell
kubectl get pod <pod-name> -n <namespace>:查看 Pod 的状态
kubectl describe pod <pod-name> -n <namespace>:查看 Pod 的详细信息,包括 Events
kubectl logs <pod-name> -c <container-name> -n <namespace>:查看容器的日志
kubectl logs <pod-name> -c <container-name> -n <namespace> --previous:查看容器之前的日志
kubectl exec -it <pod-name> -c <container-name> -- /bin/bash:进入容器内部调试
kubectl get nodes:查看 Node 的状态
kubectl get pvc -n <namespace>:查看 PVC 的状态
kubectl get pv:查看 PV 的状态
kubectl get svc -n <namespace>:查看服务的状态
kubectl get pods -A:查看所有 Pod 的状态
1. 代码更新
bash
## 代码更新
重新编辑代码后,构建新的镜像,修改对应服务 yaml 文件后,执行kubectl apply -f [对应服务yaml文件],更新操作
kubectl apply -f [对应服务yaml文件]
2. 服务启动停止
shell
## 服务启动停止
服务启动:kubectl create -f [对应服务yaml文件]
服务关闭:kubectl delete -f [对应服务yaml文件]
服务重启:kubectl delete -n enableai(命名空间) pod-name(pod名称)
服务更新:kubectl apply -f [对应服务yaml文件]
# 强制删除卡死的pod(偶尔删不掉用)
kubectl delete pod <pod名称> -n <命名空间> --force --grace-period=0
# 重启整个deployment下的所有pod(推荐,比删单个pod更规范)
kubectl rollout restart deployment <deployment名称> -n <命名空间>
3. 问题排查
shell
## 问题排查
- 查看前服务状态:kubectl get pods -n 命名空间
- 查看所有服务状态:kubectl get pods -A
- 查看node节点信息:kubectl get nodes
- 查看某个 node 详细信息(可看 cpu,内存,pod,显卡等信息):kubectl describe node node-name(node名)
## 问题 pod 查原因
- 查看服务pod状态:kubectl describe pod -n 命名空间 pod名
- 查看 pod 日志:kubectl logs -n 命名空间 pod名
4. 查询
shell
# 查询镜像详细元数据(查镜像本身的静态信息)
docker image inspect
# Docker 固定子命令,专门用于查询「镜像」的详细元数据(可简写为 docker inspect,效果完全一致)
# 查容器运行时信息
docker container inspect
# 查看所有服务的 NodePort 端口
kubectl get svc -n 命名空间 | grep NodePort
# 查找 mq-consumer 的具体服务
kubectl get svc -n 命名空间 | grep mq-consumer
集群容器挂掉 重启
shell
## 服务启动停止
服务启动:kubectl create -f [对应服务yaml文件]
服务关闭:kubectl delete -f [对应服务yaml文件]
服务重启:kubectl delete -n enableai(命名空间) pod-name(pod名称)
服务更新:kubectl apply -f [对应服务yaml文件]
# 强制删除卡死的pod(偶尔删不掉用)
kubectl delete pod <pod名称> -n <命名空间> --force --grace-period=0
# 重启整个deployment下的所有pod(推荐,比删单个pod更规范)
kubectl rollout restart deployment <deployment名称> -n <命名空间>
- 先删 pod 重新生成(核心命令)
bash
kubectl delete pod <pod名称> -n <命名空间>
- 快速查 pod 状态 / 名称(先定位)
bash
# 查所有pod(含命名空间)
kubectl get pods -A
# 查指定命名空间pod
kubectl get pods -n <命名空间>
# 查pod详细报错(关键!看挂掉原因)
kubectl describe pod <pod名称> -n <命名空间>
排错流程:
-
先执行
kubectl describe pod看 Events 段,90% 的故障原因都在这里(如镜像拉取失败、资源不足、端口占用、健康检查失败) -
看 pod 日志,定位业务报错:
bashkubectl logs <pod名称> -n <命名空间> # 看最近日志(适合日志量大) kubectl logs --tail=100 <pod名称> -n <命名空间> -
若 pod 由Deployment/StatefulSet管理,删 pod 会自动重建;若为独立 pod,删了就没了,需重新创建
常见 pod 挂掉原因
▸ 镜像拉取失败:镜像地址错、私有仓库无权限、网络不通
▸ 资源不足:CPU / 内存超限(配置 requests/limits 不合理)
▸ 健康检查失败:livenessProbe/readinessProbe 配置太严
▸ 挂载存储失败:PVC 未创建、存储卷无权限
▸ 端口冲突 / 配置错误:业务配置文件写错、环境变量缺失
pod 状态详解
Pending(等待中)
Running(运行中)
Succeeded(成功)
Failed(失败)
CrashLoopBackOff(容器反复崩溃重启)
Unknown(未知)
Terminating:Pod 正处于终止过程中,但未能成功完成终止
1. Pending(等待中)
Pending(等待中)
含义: Pod 已经被 Kubernetes API Server 接受了,但一个或多个容器还没创建起来,或者还没跑起来。这就像你下单了快递,商家已经接单了,但快递还没发货
常见原因:
- 资源不足: 集群里没有足够的资源(比如 CPU、内存)来运行 Pod。就像你买了个大件,但家里没地方放。
- 镜像拉取问题: K8s 无法从镜像仓库(比如 Docker Hub、私有仓库)拉取镜像。可能是网络问题,也可能是镜像名写错了。
- 调度问题: K8s 找不到合适的 Node 来运行 Pod。比如,你的 Pod 声明了特定的 NodeSelector,但集群里没有符合条件的 Node。
- PV/PVC 问题: 如果 Pod 需要使用 PersistentVolumeClaim (PVC) 来存储数据,PVC 还没有绑定到 PV 上,Pod 也会处于 Pending 状态。
排查方法:
- 查看 Pod 的详细信息: 使用 kubectl describe pod -n 命令,看看 Events 部分
- 检查 Node 的资源使用情况: 使用 kubectl get nodes 命令,查看 Node 的 CPU、内存使用情况
- 检查镜像仓库是否可达: 尝试手动拉取镜像,看看能不能拉下来。如果不行,检查网络配置、镜像名称是否正确
- 检查 PVC 和 PV 的绑定情况: 使用 kubectl get pvc -n 和 kubectl get pv 命令,确保 PVC 已经绑定到 PV 上了
shell
kubectl describe pod my-pod -n my-namespace
kubectl get nodes
docker pull <image-name>:<tag>
kubectl get pvc -n my-namespace
kubectl get pv
2. Running(运行中)
含义: Pod 已经绑定到了一个 Node 上,并且所有容器都创建起来了,至少有一个容器是 Running 状态。但要注意,这不代表你的应用就一定正常运行了。就像快递已经发货了,但可能还在路上
排查方法:
- 查看 Pod 的状态: 使用 kubectl get pod -n 命令,确保 Pod 的状态是 Running
- 查看容器的日志: 使用 kubectl logs -c -n 命令,查看容器的日志,看看有没有报错信息
- 进入容器内部调试: 使用 kubectl exec -it -c -- /bin/bash 命令,进入容器内部,进行调试
- 检查服务是否正常: 如果你的 Pod 暴露了服务(Service),使用 kubectl get svc -n 命令,查看服务的状态,并尝试访问服务,看看是否能正常访问;然后,可以通过服务对应的 Cluster IP 或者 NodePort 访问你的应用
shell
kubectl get pod my-pod -n my-namespace
kubectl logs my-pod -c my-container -n my-namespace
kubectl exec -it my-pod -c my-container -- /bin/bash
kubectl get svc -n my-namespace
3. Succeeded(成功)
Pod 里面的所有容器都成功退出了。通常用于一次性任务,比如数据备份、数据库迁移等。就像你的任务完成了
4. Failed(失败)
含义: Pod 里面的一个或多个容器失败了。这可能是程序出错了,也可能是容器启动失败了。就像你的任务失败了。
常见原因:
- 程序崩溃: 容器里的程序出现异常,导致容器退出。
- 容器启动失败: 容器启动时出现错误,比如配置错误、依赖缺失等。
- 资源不足: 容器申请的资源超过了限制。
- 镜像问题: 镜像有问题,导致容器无法启动。
排查方法:
- 查看 Pod 的状态: 使用 kubectl get pod -n 命令,确保 Pod 的状态是 Failed
- 查看 Pod 的详细信息: 使用 kubectl describe pod -n 命令,查看 Events 部分,找到失败的原因
- 查看容器的日志: 使用 kubectl logs -c -n 命令,查看容器的日志,看看有没有报错信息
- 进入容器内部调试: 如果容器允许进入,使用 kubectl exec -it -c -- /bin/bash 命令,进入容器内部,进行调试
shell
kubectl get pod my-job -n my-namespace
kubectl describe pod my-job -n my-namespace
kubectl logs my-job -c my-container -n my-namespace
kubectl exec -it my-job -c my-container -- /bin/bash
5. CrashLoopBackOff(容器反复崩溃重启)
含义: 容器启动后立即崩溃,然后 K8s 尝试重启它,但又崩溃,如此循环往复。这就像你的应用不停地死循环。
常见原因:
- 程序错误: 程序存在 bug,导致容器启动后立即崩溃。
- 配置错误: 容器的配置有问题,比如环境变量、配置文件等。就像你给错了机器的启动参数。
- 依赖问题: 容器依赖的其他服务或者资源不可用。就像你缺了启动需要的零件。
- 资源限制: 容器申请的资源超过了限制,导致容器被 OOM kill。
排查方法:
- 查看 Pod 的状态: 使用 kubectl get pod -n 命令,确保 Pod 的状态是 CrashLoopBackOff
- 查看 Pod 的详细信息: 使用 kubectl describe pod -n 命令,查看 Events 部分,找到失败的原因。重点关注 Last State 部分,它会告诉你容器最后一次退出时的信息,比如退出码、错误信息等
- 查看容器的日志: 使用 kubectl logs -c -n 命令,查看容器的日志,看看有没有报错信息。注意要加上 --previous 参数,查看之前的日志,因为容器可能已经重启了
- 进入容器内部调试: 如果容器允许进入,使用 kubectl exec -it -c -- /bin/bash 命令,进入容器内部,进行调试。注意,由于容器一直在崩溃重启,你可能需要快速进入容器,才能进行调试
- 检查资源限制: 检查 Pod 的资源限制(CPU、内存),看看是否超过了 Node 的可用资源。如果超过了,可以调整资源限制,或者优化你的应用
shell
kubectl get pod my-job -n my-namespace
kubectl describe pod my-job -n my-namespace
kubectl logs my-job -c my-container -n my-namespace
kubectl exec -it my-job -c my-container -- /bin/bash
6. Unknown(未知)
含义: K8s 无法获取 Pod 的状态。通常是因为 K8s 与 Node 的连接出现了问题。就像你联系不上你的快递员了。
常见原因:
- 网络问题: K8s 集群的网络出现问题,导致 K8s 无法与 Node 通信。
- Node 故障: Node 出现故障,比如宕机、网络中断等。
- kubelet 故障: Node 上的 kubelet 服务出现问题,导致 K8s 无法获取 Pod 的状态。
排查方法:
- 检查 Node 的状态: 使用 kubectl get nodes 命令,查看 Node 的状态。如果 Node 状态是 NotReady,说明 Node 出现了问题
- 检查 K8s 集群的网络: 检查 K8s 集群的网络配置,确保网络正常。可以使用 kubectl get pods -A 命令,查看所有 Pod 的状态,看看是否所有 Pod 都处于 Unknown 状态,或者只有部分 Pod 处于 Unknown 状态。如果只有部分 Pod 处于 Unknown 状态,可能是 Node 上的网络问题
- 检查 Node 的日志: 登录到 Node 上,查看 kubelet 的日志,看看是否有错误信息。
- 重启 kubelet: 如果 kubelet 出现问题,可以尝试重启 kubelet 服务。
shell
kubectl get nodes
kubectl get pods -A
journalctl -u kubelet
systemctl restart kubelet
7. Terminating
Pod 正处于终止过程中,但未能成功完成终止
这种情况可能会导致资源无法释放,进而影响集群的整体性能和稳定性。 当Pod被删除时,Kubernetes需要清理相关的资源,如网络、存储等。 如果这些资源清理过程出现延迟,Pod可能会长时间处于T状态。