튜토리얼: OpenShift의 GitLab Runner Operator로 rootless 컨테이너에서 Buildah 사용하기

튜토리얼: OpenShift의 GitLab Runner Operator로 rootless 컨테이너에서 Buildah 사용하기

GitLab Runner Operator를 사용해 배포된 GitLab Runner로 OpenShift 클러스터에서 buildah 도구를 이용해 이미지를 성공적으로 빌드하는 방법을 가르쳐 주는 튜토리얼이에요.

이 가이드는 rootless OpenShift 컨테이너에서 Buildah로 이미지 빌드하기 문서를 GitLab Runner Operator용으로 각색한 것이에요.

출처: 문서

본문

GitLab Runner Operator를 사용해 배포된 GitLab Runner로 OpenShift 클러스터에서 buildah 도구를 이용해 이미지를 성공적으로 빌드하는 방법을 가르쳐 주는 튜토리얼이에요.

이 튜토리얼을 완료하려면:

  1. Buildah 이미지를 구성하세요.
  2. 서비스 계정(service account)을 구성하세요.
  3. 작업을 구성하세요.

시작하기 전에

이 튜토리얼을 완료하기 전에 다음이 있는지 확인하세요.

  • 이미 gitlab-runner 네임스페이스에 배포된 러너.

Buildah 이미지 구성하기

quay.io/buildah/stable:v1.23.1 이미지를 기반으로 한 사용자 정의 이미지를 준비하는 것부터 시작할게요.

  1. Containerfile-buildah 파일을 만드세요.
    cat > Containerfile-buildah 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
    
    # Use chroot because the default runc does not work when running rootless
    RUN echo "export BUILDAH_ISOLATION=chroot" >> /home/build/.bashrc
    
    # Use VFS because fuse does not work
    RUN mkdir -p /home/build/.config/containers \
    && (echo '[storage]';echo 'driver = "vfs"') > /home/build/.config/containers/storage.conf
    
    # The buildah container will run as `build` user
    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 - 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 파일에서 custom-config-toml이라는 이름의 ConfigMap을 만드세요.
    oc create configmap custom-config-toml --from-file config.toml=custom-config.toml -n gitlab-runner
    
  5. Custom Resource Definition(CRD) 파일을 업데이트해 Runnerconfig 속성을 설정하세요.
    apiVersion: apps.gitlab.com/v1beta2
    kind: Runner
    metadata:
      name: buildah-runner
    spec:
      gitlabUrl: https://gitlab.example.com
      token: gitlab-runner-secret
      config: custom-config-toml
    

작업 구성하기

마지막 단계는 프로젝트에 새 Buildah 이미지와 구성된 서비스 계정을 사용하는 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:
    # Log in to the GitLab container registry
    - 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로 이미지를 성공적으로 빌드했어요!

문제 해결

비루트(non-root)로 실행할 때 알려진 이슈가 있어요. OpenShift 러너를 사용한다면 해결 방법(workaround)을 사용해야 할 수 있어요.

더 알아보기

Buildah를 통해 여러 CPU 아키텍처용 이미지를 함께 빌드하려면 Buildah로 멀티플랫폼 이미지 빌드하기 문서를 함께 보시면 좋아요. 또한 Docker 데몬 없이 이미지를 빌드하는 다른 방법에 관해서는 Docker를 대체하는 방법 문서도 참고할 수 있답니다.