1.5. 为 Podman 和 Buildah 使用 fuse-overlayfs 存储驱动程序
默认情况下,新创建的不使用 devfile 的工作区将使用通用基础镜像(UDI)。UDI 包含开发人员常用的开发工具和依赖项。
Podman 和 Buildah 包含在 UDI 中,允许开发人员从工作区构建和推送容器镜像。
默认情况下,UDI 中的 Podman 和 Buildah 被配置为使用 vfs
存储驱动程序。要更有效地镜像管理,请使用 fuse-overlayfs 存储驱动程序,该驱动程序在无根环境中支持 copy-on-write。
您必须在工作区中使用 fuse-overlayfs 的以下要求:
-
对于早于 4.15 的 OpenShift 版本,管理员已通过 https://access.redhat.com/documentation/zh-cn/red_hat_openshift_dev_spaces/3.21/html-single/administration_guide/index#administration-guide:configuring-fuse 在集群中启用了
/dev/fuse
访问。 -
工作区具有使用
/dev/fuse
设备所需的注解。请参阅 第 1.5.1 节 “访问 /dev/fuse”。 -
工作区容器中的
storage.conf
文件已配置为使用 fuse-overlayfs。请参阅 第 1.5.2 节 “使用 ConfigMap 启用 fuse-overlayfs”。
其他资源
1.5.1. 访问 /dev/fuse
您必须有权访问 /dev/fuse
,才能使用 fuse-overlayfs。本节论述了如何使 /dev/fuse
可以被工作区容器访问。
先决条件
-
对于早于 4.15 的 OpenShift 版本,管理员已按照 https://access.redhat.com/documentation/zh-cn/red_hat_openshift_dev_spaces/3.21/html-single/administration_guide/index#administration-guide:configuring-fuse 启用对
/dev/fuse
的访问。 - 确定要使用 fuse-overlayfs 的工作区。
流程
使用
pod-overrides
属性将 https://access.redhat.com/documentation/zh-cn/red_hat_openshift_dev_spaces/3.21/html-single/administration_guide/index#administration-guide:configuring-fuse 中定义的所需注解添加到工作区。pod-overrides
属性允许合并工作区 pod 的spec
中的某些字段。对于早于 4.15 的 OpenShift 版本:
oc patch devworkspace <DevWorkspace_name> \ --patch '{"spec":{"template":{"attributes":{"pod-overrides":{"metadata":{"annotations":{"io.kubernetes.cri-o.Devices":"/dev/fuse","io.openshift.podman-fuse":""}}}}}}}' \ --type=merge
$ oc patch devworkspace <DevWorkspace_name> \ --patch '{"spec":{"template":{"attributes":{"pod-overrides":{"metadata":{"annotations":{"io.kubernetes.cri-o.Devices":"/dev/fuse","io.openshift.podman-fuse":""}}}}}}}' \ --type=merge
Copy to Clipboard Copied! 对于 OpenShift 版本 4.15 及更新的版本:
oc patch devworkspace <DevWorkspace_name> \ --patch '{"spec":{"template":{"attributes":{"pod-overrides":{"metadata":{"annotations":{"io.kubernetes.cri-o.Devices":"/dev/fuse"}}}}}}}' \ --type=merge
$ oc patch devworkspace <DevWorkspace_name> \ --patch '{"spec":{"template":{"attributes":{"pod-overrides":{"metadata":{"annotations":{"io.kubernetes.cri-o.Devices":"/dev/fuse"}}}}}}}' \ --type=merge
Copy to Clipboard Copied!
验证步骤
启动工作区,并验证
/dev/fuse
是否在工作区容器中可用。stat /dev/fuse
$ stat /dev/fuse
Copy to Clipboard Copied!
完成此步骤后,按照 第 1.5.2 节 “使用 ConfigMap 启用 fuse-overlayfs” 中的步骤为 Podman 使用 fuse-overlayfs。
1.5.2. 使用 ConfigMap 启用 fuse-overlayfs
您可以在 ~/.config/containers/storage.conf
文件中定义 Podman 和 Buildah 的存储驱动程序。以下是 UDI 容器中 /home/user/.config/containers/storage.conf
文件的默认内容:
storage.conf
[storage] driver = "vfs"
[storage]
driver = "vfs"
要使用 fuse-overlayfs,storage.conf
可以设置为以下内容:
storage.conf
[storage] driver = "overlay" [storage.options.overlay] mount_program="/usr/bin/fuse-overlayfs"
[storage]
driver = "overlay"
[storage.options.overlay]
mount_program="/usr/bin/fuse-overlayfs"
- 1
fuse-overlayfs
二进制文件的绝对路径。/usr/bin/fuse-overlayfs
路径是 UDI 的默认路径。
您可以在启动工作区后手动执行此操作。另一种选择是基于 UDI 构建新镜像,并更改 storage.conf
,并将新镜像用于工作区。
否则,您可以通过创建一个挂载更新文件的 ConfigMap,为项目中的所有工作区更新 /home/user/.config/containers/storage.conf
。请参阅 第 6.2 节 “挂载 ConfigMap”。
先决条件
-
对于早于 4.15 的 OpenShift 版本,管理员已按照 https://access.redhat.com/documentation/zh-cn/red_hat_openshift_dev_spaces/3.21/html-single/administration_guide/index#administration-guide:configuring-fuse 启用对
/dev/fuse
的访问。 - 如下设置带有所需注解的工作区: 第 1.5.1 节 “访问 /dev/fuse”
由于按照 本指南 挂载的 ConfigMap 将 ConfigMap 的数据挂载到所有工作区,因此此流程会将存储驱动程序设置为 fuse-overlayfs。确保工作区包含使用以下 第 1.5.1 节 “访问 /dev/fuse” 来使用 fuse-overlayfs 所需的注解。
流程
应用在项目中挂载
/home/user/.config/containers/storage.conf
文件的 ConfigMap。kind: ConfigMap apiVersion: v1 metadata: name: fuse-overlay labels: controller.devfile.io/mount-to-devworkspace: 'true' controller.devfile.io/watch-configmap: 'true' annotations: controller.devfile.io/mount-as: subpath controller.devfile.io/mount-path: /home/user/.config/containers data: storage.conf: | [storage] driver = "overlay" [storage.options.overlay] mount_program="/usr/bin/fuse-overlayfs"
kind: ConfigMap apiVersion: v1 metadata: name: fuse-overlay labels: controller.devfile.io/mount-to-devworkspace: 'true' controller.devfile.io/watch-configmap: 'true' annotations: controller.devfile.io/mount-as: subpath controller.devfile.io/mount-path: /home/user/.config/containers data: storage.conf: | [storage] driver = "overlay" [storage.options.overlay] mount_program="/usr/bin/fuse-overlayfs"
Copy to Clipboard Copied! 警告创建此 ConfigMap 将导致所有正在运行的工作区重启。
验证步骤
启动包含所需注解的工作区,并验证存储驱动程序是否已
覆盖
。podman info | grep overlay
$ podman info | grep overlay
Copy to Clipboard Copied! 输出示例:
graphDriverName: overlay overlay.mount_program: Executable: /usr/bin/fuse-overlayfs Package: fuse-overlayfs-1.12-1.module+el8.9.0+20326+387084d0.x86_64 fuse-overlayfs: version 1.12 Backing Filesystem: overlayfs
graphDriverName: overlay overlay.mount_program: Executable: /usr/bin/fuse-overlayfs Package: fuse-overlayfs-1.12-1.module+el8.9.0+20326+387084d0.x86_64 fuse-overlayfs: version 1.12 Backing Filesystem: overlayfs
Copy to Clipboard Copied! 注意现有工作区可能会出现以下错误:
ERRO[0000] User-selected graph driver "overlay" overwritten by graph driver "vfs" from database - delete libpod local files ("/home/user/.local/share/containers/storage") to resolve. May prevent use of images created by other tools
ERRO[0000] User-selected graph driver "overlay" overwritten by graph driver "vfs" from database - delete libpod local files ("/home/user/.local/share/containers/storage") to resolve. May prevent use of images created by other tools
Copy to Clipboard Copied! 在这种情况下,删除错误信息中所述的 libpod 本地文件。