温馨提示×

centos k8s为什么容器退出

小樊
39
2026-10-20 21:52:01
栏目: 智能运维

在 CentOS 上运行的 Kubernetes(k8s)中,容器退出(CrashLoopBackOff / Completed / Error) 是非常常见的问题。原因通常可以归为以下几类,我按最常见 → 较少见来说明,并给出排查方法。


一、最常见原因

1️⃣ 容器主进程退出(exit code 0 或非 0)

Kubernetes 容器必须有一个前台进程一直运行,否则就会退出。

典型错误示例:

CMD /opt/start.sh   # 脚本里是后台运行

或

CMD service nginx start

✅ 正确方式:

CMD ["nginx", "-g", "daemon off;"]

查看:

kubectl describe pod <pod-name>
kubectl logs <pod-name>

2️⃣ 应用启动报错(配置 / 依赖 / 端口)

常见情况:

  • 配置文件不存在
  • 环境变量缺失
  • 连接数据库失败
  • 端口被占用

查看日志:

kubectl logs <pod-name>
kubectl logs <pod-name> --previous

3️⃣ 资源不足(OOM / CPU)

CentOS + k8s 常见:

  • 内存限制太小 → OOMKilled
  • CPU 被限流 → 启动超时

检查:

kubectl describe pod <pod-name>

看到:

Reason: OOMKilled
Exit Code: 137

✅ 解决:

  • 调大 resources.limits.memory
  • 或优化应用内存

4️⃣ 健康检查失败(liveness / readiness)

  • liveness 失败 → kubelet 杀掉容器
  • readiness 失败 → 不进流量,但可能反复重启

示例错误:

Liveness probe failed: HTTP probe failed with status 500

✅ 检查:

kubectl describe pod <pod-name>

二、CentOS 特有问题

5️⃣ SELinux 导致权限问题

CentOS 默认开启 SELinux。

常见现象:

  • 容器无法写文件
  • 挂载目录失败
  • 权限 denied

临时验证:

setenforce 0

✅ 长期方案:

  • 写 SELinux policy
  • 或挂载时加 :z / :Z

6️⃣ 防火墙 / firewalld 影响

CentOS 的 firewalld 可能拦截:

  • kubelet 端口
  • pod 网络
systemctl status firewalld

✅ 建议:

systemctl stop firewalld
systemctl disable firewalld

7️⃣ 文件系统 / 挂载问题

  • hostPath 权限不对
  • NFS 没挂载
  • emptyDir 空间满
kubectl describe pod

三、镜像 / 版本问题

8️⃣ 镜像拉取失败

  • 私有仓库未配置 secret
  • 镜像 tag 不存在
  • CentOS 无法访问外网
kubectl describe pod

看到:

Failed to pull image
ImagePullBackOff

9️⃣ CentOS + container runtime 不兼容

  • docker vs containerd
  • cgroup v1 / v2 问题

CentOS 7:cgroup v1
CentOS 8/9:cgroup v2(部分旧镜像不支持)


四、快速排查流程(强烈推荐)

# 1. 看 pod 状态
kubectl get pod

# 2. 看详细信息
kubectl describe pod <pod>

# 3. 看日志
kubectl logs <pod>
kubectl logs <pod> --previous

# 4. 进容器(如果能起来)
kubectl exec -it <pod> -- sh

五、你可以直接告诉我这些,我可以精准判断

如果你愿意,可以贴出:

  1. kubectl describe pod <pod> 输出
  2. kubectl logs <pod>
  3. CentOS 版本(7 / 8 / 9)
  4. k8s 版本
  5. 容器是啥(nginx / java / 自己写的)

我可以直接告诉你具体是哪一个原因 + 怎么改 YAML。

0 踩