7.10. 使用 /dev/fuse 访问更快的构建
您可以使用 /dev/fuse
设备配置 pod,以启用更快、更有效的容器镜像构建,特别是针对非特权用户。此设备允许非特权 pod 挂载覆盖文件系统,这可通过 Podman 等工具利用。
7.10.1. 为 pod 中的非特权构建配置 /dev/fuse 复制链接链接已复制到粘贴板!
通过将 /dev/fuse
设备公开给非特权 pod,您可以授予其在用户空间 (FUSE) 挂载中执行 Filesystem 的功能。这可以通过在 pod 定义中添加 io.kubernetes.cri-o.Devices: "/dev/fuse"
注解来实现。此设置允许 pod 中的非特权用户使用带有存储驱动程序的 podman
等工具,如 fuse-overlayfs
,以安全且有效的方式模拟特权构建功能,而无需授予 pod 的完整特权访问权限。
流程
使用
/dev/fuse
访问定义 pod:使用以下内容创建名为
fuse-builder-pod.yaml
的 YAML 文件:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意根据集群的安全上下文约束(SCC)或其他策略,您可能需要进一步调整
securityContext
规格,例如,如果只有/dev/fuse
无法满足fuse-overlayfs
的操作要求时允许特定容量。运行以下命令来创建 pod:
oc apply -f fuse-builder-pod.yaml
$ oc apply -f fuse-builder-pod.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证 Pod 是否在运行:
oc get pods fuse-builder-pod
$ oc get pods fuse-builder-pod
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 访问 pod 并准备构建环境:
在
fuse-builder-pod
pod 处于Running
状态后,在build-container
环境中打开一个 shell 会话:oc exec -ti fuse-builder-pod -- /bin/bash
$ oc exec -ti fuse-builder-pod -- /bin/bash
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您现在已在容器内。因为默认的工作目录可能无法被非特权用户写入,所以更改到
/tmp
等可写目录:cd /tmp pwd
$ cd /tmp $ pwd /tmp
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建 dockerfile 并使用 Podman 构建镜像:
在 pod 的 shell 和
/tmp
目录中,您现在可以创建一个Dockerfile
,并使用podman
构建容器镜像。如果fuse-overlayfs
是默认或已配置的存储驱动程序,则 Podman 可能会因为可用的/dev/fuse
设备而利用fuse-overlayfs
。创建示例
Dockerfile
:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
podman
构建镜像。-t
标志标记镜像:podman build -t my-fuse-built-image:latest .
$ podman build -t my-fuse-built-image:latest .
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您应该会看到执行构建步骤的 Podman。
可选:测试构建的镜像:
仍在
fuse-builder-pod
中,您可以从刚才构建的镜像中运行容器:podman run --rm my-fuse-built-image:latest
$ podman run --rm my-fuse-built-image:latest
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 这应该输出
/app/build_info.txt
文件的内容以及复制的 Dockerfile。退出 pod 并清理:
完成后,退出 pod 中的 shell 会话:
exit
$ exit
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 然后,如果不再需要 pod,可以删除它:
oc delete pod fuse-builder-pod
$ oc delete pod fuse-builder-pod
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 删除本地 YAML 文件:
rm fuse-builder-pod.yaml
$ rm fuse-builder-pod.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow