Kubernetes 常用命令

常用快捷命令

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 <命名空间>
  1. 先删 pod 重新生成(核心命令)
bash 复制代码
kubectl delete pod <pod名称> -n <命名空间>
  1. 快速查 pod 状态 / 名称(先定位)
bash 复制代码
# 查所有pod(含命名空间)
kubectl get pods -A
# 查指定命名空间pod
kubectl get pods -n <命名空间>
# 查pod详细报错(关键!看挂掉原因)
kubectl describe pod <pod名称> -n <命名空间>

排错流程:

  1. 先执行 kubectl describe podEvents 段,90% 的故障原因都在这里(如镜像拉取失败、资源不足、端口占用、健康检查失败)

  2. 看 pod 日志,定位业务报错:

    bash 复制代码
    kubectl logs <pod名称> -n <命名空间>
    # 看最近日志(适合日志量大)
    kubectl logs --tail=100 <pod名称> -n <命名空间>
  3. 若 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状态。

相关推荐
Rabbit_QL14 小时前
【网络设置】Docker 自定义网络深度解析:从踩坑到工程实践
网络·docker·容器
沫离痕20 小时前
windows安装docker实例
windows·docker·容器
没有bug.的程序员20 小时前
Service Mesh 与 Spring Cloud 共存方案:双体系治理、平滑迁移与风险控制实战指南
云原生·springcloud·流量治理·混合架构·servicemesh·微服务迁移·技术演进
一只鱼丸yo20 小时前
从单体到微服务:一次真实迁移实战
微服务·云原生·架构
唯情于酒21 小时前
Docker部署若依(前后端分离版)
vue.js·docker·容器
2501_939909051 天前
k8s基础与安装部署
云原生·容器·kubernetes
谷隐凡二1 天前
Kubernetes Route控制器简单介绍
java·容器·kubernetes
ysy16480672391 天前
Docker安装(Windows版)
windows·docker·容器
2501_940414081 天前
搞了一次平台工程,我把本地的 Docker Desktop 彻底卸了
运维·docker·容器