5.12. 配置 fuse-overlayfs
默认情况下,通用基础镜像(UDI)包含 Podman 和 Buildah,您可以在工作区中构建和推送容器镜像。但是,UDI 中的 Podman 和 Buildah 被配置为使用 vfs 存储驱动程序,该驱动程序不提供写时复制支持。要更有效地镜像管理,请使用 fuse-overlayfs 存储驱动程序,该驱动程序在无根环境中支持 copy-on-write。
要为早于 4.15 的 OpenShift 版本启用 fuse-overlayfs,管理员必须首先通过 第 5.12.1 节 “为早于 4.15 的 OpenShift 版本启用访问” 在集群中启用 /dev/fuse 访问。
OpenShift 版本 4.15 及更高版本不需要这样做,因为 /dev/fuse 设备默认可用。请参阅 发行注记。
启用 /dev/fuse 访问后,可通过两种方式启用 fuse-overlayfs:
5.12.1. 为早于 4.15 的 OpenShift 版本启用访问 复制链接链接已复制到粘贴板!
要使用 fuse-overlayfs,您必须首先使 /dev/fuse 可以被工作区容器访问。
OpenShift 版本 4.15 及更新的版本不需要这个过程,因为 /dev/fuse 设备默认可用。请参阅 发行注记。
在 OpenShift 集群中创建 MachineConfig 资源是一个潜在的危险任务,因为您要对集群进行高级系统级更改。
查看 MachineConfig 文档 以了解更多详情和可能的风险。
流程
根据 OpenShift 集群的类型设置环境变量:单一节点集群,或使用单独的 control plane 和 worker 节点的多节点集群。
对于单一节点集群,请设置:
$ NODE_ROLE=master对于多节点集群,请设置:
$ NODE_ROLE=worker
为 OpenShift Butane 配置版本设置环境变量。此变量是 OpenShift 集群的主版本和次要版本。例如:
4.12.0、4.13.0或4.14.0。$ VERSION=4.12.0创建一个
MachineConfig资源,在NODE_ROLE节点上创建一个名为99-podman-fuse的 drop-in CRI-O 配置文件。此配置文件可让您访问某些 pod 的/dev/fuse设备。cat << EOF | butane | oc apply -f - variant: openshift version: ${VERSION} metadata: labels: machineconfiguration.openshift.io/role: ${NODE_ROLE} name: 99-podman-dev-fuse-${NODE_ROLE} storage: files: - path: /etc/crio/crio.conf.d/99-podman-fuse1 mode: 0644 overwrite: true contents:2 inline: | [crio.runtime.workloads.podman-fuse]3 activation_annotation = "io.openshift.podman-fuse"4 allowed_annotations = [ "io.kubernetes.cri-o.Devices"5 ] [crio.runtime] allowed_devices = ["/dev/fuse"]6 EOF应用
MachineConfig资源后,在应用更改时,会临时禁用具有worker角色的每个节点调度。查看节点的状态。$ oc get nodes输出示例:
NAME STATUS ROLES AGE VERSION ip-10-0-136-161.ec2.internal Ready worker 28m v1.27.9 ip-10-0-136-243.ec2.internal Ready master 34m v1.27.9 ip-10-0-141-105.ec2.internal Ready,SchedulingDisabled worker 28m v1.27.9 ip-10-0-142-249.ec2.internal Ready master 34m v1.27.9 ip-10-0-153-11.ec2.internal Ready worker 28m v1.27.9 ip-10-0-153-150.ec2.internal Ready master 34m v1.27.9当所有具有
worker角色的节点都处于Ready状态后,/dev/fuse可供带有以下注解的任何 pod 使用:io.openshift.podman-fuse: '' io.kubernetes.cri-o.Devices: /dev/fuse
验证步骤
获取具有
worker角色的节点名称:$ oc get nodes打开到 worker 节点的
oc debug会话。$ oc debug node/<nodename>验证存在名为
99-podman-fuse的新 CRI-O 配置文件。sh-4.4# stat /host/etc/crio/crio.conf.d/99-podman-fuse
5.12.1.1. 在工作区中为 Podman 和 Buildah 使用 fuse-overlayfs 复制链接链接已复制到粘贴板!
用户可遵循 https://access.redhat.com/documentation/zh-cn/red_hat_openshift_dev_spaces/3.23/html-single/user_guide/index#end-user-guide:using-the-fuse-overlay-storage-driver 来更新现有工作区,为 Podman 和 Buildah 使用 fuse-overlayfs 存储驱动程序。
5.12.2. 为所有工作区启用 fuse-overlayfs 复制链接链接已复制到粘贴板!
先决条件
- 第 5.12.1 节 “为早于 4.15 的 OpenShift 版本启用访问” 部分已完成。OpenShift 版本 4.15 及更新的版本不需要这样做。
-
对目标 OpenShift 集群具有管理权限的活动
oc会话。请参阅 CLI 入门。
流程
在 CheCluster 自定义资源的
spec.devEnvironments.workspacesPodAnnotations字段中设置所需的注解。kind: CheCluster apiVersion: org.eclipse.che/v2 spec: devEnvironments: workspacesPodAnnotations: io.kubernetes.cri-o.Devices: /dev/fuse注意对于 4.15 之前的 OpenShift 版本,还需要
io.openshift.podman-fuse: ""注解。注意通用基础镜像(UDI)在入口点脚本中包含以下逻辑来检测 fuse-overlayfs 并设置存储驱动程序。如果使用自定义镜像,您应该添加与镜像的入口点对应的逻辑。
if [ ! -d "${HOME}/.config/containers" ]; then mkdir -p ${HOME}/.config/containers if [ -c "/dev/fuse" ] && [ -f "/usr/bin/fuse-overlayfs" ]; then (echo '[storage]';echo 'driver = "overlay"';echo '[storage.options.overlay]';echo 'mount_program = "/usr/bin/fuse-overlayfs"') > ${HOME}/.config/containers/storage.conf else (echo '[storage]';echo 'driver = "vfs"') > "${HOME}"/.config/containers/storage.conf fi fi
验证步骤
启动工作区并验证存储驱动程序是否
覆盖。$ podman info | grep overlay输出示例:
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注意现有工作区可能会出现以下错误:
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在这种情况下,删除错误信息中所述的 libpod 本地文件。