Cloud/Kubernetes

[Kaniko] Gitlab CI를 위해 Docker 대신 사용할 수 있는 이미지 빌드 툴

Docker 대신 Kaniko로 빌드 테스트를 하게 된 이유

Helm을 사용하여 쿠버네티스에 Gitlab을 배포하면, GItlab 내부에서 공유 가능한 Gitlab Runner(Option)가 같이 설치됩니다.

Gitlab Runner에서 컨테이너 이미지 빌드를 위해 보통 docker를 사용하지만,쿠버네티스의 CRI가 containerd인 환경에서는 Docker를 사용한 이미지 빌드를 사용할 수 없기 때문에 Kaniko로 빌드 테스트를 진행하게 되었습니다.

Kaniko를 이용한 Docker 이미지 빌드

Kaniko는 쿠버네티스 클러스터나 컨테이너 내에서 Dockerfile을 사용하여 컨테이너 이미지를 빌드하기 위한 도구입니다.

 

Kaniko는 Docker-in-Docker를 사용한 빌드에서 발생하는 두가지 문제를 해결합니다.

  • Docker-in-Docker는 privileged mode가 필요합니다. 이는 보안 문제가 될 수 있습니다.
  • Docker-in-Docker는 빌드 성능 저하를 일으켜 느립니다.

요구사항

아래 세가지 유형 중 하나 이상의 Gitlab-Runner Excutor를 사용할 수 있어야 합니다.

  • Kubernetes
  • Docker
  • Docker Machine

Kaniko를 사용한 도커 이미지 빌드

kaniko와 Gitlab CI/CD로 이미지를 빌드할 때, 중요한 몇 가지 사항이 있습니다.

  • Kaniko debug 이미지(gcr.io/kaniko-project/executor:debug) 사용을 권장합니다. 왜냐하면 debug 이미지는 Shell을 가지고 있고, Gitlab CI/CD 파이프라인 출력에는 Shell이 필요하기 때문입니다.
  • entrypoint를 ““으로 override해야 합니다. 그렇지 않으면 빌드 스크립트가 동작하지 않습니다.
  • Container Registry의 접속 정보를 /kaniko/.docker/config.json에 생성해야 합니다.
stages:
  - build

build:
  stage: build
  image:
    # 구글 공식 kaniko 이미지 repository 사용
    # debug 태그 이미지를 사용해야 파이프라인 출력 내용 확인 가능
    name: gcr.io/kaniko-project/executor:debug
    # entrypoint를 override 하지 않으면 아래 script 커맨드들이 실행되지 않음
    entrypoint: [""]
  script:
    # registry 접속 정보를 저장하기 위한 디렉토리 생성
    - mkdir -p /kaniko/.docker
    # Gitlab > Repository > Setting > CI/CD > Variables 사용
    # HARBOR_URL : harbor.example.com
    # HARBOR_USER : username
    # HARBOR_PASSWORD : userpassword
    - echo "{\"auths\":{\"$HARBOR_URL\":{\"username\":\"$HARBOR_USER\",\"password\":\"$HARBOR_PASSWORD\"}}}" > /kaniko/.docker/config.json
    # Gitlab에 미리 정의된 Variables 사용
    # CI_PROJECT_DIR : Dockerfile을 포함한 Source Repositry 경로
    # CI_COMMIT_SHORT_SHA : Commit SHA의 앞 8자를 tag로 사용
    - /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --destination $HARBOR_URL/$CI_PROJECT_PATH:$CI_COMMIT_SHORT_SHA

자체 서명된 인증 registry 사용

자체 서명된 인증을 사용하는 registry로 push하려는 경우, 아래와 같은 오류가 발생할 수 있습니다.

$ /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --no-push
INFO[0000] Downloading base image registry.gitlab.example.com/group/docker-image
error building image: getting stage builder for stage 0: Get https://registry.gitlab.example.com/v2/: x509: certificate signed by unknown authority

CA 인증서를 /kaniko/ssl/certs/additional-ca-cert-bundle.crt 로 저장하면 됩니다.

before_script:
  - mkdir -p /kaniko/.docker
  - echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" > /kaniko/.docker/config.json
  - |
    echo "-----BEGIN CERTIFICATE-----
    ...
    -----END CERTIFICATE-----" >> /kaniko/ssl/certs/additional-ca-cert-bundle.crt

참고 : Use kaniko to build Docker images | GitLab