튜토리얼: OpenShift에서 GitLab Runner Operator를 사용한 루트리스 컨테이너에서 Buildah 사용하기

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

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

이 가이드는 GitLab Runner Operator를 위한 루트리스 OpenShift 컨테이너에서 이미지를 빌드하는 방법 문서의 적응판입니다.

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

  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
    
    # 루트리스 실행시 기본 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. 러너 구성 템플릿을 사용하여 방금 만든 서비스 계정을 사용하도록 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. Custom Resource Definition (CRD) 파일을 업데이트하여 Runnerconfig 속성을 설정합니다. 해당 값을 작성해 Runner을 설정합니다.

    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 변수는 우리가 만든 서비스 계정의 값을 가져야 합니다.

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

문제 해결

루트가 아닌 사용자로 실행하는 데 문제가 있는 알려진 이슈가 있습니다. OpenShift 러너를 사용 중이라면 대처 방법을 사용해야 할 수 있습니다.