如何在CI容器中通过Podman运行KIND集群?
解决容器内运行
kind create cluster的cgroup v2错误问题 核心问题分析
你遇到的错误是因为rootless模式下运行KIND必须依赖cgroup v2环境,而默认的容器环境(包括基于quay.io/podman/stable构建的镜像)未满足这个条件,同时宿主机的cgroup配置也会直接影响容器内的可用环境。
分步解决方案
1. 确保宿主机启用cgroup v2
容器的cgroup版本继承自宿主机,先确认并配置宿主机:
- 检查当前cgroup版本:
输出stat -fc %T /sys/fs/cgroup/cgroup2fs即为v2;若输出tmpfs则为v1。 - 若宿主机是v1,需添加启动参数
systemd.unified_cgroup_hierarchy=1(不同发行版配置位置不同,例如在/etc/default/grub的GRUB_CMDLINE_LINUX中添加后,执行grub2-mkconfig -o /boot/grub2/grub.cfg并重启)。
2. 修改Dockerfile,适配rootless运行
调整镜像安装rootless运行所需依赖,并配置普通用户环境:
FROM quay.io/podman/stable:latest # 安装rootless容器运行必备依赖 RUN yum update -y && yum install -y golang openssl uidmap slirp4netns fuse-overlayfs # 安装kubectl RUN curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" RUN install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl # 安装helm RUN curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash # 安装kind RUN go install sigs.k8s.io/kind@v0.20.0 && \ install -o root -g root -m 0755 /root/go/bin/kind /usr/local/bin/kind # 创建普通用户用于rootless运行 RUN useradd -m kind-user && \ echo "kind-user ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers # 初始化rootless podman环境 RUN su - kind-user -c "podman system migrate" # 切换到普通用户执行后续操作 USER kind-user
3. 用正确参数启动容器
运行容器时需传递权限和cgroup相关参数,确保容器能访问宿主机的cgroup v2环境:
podman run -it --rm \ --privileged \ --cgroupns=host \ --security-opt seccomp=unconfined \ --security-opt apparmor=unconfined \ <你的镜像名称>
4. 容器内启动KIND集群
进入容器后,设置环境变量指定使用podman作为provider,再创建集群:
export KIND_EXPERIMENTAL_PROVIDER=podman kind create cluster
关键说明
--privileged和--cgroupns=host:让容器直接复用宿主机的cgroup命名空间,确保cgroup v2环境可用- 普通用户运行:rootless模式要求非root用户执行,避免权限冲突
- 额外依赖:
uidmap、slirp4netns等是rootless容器网络和权限映射的必备工具
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

