3.12. 配置 fuse-overlayfs
默认情况下,通用基础镜像(UDI)包含 Podman 和 Buildah,您可以在工作区中构建和推送容器镜像。但是,UDI 中的 Podman 和 Buildah 被配置为使用 vfs
存储驱动程序,该驱动程序不提供写时复制支持。要更有效地镜像管理,请使用 fuse-overlayfs 存储驱动程序,该驱动程序在无根环境中支持 copy-on-write。
要为早于 4.15 的 OpenShift 版本启用 fuse-overlayfs,管理员必须首先通过 第 3.12.1 节 “为早于 4.15 的 OpenShift 版本启用访问” 在集群中启用 /dev/fuse
访问。
OpenShift 版本 4.15 及更高版本不需要这样做,因为 /dev/fuse
设备默认可用。请参阅 发行注记。
启用 /dev/fuse
访问后,可通过两种方式启用 fuse-overlayfs:
3.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-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
应用
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
3.12.1.1. 在工作区中为 Podman 和 Buildah 使用 fuse-overlayfs
用户可遵循 https://access.redhat.com/documentation/zh-cn/red_hat_openshift_dev_spaces/3.15/html-single/user_guide/index#end-user-guide:using-the-fuse-overlay-storage-driver 来更新现有工作区,为 Podman 和 Buildah 使用 fuse-overlayfs 存储驱动程序。
3.12.2. 为所有工作区启用 fuse-overlayfs
先决条件
- 第 3.12.1 节 “为早于 4.15 的 OpenShift 版本启用访问” 部分已完成。OpenShift 版本 4.15 及更新的版本不需要这样做。
-
对目标 OpenShift 集群具有管理权限的活动
oc
会话。请参阅 CLI 入门。
流程
创建一个 ConfigMap,为所有用户工作区挂载
storage.conf
文件。kind: ConfigMap apiVersion: v1 metadata: name: fuse-overlay namespace: openshift-devspaces labels: app.kubernetes.io/part-of: che.eclipse.org app.kubernetes.io/component: workspaces-config 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"
在 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: ""
注解。
验证步骤
启动工作区并验证存储驱动程序是否
覆盖
。$ 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