7.10. /dev/fuse를 사용하여 더 빠른 빌드에 액세스하기
/dev/fuse 장치로 포드를 구성하면 특히 권한이 없는 사용자의 경우 컨테이너 이미지를 더 빠르고 효율적으로 빌드할 수 있습니다. 이 장치를 사용하면 권한이 없는 Pod에서 오버레이 파일 시스템을 마운트할 수 있으며 Podman과 같은 툴에서 활용할 수 있습니다.
7.10.1. 포드에서 권한이 없는 빌드를 위해 /dev/fuse 구성 링크 복사링크가 클립보드에 복사되었습니다!
권한이 없는 Pod에 /dev/fuse 장치를 노출하여 사용자 공간(FUSE) 마운트를 수행할 수 있는 기능을 부여할 수 있습니다. 이 설정을 사용하면 Pod 내의 권한이 없는 사용자는 Pod에 대한 전체 권한 권한을 부여하지 않고 권한 있는 빌드 기능을 안전하고 효율적인 방식으로 fuse-overlayfs 와 같은 스토리지 드라이버와 함께 podman 과 같은 툴을 사용할 수 있습니다.
Pod 정의에 io.kubernetes.cri-o.Devices: " 장치를 노출합니다.
/dev/fuse " 주석을 추가하여 /dev/fuse
프로세스
/dev/fuse액세스로 포드를 정의합니다.다음 내용으로
fuse-builder-pod.yaml이라는 YAML 파일을 만듭니다.apiVersion: v1 kind: Pod metadata: name: fuse-builder-pod annotations: io.kubernetes.cri-o.Devices: "/dev/fuse" spec: containers: - name: build-container image: quay.io/podman/stable command: ["/bin/sh", "-c"] args: ["echo 'Container is running. Use oc exec to get a shell.'; sleep infinity"] securityContext: runAsUser: 1000다음과 같습니다.
metadata.annotations-
io.kubernetes.cri-o.Devices: "/dev/fuse"주석이 FUSE 장치를 사용하도록 지정합니다. spec.containers.image-
podman을 포함하는 이미지를 사용하는 컨테이너를 지정합니다(예:quay.io/podman/stable). spec.containers.args-
실행할 수 있도록 컨테이너 실행을 유지하기 위한 명령을 지정합니다.
spec.containers.securityContext컨테이너를 권한이 없는 사용자로 실행하는
securityContext(예:runAsUser: 1000)를 지정합니다.참고클러스터의 보안 컨텍스트 제약(SCC) 또는 기타 정책에 따라
securityContext사양을 추가로 조정해야 할 수도 있습니다. 예를 들어,/dev/fuse만으로는fuse-overlayfs가작동하기에 충분하지 않은 경우 특정 기능을 허용해야 할 수 있습니다.
다음 명령을 실행하여 Pod를 생성합니다.
$ oc apply -f fuse-builder-pod.yaml
다음 명령을 실행하여 포드가 실행 중인지 확인합니다.
$ oc get pods fuse-builder-pod포드에 접근하여 빌드 환경을 준비합니다.
fuse-builder-podPod가Running상태인 후 다음 명령을 실행하여build-container환경으로 쉘 세션을 엽니다.$ oc exec -ti fuse-builder-pod -- /bin/bash이제 컨테이너 안에 들어왔습니다.
권한이 없는 사용자가 기본 작업 디렉터리를 쓸 수 없으므로 다음 명령을 실행하여
/tmp와 같은 쓰기 가능한 디렉터리로 변경합니다.$ cd /tmp$ pwd/tmp
dockerfile을 생성하고 Podman을 사용하여 이미지를 빌드합니다.
이제 포드 셸 내부와
/tmp디렉토리에서Dockerfile을만들고podman을사용하여 컨테이너 이미지를 빌드할 수 있습니다.fuse-overlayfs가기본 또는 구성된 스토리지 드라이버인 경우 Podman은 사용 가능한/dev/fuse장치 덕분에fuse-overlayfs를활용할 수 있습니다.샘플
Dockerfile을만듭니다.$ cat > Dockerfile <<EOF FROM registry.access.redhat.com/ubi9/ubi-minimal RUN microdnf install -y findutils && microdnf clean all RUN echo "This image was built inside a pod with /dev/fuse by user $(id -u)" > /app/build_info.txt COPY Dockerfile /app/Dockerfile_copied WORKDIR /app CMD ["sh", "-c", "cat /app/build_info.txt && echo '--- Copied Dockerfile ---' && cat /app/Dockerfile_copied"] EOF다음 명령을 실행하여 이미지를 빌드합니다.
-t플래그는 이미지에 태그를 지정합니다.$ podman build -t my-fuse-built-image:latest .Podman이 빌드 단계를 실행하는 것을 볼 수 있습니다.
선택 사항: 빌드된 이미지를 테스트합니다.
fuse-builder-pod내부에서 다음 명령을 실행하여 빌드한 이미지에서 컨테이너를 실행할 수 있습니다.$ podman run --rm my-fuse-built-image:latest이렇게 하면
/app/build_info.txt파일과 복사된 Dockerfile의 내용이 출력됩니다.포드에서 나와 청소하세요:
완료되면 다음 명령을 실행하여 Pod의 쉘 세션을 종료합니다.
$ exit다음 명령을 실행하여 더 이상 필요하지 않은 경우 Pod를 삭제합니다.
$ oc delete pod fuse-builder-pod다음 명령을 실행하여 로컬 YAML 파일을 제거합니다.
$ rm fuse-builder-pod.yaml