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状态。

相关推荐
Gary董1 小时前
高并发的微服务架构如何设计
微服务·云原生·架构
东哥爱编程1 小时前
使用Runpod进行gpu serverless推理
云原生·serverless
好好沉淀1 小时前
Docker开发笔记(详解)
运维·docker·容器
Ankie Wan3 小时前
cgroup(Control Group)是 Linux 内核提供的一种机制,用来“控制、限制、隔离、统计”进程对系统资源的使用。
linux·容器·cgroup·lxc
lcx_defender4 小时前
【Docker】Docker部署运行nacos
运维·docker·容器
啦啦啦小石头5 小时前
docker添加用户权限不使用sudo
运维·docker·容器
天才奇男子6 小时前
《深度解析HAProxy七层代理:原理、配置与最佳实践》
linux·运维·微服务·云原生
春日见6 小时前
Autoware使用教程
大数据·人工智能·深度学习·elasticsearch·搜索引擎·docker·容器
Dontla6 小时前
Kubernetes流量管理双雄:Ingress与Gateway API解析(Nginx与Ingress与Gateway API的关系)
nginx·kubernetes·gateway
lcx_defender6 小时前
【Docker】Docker部署运行Kibana
运维·docker·容器