资讯动态

RHEL 9系部署Rancher报错k3s exited with exit status 1的排查与解决

发布时间:2026/9/17 12:23:32 来源:尧图企业网站定制
如果你是在 Rocky Linux 9、AlmaLinux 9 或者 CentOS Stream 9 这类 RHEL 9 系系统上装 Rancher装完后启动 rancher-server发现服务一直起不来systemctl 状态里出现k3s exited with: exit status 1那这篇文章就是给你写的。我最近在一台 Rocky Linux 9.3 上部署 Rancher Manager 时就踩了这个坑表面上看只输出了一个笼统的退出码实际背后可能是 cgroup 版本、SELinux、防火墙、containerd 初始化、内核模块加载等好几个原因之一。这个报错最大的迷惑性在于它不会直接告诉你是哪一步挂了你只能靠日志逐层往下挖。下面我把完整的排查思路、日志查看方法、以及我实测有效的几种解决方案整理出来你能照着一步步做基本能把问题收敛到根因。1. 先别急着重装搞懂 exit status 1 背后藏了什么1.1 报错长什么样、怎么看Rancher 2.x 默认通过一个叫作 rancher-system-agent 的组件在当前节点上拉起 k3s再用 k3s 跑 Rancher 自身的工作负载。所以你直接看 rancher 容器的状态可能只会看到一个不断重启的容器真正能反映问题的是系统里的 k3s 服务。用下面这条命令看服务状态你会看到类似这样的输出systemctl status k3s● k3s.service - Lightweight Kubernetes Loaded: loaded (/etc/systemd/system/k3s.service; enabled; preset: disabled) Active: failed (Result: exit-code) since Mon 2025-02-24 10:15:22 CST; 1min 30s ago Docs: https://k3s.io Process: 3456 ExecStart/usr/local/bin/k3s server (codeexited, status1/FAILURE) Main PID: 3456 (codeexited, status1/FAILURE)这里出现的status1/FAILURE就是标题里说的k3s exited with: exit status 1。它传达的信息其实很有限只说明 k3s 在启动阶段因为某种原因主动退出了。可能是某个依赖项没准备好也可能是某个前置检查没通过k3s 干脆不往下走了。碰到这种笼统退出码最忌讳的做法是反复systemctl restart k3s或者直接卸载重装因为同一个退出码对应多个根因不找到真正原因重装几次结果都一样。我一般第一件事就是去看 k3s 自己的完整日志。1.2 定位根因的第一条命令链在 RHEL 9 系系统里查 k3s 的日志优先用 journalctl日志量比较大时建议先取末尾部分journalctl -u k3s -n 200 --no-pager如果日志太长你可以先把关键错误捞出来用 grep 过滤levelfatal、levelerror、failed、not found这类关键词journalctl -u k3s --no-pager | grep -Ei fatal|error|failed|not found | tail -50根据我踩坑的经验日志中一旦出现以下这些典型信息根因基本就定位了日志关键字对应问题failed to load cgroups/cgroup2 mountpoint not foundcgroup v2 兼容性问题SELinux is not support/Permission deniedSELinux 拦截address already in use端口被占用failed to create containerd taskcontainerd 初始化异常no space left on device磁盘或 inode 不足Failed to find memory cgroupcgroup 路径不匹配下面的几个章节我会按出现频率由高到低逐个拆这些根因的解决方案。其中 cgroup 的问题在我遇到的 RHEL 9 系环境中占比最高所以先说它。2. RHEL 9 系最容易踩的坑cgroup v2 与 k3s 的兼容问题2.1 cgroup v1 和 v2 到底差在哪cgroup 是 Linux 内核用来限制进程 CPU、内存、IO 等资源的核心机制容器运行时完全依赖它。早期内核用的是 cgroup v1各个资源子系统分散挂载在/sys/fs/cgroup/cpu、/sys/fs/cgroup/memory这些独立目录下而新内核主推 cgroup v2所有资源统一挂载在/sys/fs/cgroup这一个层级下结构更统一、更安全。RHEL 9 系系统默认启用 cgroup v2。问题就出在这里部分版本的 k3s 内嵌 containerd 在初始化时仍然按照老的 cgroup v1 路径去找挂载点找不到就直接 fatal 退出你看到的就是k3s exited with: exit status 1。日志里比较典型的报错是levelfatal msgfailed to start containerd: failed to load cgroups: cgroup2 mountpoint not found这种情况下最简单的排查命令就是确认当前系统到底用的哪个 cgroup 版本stat -fc %T /sys/fs/cgroup/如果输出是cgroup2fs说明当前是 cgroup v2如果输出是tmpfs说明是 v1。2.2 切换 cgroup 到 v1 的具体操作如果你遇到的是 cgroup 不兼容最直接、最省事的办法是通过内核引导参数把系统切成 cgroup v1。RHEL 9 的内核仍然保留了对 v1 的支持切过去不会影响系统本身代价是放弃一部分 cgroup v2 的新特性但对我们跑 Rancher 和普通工作负载来说这些新特性基本用不上。修改内核引导参数我建议用 grubby 工具它比手动编辑 /etc/default/grub 更安全、更不容易出错。执行grubby --update-kernelALL --argssystemd.unified_cgroup_hierarchy0这个参数的意思是告诉 systemd 和内核不要使用 unified cgroup hierarchy也就是退回 cgroup v1。改完以后必须重启才能生效reboot重启后再次确认stat -fc %T /sys/fs/cgroup/看到tmpfs后回到 cgroup v2 环境下的问题就已经消除了一大半。然后重新启动 k3s 服务或者让 rancher-system-agent 重新拉起整个部署流程即可。我在 Rocky Linux 9.3 上就是这么解决的k3s 一次启动成功Rancher 的 rancher-server pod 也正常进入 Running 状态。2.3 如果不想动内核参数升级版本是最省事的路切 cgroup v1 是“绕开问题”而不是“真正兼容”。如果你不想动系统内核参数又希望长期用 cgroup v2那还有另一条路使用新版的 Rancher 和 k3s。从 k3s v1.26 左右开始官方已经比较完整地支持了 cgroup v2到了 v1.27 之后在默认 cgroup v2 的发行版上基本可以直接运行不再需要改内核参数。如果你用的 Rancher 版本比较老比如 2.6.x内置的 k3s 也比较老可以考虑把 Rancher 升到 2.7 或 2.8 以上对应内置 k3s 版本也更新了对 RHEL 9 系的适配会好很多。我自己的建议是如果是生产环境优先评估升级 Rancher 到新版本这是更长远的方向如果只是想快速把环境跑起来做验证那切 cgroup v1 最立竿见影两条路根据实际情况选。注意切换 cgroup 版本会影响节点上所有使用容器的服务不只是 Rancher。如果这台机器上还跑着其他依赖 cgroup v2 特性的容器服务切 v1 之前要评估一下影响面。反之升级 Rancher 版本时也要看 k3s 版本变化别在已有业务集群上随意动。3. 除了 cgroup还有哪些高频原因会导致 k3s 起不来cgroup 是我遇到的最多的一个原因但绝对不是唯一一个。RHEL 9 系作为新一代发行版默认开启了大量安全机制和 k3s 一碰撞就容易出问题。排掉 cgroup 之后下面这几个原因也要重点检查。3.1 SELinux 拦路从 getenforce 到放行策略RHEL 9 系默认开启 SELinux并且是 Enforcing 模式。k3s 的安装方式如果没配套安装对应的 SELinux 策略模块containerd 在创建容器、读写文件、挂载目录时就有很大概率被 SELinux 拦截日志里表现为各种 Permission denied或者类似这样的信息levelerror msgFailed to create containerd task: failed to create shim task: OCI runtime create failed: ... permission denied排查是否 SELinux 问题先看当前状态getenforce如果是Enforcing可以先临时切到 Permissive 验证setenforce 0然后重启 k3s 服务如果能正常启动那基本可以确定是 SELinux 策略没放行。此时有两种处理方式。第一种是安装 k3s 官方提供的 selinux 策略包。在 RHEL 9 系上执行yum install -y container-selinux selinux-policy-base yum install -y https://github.com/k3s-io/k3s/releases/download/v1.27.2%2Bk3s1/k3s-selinux-1.27-0.1.el9.noarch.rpm安装完成后重启 k3s。这个策略包会给 k3s 相关进程定义好安全上下文让它在 Enforcing 模式下也能正常工作。第二种是如果你觉得安装策略包太麻烦可以给 k3s 相关目录单独放行。这种方法需要借助 semanage操作起来比直接装 RPM 复杂而且 RHEL 9 的默认策略对不同目录的规则更严格我更推荐第一种。如果是测试环境那就直接用setenforce 0顶着但生产环境强烈不建议长期关闭。3.2 端口冲突与 nftables 模式k3s 启动时会监听多个端口最核心的几个是6443Kubernetes API Server8472Flannel VXLAN 通信10250kubelet 指标接口2379etcd 客户端端口如果是嵌入式 etcdRHEL 9 系默认防火墙是 firewalld如果你之前在机器上跑过其他 Kubernetes 组件、或者装过其他服务端口被占用的概率不低。检查方式很简单ss -lntp | grep -E 6443|8472|10250|2379如果发现端口被占用优先确认占用进程是什么。如果确定可以停掉就停掉或改端口如果必须保留就只能改 k3s 的监听配置在/etc/rancher/k3s/config.yaml里通过https-listen-port等参数调整。还有个比较隐蔽的问题RHEL 9 系默认的 iptables 是 nftables 后端。部分 k3s 版本在初始化网络规则时对 nft 模式兼容得不好会出现规则写入失败、Flannel 起不来的情况。日志里会有Failed to ensure iptables: running iptables ... exit status 4这种问题在 Debian/Ubuntu 上比较常见但 RHEL 9 系如果缺少 iptables-nft 兼容层也可能出现。建议先安装补齐工具并确认当前模式yum install -y iptables-nft update-alternatives --set iptables /usr/sbin/iptables-nft同时确认 firewalld 里放行了 k3s 需要的端口firewall-cmd --permanent --add-port6443/tcp firewall-cmd --permanent --add-port8472/udp firewall-cmd --permanent --add-port10250/tcp firewall-cmd --reload如果你本来就是用 iptables 规则管理的网络也可以直接把这个服务加上。放行端口之后顺手重启一下 k3s 再看。3.3 swap、磁盘空间、挂载权限这类“小问题”这类问题听起来不起眼但我见过太多人排查了半天最后栽在资源问题上。k3s 从设计上就不希望在启用 swap 的节点上运行。RHEL 9 默认安装一般不会开 swap但如果你是自定义分区装系统可能就带上了。检查swapon --show free -h如果发现 swap 分区被启用临时关闭swapoff -a同时要注释掉 /etc/fstab 里对应的 swap 行否则重启之后它又回来了。磁盘空间方面k3s 和 Rancher 都要往 /var/lib/rancher 下写大量数据镜像、容器层、etcd 数据全在这里。空间不足时k3s 可能不会直接报 no space而是启动到一半起不来或者 etcd 初始化失败。用这两条命令先看清楚df -h /var/lib/rancher df -i /var/lib/rancher尤其要看 inode 是否耗尽inode 满了 df -h 看不出任何异常但实际写不了新文件。挂载权限问题则常见于你使用了自定义数据目录、或者把 /var/lib/rancher 挂到了独立磁盘上。k3s 启动会用rancher用户或root访问这个目录如果父目录权限是 755 且属主不是 root就可能出现写入失败。RHEL 9 系如果开了 SELinux还要注意目录的上下文类型是不是container_var_lib_t上下文不对同样会被拦。确认 /var/lib/rancher 存在且属主正确mkdir -p /var/lib/rancher chown -R root:root /var/lib/rancher chmod 755 /var/lib/rancher这些看起来基础的项往往才是最终让你翻车的隐藏原因建议不要跳过任何一项。4. 一次完整的排查实录从失败服务到跑通 Rancher光说理论有点干我把自己在 Rocky Linux 9.3 上那次排查过程完整还原一遍包括日志看到了什么、每一步我怎么判断、最后怎么修好的。你可以照着这个思路走。4.1 现场日志还原当时我执行完 Rancher 的 Docker 启动命令后容器一直重启。docker ps里能看到 rancher-server 容器但 STATUS 列是Restarting于是我先找到系统里的 k3s 服务状态systemctl status k3s输出关键部分Active: failed (Result: exit-code) Process: 3456 ExecStart/usr/local/bin/k3s server (codeexited, status1/FAILURE)然后我看了 journalctljournalctl -u k3s -n 100 --no-pager末尾几行是这样Feb 24 10:15:22 rancher-node k3s[3456]: time2025-02-24T10:15:22.12345678908:00 levelfatal msgfailed to start containerd: failed to load cgroups: cgroup2 mountpoint not found看到cgroup2 mountpoint not found的时候我心里基本就锁定是 cgroup 版本问题了。4.2 按优先级逐个排除我先把系统当前 cgroup 版本确认了一遍stat -fc %T /sys/fs/cgroup/输出cgroup2fs实锤是 v2。接着我看了一下 SELinux 状态getenforce输出Enforcing。为了排除干扰我先setenforce 0临时切到 Permissive然后重启 k3s发现仍然报同样的 fatal 错误。这就说明当前主要矛盾不是 SELinux而是 cgroup。我又检查了端口和磁盘都没有问题于是直接改内核参数grubby --update-kernelALL --argssystemd.unified_cgroup_hierarchy0 reboot重启后验证 cgroup 版本变成 v1stat -fc %T /sys/fs/cgroup/输出tmpfs。这时候再启动 Rancher 容器k3s 服务已经能正常 activerancher-server 的日志开始正常滚动。整个部署流程很快走完Rancher 的 UI 也能正常访问了。因为我已经临时把 SELinux 切成了 Permissive后面我重新执行了setenforce 1切回 Enforcing又装上了 k3s-selinux 策略包确保生产模式不会因为 SELinux 再出问题。整体上这个过程并不复杂难的是你敢不敢在日志里多停留几分钟。经验心得遇到 status 1不要重启服务先抓日志。每次重启都会让日志滚掉一部分反而增加定位难度。正确操作是把日志复制出来过滤关键字按 fatal、error、failed 逐个击破。5. 把坑挡在前面RHEL 9 系安装 Rancher 前的环境检查清单很多时候报错之所以发生是因为我们在安装前没做系统环境的检查和适配。RHEL 9 系不像旧版 CentOS 7 那么“随和”对容器运行时的前置要求更多。下面这份清单是我在多次部署后总结出来的适合任何要在 RHEL 9 系上跑 Rancher 的场景。5.1 系统级准备清单在正式开始安装 Rancher 之前按顺序过一遍更新系统基础包yum update -y设置好主机名和 hosts 解析hostnamectl set-hostname rancher-node echo 192.168.1.10 rancher-node /etc/hostsRancher 生成证书时依赖主机名解析主机名乱填会导致证书校验失败UI 访问时提示不安全。同步时间yum install -y chrony systemctl enable --now chronyd timedatectl set-ntp true时间偏差过大会导致 Rancher 内部组件 TLS 握手失败日志里会出现类似x509: certificate has expired or is not yet valid的报错。关闭 swap如果需要swapoff -a并注释 /etc/fstab 中 swap 相关行。处理 cgroup根据你选的 k3s 版本决定。如果是老版本直接加内核参数切 v1grubby --update-kernelALL --argssystemd.unified_cgroup_hierarchy0 reboot放行防火墙端口firewall-cmd --permanent --add-port6443/tcp firewall-cmd --permanent --add-port8472/udp firewall-cmd --permanent --add-port10250/tcp firewall-cmd --permanent --add-port2379/tcp firewall-cmd --reload确认 SELinux 策略包yum install -y container-selinux如果是自定义安装 k3s再装匹配版本的 k3s-selinux。加载内核模块modprobe ip_vs modprobe ip_vs_rr modprobe ip_vs_wrr modprobe ip_vs_sh modprobe br_netfilter这些模块和容器网络、Service 负载均衡有关缺了某些 k3s 版本也能跑但可能出现网络异常。调整内核参数cat /etc/sysctl.conf EOF net.bridge.bridge-nf-call-iptables 1 net.bridge.bridge-nf-call-ip6tables 1 net.ipv4.ip_forward 1 EOF sysctl -p这一步是为了保证 Kubernetes 的 Service 和 Pod 之间网络转发正常。5.2 还是失败这份速查表帮你快速对号入座就算你按清单准备了一遍仍然可能因为具体版本组合踩到不同的坑。以下是我把这次以及之前多次排查经验整理成的速查表建议收藏碰到问题直接对号入座报错关键字判断方向推荐操作cgroup2 mountpoint not foundcgroup v2 不兼容加内核参数切 v1或升级 k3s/Rancher 版本permission deniedSELinux 或目录权限临时 setenforce 0 验证装 k3s-selinux 策略包address already in use端口被占用ss 查占用停进程或改端口Failed to ensure iptablesnftables 兼容问题安装/切换 iptables-nft 后端x509: certificate has expired时间不同步配置 chronyd 并校准时间no space left on device磁盘或 inode 不足df -h / df -i 检查清理Failed to find memory cgroupcgroup 路径不匹配同上 cgroup 处理方案Failed to create shim taskcontainerd 初始化或 SELinux先看完整上下文多半是 SELinux 或存储驱动最后再分享一个我个人的习惯拿到一台全新 RHEL 9 系机器部署 Rancher 前我会先手动跑一遍 k3s 的单节点安装而不是直接上 Rancher。因为 Rancher 安装过程中的 k3s 日志往往被封装了一层直接看 k3s 自己的日志更干净。只要 k3s 能独立跑起来Rancher 装上去基本就是水到渠成的事。如果 k3s 单独启动也报 exit status 1那就用文章里的方法逐项排查问题一定会浮出水面。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价