튜토리얼: 오픈시프트에서 GitLab Runner Operator를 사용하여 rootless 컨테이너에서 Buildah 사용하기

Tier: Free, Premium, Ultimate Offering: GitLab.com, Self-Managed, GitLab Dedicated

이 튜토리얼은 오픈시프트 클러스터에서 GitLab Runner Operator를 사용하여 buildah 도구를 사용하여 이미지를 성공적으로 빌드하는 방법을 가르쳐줍니다.

이 가이드는 GitLab Runner Operator를 위한 rootless 오픈시프트 컨테이너에서 이미지 빌드하기 문서를 적용한 것입니다.

이 튜토리얼을 완료하려면 다음을 수행해야 합니다.

  1. Buildah 이미지 구성
  2. 서비스 계정 구성
  3. 작업 구성

전제 조건

  • gitlab-runner 네임스페이스에 이미 배포된 러너가 있어야 합니다.

Buildah 이미지 구성

우선 quay.io/buildah/stable:v1.23.1 이미지를 기반으로 사용자 정의 이미지를 준비합니다.

  1. Containerfile-buildah 파일을 생성합니다:

    cat > Containerfile-buildah <<EOF
    FROM quay.io/buildah/stable:v1.23.1
       
    RUN touch /etc/subgid /etc/subuid \
    && chmod g=u /etc/subgid /etc/subuid /etc/passwd \
    && echo build:10000:65536 > /etc/subuid \
    && echo build:10000:65536 > /etc/subgid
       
    # rootless 실행 시 기본 runc가 작동하지 않기 때문에 chroot 사용
    RUN echo "export BUILDAH_ISOLATION=chroot" >> /home/build/.bashrc
       
    # fuse가 작동하지 않기 때문에 VFS 사용
    RUN mkdir -p /home/build/.config/containers \
    && (echo '[storage]';echo 'driver = "vfs"') > /home/build/.config/containers/storage.conf
       
    # buildah 컨테이너는 `build` 사용자로 실행됩니다
    USER build
    WORKDIR /home/build
    EOF
    
  2. Buildah 이미지를 빌드하고 컨테이너 레지스트리에 푸시합니다. GitLab 컨테이너 레지스트리에 푸시해 보겠습니다:

    docker build -f Containerfile-buildah -t registry.example.com/group/project/buildah:1.23.1 .
    docker push registry.example.com/group/project/buildah:1.23.1
    

서비스 계정 구성

이러한 단계를 수행하려면 OpenShift 클러스터에 연결된 터미널에서 명령을 실행해야 합니다.

  1. 다음 명령을 실행하여 buildah-sa라는 서비스 계정을 생성합니다:

    oc create -f - <<EOF
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: buildah-sa
      namespace: gitlab-runner
    EOF
    
  2. 생성된 서비스 계정에 anyuid SCC 실행 권한을 부여합니다:

    oc adm policy add-scc-to-user anyuid -z buildah-sa -n gitlab-runner
    
  3. 러너(runner) 구성 템플릿을 사용하여 방금 생성한 서비스 계정을 사용하도록 Operator를 구성합니다. 다음을 포함하는 custom-config.toml 파일을 만듭니다:

    [[runners]]
      [runners.kubernetes]
          service_account_overwrite_allowed = "buildah-*"
    
  4. custom-config.toml 파일에서 ConfigMapcustom-config-toml을 생성합니다:

    oc create configmap custom-config-toml --from-file config.toml=custom-config.toml -n gitlab-runner
    
  5. 커스텀 리소스 정의(CRD) 파일을 업데이트하여 Runnerconfig 속성을 설정합니다:

    apiVersion: apps.gitlab.com/v1beta2
    kind: Runner
    metadata:
      name: builah-runner
    spec:
      gitlabUrl: https://gitlab.example.com
      token: gitlab-runner-secret
      config: custom-config-toml
    

작업 구성

마지막 단계는 프로젝트에서 사용할 GitLab CI/CD 구성 파일을 설정하여 빌드한 이미지와 구성된 서비스 계정을 사용하는 것입니다:

build:
  stage: build
  image: registry.example.com/group/project/buildah:1.23.1
  variables:
    STORAGE_DRIVER: vfs
    BUILDAH_FORMAT: docker
    BUILDAH_ISOLATION: chroot
    FQ_IMAGE_NAME: "$CI_REGISTRY_IMAGE/test"
    KUBERNETES_SERVICE_ACCOUNT_OVERWRITE: "buildah-sa"
  before_script:
    # GitLab 컨테이너 레지스트리에 로그인
    - buildah login -u "$CI_REGISTRY_USER" --password $CI_REGISTRY_PASSWORD $CI_REGISTRY
  script:
    - buildah images
    - buildah build -t $FQ_IMAGE_NAME
    - buildah images
    - buildah push $FQ_IMAGE_NAME

작업은 빌드한 이미지를 image 키워드의 값으로 사용해야 합니다.

KUBERNETES_SERVICE_ACCOUNT_OVERWRITE 변수는 생성한 서비스 계정의 이름이어야 합니다.

축하합니다! 이제 rootless 컨테이너에서 Buildah를 사용하여 이미지를 성공적으로 빌드했습니다.

문제 해결

비루트로 실행할 경우 알려진 문제가 있습니다. OpenShift 러너를 사용 중이라면 작업 환경을 수행해야 할 수도 있습니다.