4.12. 配置 fuse-overlayfs


默认情况下,通用基础镜像(UDI)包含 Podman 和 Buildah,您可以在工作区中构建和推送容器镜像。但是,UDI 中的 Podman 和 Buildah 被配置为使用 vfs 存储驱动程序,该驱动程序不提供写时复制支持。要更有效地镜像管理,请使用 fuse-overlayfs 存储驱动程序,该驱动程序在无根环境中支持 copy-on-write。

要为早于 4.15 的 OpenShift 版本启用 fuse-overlayfs,管理员必须首先通过 第 4.12.1 节 “为早于 4.15 的 OpenShift 版本启用访问” 在集群中启用 /dev/fuse 访问。

OpenShift 版本 4.15 及更高版本不需要这样做,因为 /dev/fuse 设备默认可用。请参阅 发行注记

启用 /dev/fuse 访问后,可通过两种方式启用 fuse-overlayfs:

4.12.1. 为早于 4.15 的 OpenShift 版本启用访问

要使用 fuse-overlayfs,您必须首先使 /dev/fuse 可以被工作区容器访问。

注意

OpenShift 版本 4.15 及更新的版本不需要这个过程,因为 /dev/fuse 设备默认可用。请参阅 发行注记

警告

在 OpenShift 集群中创建 MachineConfig 资源是一个潜在的危险任务,因为您要对集群进行高级系统级更改。

查看 MachineConfig 文档 以了解更多详情和可能的风险。

先决条件

  • Butane 工具(但ane)安装在您使用的操作系统中。
  • 对目标 OpenShift 集群具有管理权限的活动 oc 会话。请参阅 CLI 入门

流程

  1. 根据 OpenShift 集群的类型设置环境变量:单一节点集群,或使用单独的 control plane 和 worker 节点的多节点集群。

    • 对于单一节点集群,请设置:

      $ NODE_ROLE=master
    • 对于多节点集群,请设置:

      $ NODE_ROLE=worker
  2. 为 OpenShift Butane 配置版本设置环境变量。此变量是 OpenShift 集群的主版本和次要版本。例如: 4.12.04.13.04.14.0

    $ VERSION=4.12.0
  3. 创建一个 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-fuse 
    1
    
        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
    1
    CRI-O 的新置入配置文件的绝对路径。
    2
    新置入配置文件的内容。
    3
    定义 podman-fuse 工作负载。
    4
    激活 podman-fuse 工作负载设置的 pod 注解。
    5
    允许 podman-fuse 工作负载处理的注释列表。
    6
    用户可以使用 io.kubernetes.cri-o.Devices 注解指定的主机上的设备列表。
  4. 应用 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
  5. 当所有具有 worker 角色的节点都处于 Ready 状态后,/dev/fuse 可供带有以下注解的任何 pod 使用:

    io.openshift.podman-fuse: ''
    io.kubernetes.cri-o.Devices: /dev/fuse

验证步骤

  1. 获取具有 worker 角色的节点名称:

    $ oc get nodes
  2. 打开到 worker 节点的 oc debug 会话。

    $ oc debug node/<nodename>
  3. 验证存在名为 99-podman-fuse 的新 CRI-O 配置文件。

    sh-4.4# stat /host/etc/crio/crio.conf.d/99-podman-fuse

用户可遵循 https://access.redhat.com/documentation/zh-cn/red_hat_openshift_dev_spaces/3.18/html-single/user_guide/index#end-user-guide:using-the-fuse-overlay-storage-driver 来更新现有工作区,为 Podman 和 Buildah 使用 fuse-overlayfs 存储驱动程序。

4.12.2. 为所有工作区启用 fuse-overlayfs

了解配置工作区的容器入口点脚本,以便 fuse-overlayfs 用于该容器的所有工作区。

通用基础镜像(UDI)已默认包含必要的配置。但是,如果您使用自定义镜像,因为 Podman 5.x 需要 /home/user/.config 文件夹归当前用户拥有的,则必须手动配置脚本。

先决条件

流程

  1. 在 CheCluster 自定义资源的 spec.devEnvironments.workspacesPodAnnotations 字段中设置所需的注解。

    kind: CheCluster
    apiVersion: org.eclipse.che/v2
    spec:
      devEnvironments:
        workspacesPodAnnotations:
          io.kubernetes.cri-o.Devices: /dev/fuse
    注意

    对于 OpenShift 版本 4.14 和较低,还需要 io.openshift.podman-fuse: "" 注解。

  2. 可选: 如果您要将自定义镜像用于工作区容器,请创建 /home/user/.config 文件夹,并通过 entrypoint 在运行时配置 storage.conf 文件。为此,请在构建镜像前,将以下内容添加到工作区容器镜像的入口点脚本中。在入口点中创建 /home/user/.config 文件夹会导致 文件夹归当前用户所有,而在镜像构建时不知道。

    # Configure container builds to use vfs or 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

    这样可确保如果 /home/ user /.config 不存在,则文件夹 将被创建并由用户 所有。例如,如果 /home/user/.config 存储在持久性卷中,则它可能已存在。

  3. 启动一个工作区,并验证 /home/ user /.config 的所有者是用户。

    $ ls -la /home/user

    输出示例:

    ...
    drwxrwsr-x.  3 user 1000660000   24 Dec 24 15:40 .config
  4. 验证存储驱动程序是否已 覆盖

    $ podman info | grep overlay

    输出示例:

    graphDriverName: overlay
      overlay.mount_program:
        Executable: /usr/bin/fuse-overlayfs
        Package: fuse-overlayfs-1.14-1.el9.x86_64
          fuse-overlayfs: version 1.13-dev
      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 本地文件。

Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2026 Red Hat
返回顶部