解决 Ubuntu 22.04 下安装 Rancher 出现与 Docker 不兼容的问题

好不容易开到了 Oracle 的 Arm 机器,因为内存还是比较多的,所以打算用 Rancher 安装 k8s 使用。由于以前在生产环境使用 Ubuntu 安装过 Rancher,所以直接上手,可没想到这次一路波折。 因为 CentOS 8 已经停止维护了,Oracle 上面 CentOS 的镜像也更新成为了 CentOS Stream,加上也不太想用 Oracle Linux,所以直接开了最新的 Ubuntu 22.04,噩梦开始的地方。

最开始还是采用 Docker 的方式安装 Rancher,结果发现 Rancher 容器不断重启。查询日志后发现,在打印一些日志之后,每次都会出现 k3s exited with: exit status 1 错误。 由于之前的生产环境是 Ubuntu 20.04,而且 Rancher 官网并没有严格的操作系统支持说明,所以首先还是怀疑是系统问题。但是由于 Oracle Cloud 并没有提供重装系统功能,如果想初始化就只能删除重开机器。 加上 Arm 机器众所周知的原因,所以不敢冒险尝试删除重建机器。不过既然报错是 k3s 初始化失败,那么就自行安装 k3s 试一下,看一下具体的报错问题。k3s 安装过程果然报错, 输入 journalctl -xeu k3s.service 查看一下报错详情:

1
Failed to get unit file state for nm-cloud-setup.service: No such file or directory

看来是 Oracle 安装的 Ubuntu 没有自带网络服务,安装之后再试一下:

1
apt-get install network-manager

发现还是报错,再来看一眼报错详情:

1
Failed to run kubelet" err="failed to run Kubelet: misconfiguration: kubelet cgroup driver: \"cgroupfs\" is different from docker cgroup driver: \"systemd\""

这下问题就清楚了,原来 k8s 默认使用的 cgroup 是 cgroupfs,而 Docker 所使用的 cgroup 是 systemd,两者不一致。执行 docker info 我们也确实可以看到 Cgroup Driver: systemd。 搜寻了一下发现解决办法也很简单,要么指定 k8s 使用 systemd 的 cgroup,要么设置 Docker 使用 cgroupfs。由于 k3s 是自行初始化的,加之在安装 Rancher 的时候并没有给我们设置 k3s 的地方, 所以只能修改 Docker 的 cgroup 为 cgroupfs

创建或修改 /etc/docker/daemon.json 文件,添加如下内容后重启 docker:

1
2
3
{
"exec-opts": ["native.cgroupdriver=cgroupfs"]
}

再次执行 docker info 我们可以看到 cgroup 已经修改生效了:Cgroup Driver: cgroupfs

重启 k3s,发现 k3s 已经可以成功启动了。然后执行 /usr/local/bin/k3s-uninstall.sh 卸载 k3s,再安装一遍 rancher 来看一下。 结果发现还是在报错,这就很奇怪了,明明自己安装 k3s 是没有问题的了。 无奈只能去求助 Google,虽然看到了很多类似问题,但是一直未找到有效回复。 一番搜索后,发现 GitHub 上有个 Issue:k3s exited with: exit status 1。 虽然他是使用的 Debian 11,日志多打印出来了很多,不过最终的报错都是一样的。而且更重要的是,他所贴出的 docker 信息表名他 docker 的 cgroup 也是 systemd。 然后发现仅有的一条来自贡献者的回复成为了关键,他说 Debian 11 默认使用 cgroup v2,这与 k3s 并不兼容,需要将其切换到 cgroup v1。 好家伙,原来 cgroup 还有版本的问题,看来我们也要将 cgroup 切换到 v1。 在 Docker 的官方文档中找到了切换的方法:Changing cgroup version。 因为 Ubuntu 没有自带 grubby 命令,所以采用的是第二种手动修改 grub 引导文件的方式。

执行 sudo vi /etc/default/grub,添加 systemd.unified_cgroup_hierarchy=0GRUB_CMDLINE_LINUX 参数中,如果原来有内容记得保留,空格分割。

1
GRUB_CMDLINE_LINUX="systemd.unified_cgroup_hierarchy=0"

然后执行 sudo update-grub 更新下引导,重启之后发现 Rancher 可以正常安装了。