인사이트

인사이트리포트

디지털프렌스포메이션 최신 정보 및 트렌드를 제공합니다.

오픈소스 SW 클라우드 플랫폼

Kaniko로 docker 없이 컨테이너 이미지 빌드하기

2022.09.26노문원 프로
다운로드

들어가며

클라우드 네이티브 어플리케이션을 클라우드에서 개발할 수 있다?

최근 클라우드 네이티브 CI/CD 기술이 빠르게 발전하고 있다. 클라우드의 장점인 유연성, 확장성을 활용하기 위해 개발 환경은 물론이고 CI/CD를 클라우드에 구축하는 경우가 증가하고 있다. 클라우드 서비스 제공자는 CI/CD를 주요 클라우드 서비스로 제공 중이며, 오픈소스 진영과 상용 제품들이 앞다투어 클라우드 네이티브 CI/CD 도구를 발표하고 경쟁 중이다. 클라우드 네이티브 CI/CD 기술은 여러 종류가 있지만 그 중 핵심인 이미지 빌드 기술에 대한 내용을 살펴보고 간단한 실습을 해보려고 한다.

 

클라우드 내에서 이미지 빌드의 문제점

권한 문제

클라우드 내부에서 도커 이미지를 빌드한다는 것은 이미지 내부에서 이미지를 빌드한다는 의미와 같다. 일반적으로 도커 이미지를 빌드하기 위해서는 도커 데몬이 필요하고, 도커 데몬은 도커의 수행환경으로써 리눅스의 root 권한을 필요로 한다. 그러나 컨테이너 환경의 유저에게 일반적으로 root 권한을 부여하지는 않는다. 도커 데몬의 권한에 대한 문제는 도커 보안 문서(https://docs.docker.com/engine/security/)에도 설명되어 있듯 신뢰할 수 있는 사용자에 국한하고 있다. 쿠버네티스 또한 컨테이너를 무분별하게 root 권한으로 수행하는 것을 방지하기 위하여 가이드를 제공하고 있다. (https://kubernetes.io/docs/concepts/security/) 이러한 가이드를 충족하기란 쉽지 않기에 클러스터 내부에서 안전하게 도커 빌드를 수행 할 수 있는 다른 방법을 찾아야 한다.

 

성능 문제

초기 Docker in Docker 기술의 성능이나 보안 문제는 많은 해결책이 나왔으며, Docker in Docker를 위한 공식 이미지(https://hub.docker.com/_/docker/)도 공개되어 있다.  그러나 해당 페이지에서 docker in docker 의 문제점에 대한 문서를 확인할 수 있으며 필요한 경우에만 사용을 권장하고 있다. 결국 빌드를 위해 클라우드 상에서 도커 데몬을 사용하는건 어려워 보인다.

 

해결 방안

위의 문제를 해결하기 위해 Kaniko (https://github.com/GoogleContainerTools/kaniko), BuildKit (https://github.com/moby/buildkit), Buildah (https://github.com/containers/buildah) 등의 오픈소스 프로젝트들이 존재한다. 이 프로젝트들은 도커 데몬 없이 도커 빌드를 수행하기 위한 기능들을 제공하고 있으며, 이중 유명한 프로젝트 중 하나인 Kaniko를 소개하겠다.

 

 

Kaniko로 이미지 빌드하기

Kaniko는 오픈소스 프로젝트이며 도커 이미지 형태로 제공된다. (https://github.com/GoogleContainerTools/kaniko)

 

 

Kaniko의 실행 단계를 보면 다음과 같다.

  1. 빌드 할 dockerfile의 위치 정보를 설정한다
  2. 빌드 후 이미지를 push할 레지스트리 정보를 설정한다
  3. Kaniko 이미지를 작동시킨다
  4. Kaniko는 빌드를 수행하고 결과를 이미지 레지스트리에 등록한다

 

이렇듯 Kaniko는 단순한 프로세스로 구성이 되어 있다. Kaniko 내부에는 도커 데몬 없이 Dockerfile을 빌드 할 수 있는 엔진이 구현되어 있으며 이로 인해 클러스터 내에서도 권한 문제 없이 안전하고 빠르게 도커 빌드를 수행 할 수가 있다. 이어서 Kaniko를 이용해서 Dockerfile을 빌드하는 간단한 예제를 알아보겠다.

 

수행환경

 

Secret 생성

생성된 이미지를 도커 레포지토리로 Push할 때 사용되는 계정 정보를 쿠버네티스 시크릿으로 생성한다.

 

  • –docker-server : 도커 레지스트리의 FQDN을 입력한다. Docker Hub을 사용한다면https://index.docker.io/v1/ 을 입력한다.
  • –docker-username : 도커 레지스트리 계정명을 입력한다.
  • –docker-password : 도커 레지스트리 계정의 비밀번호를 입력한다.
  • –docker-email : 도커 레지스트리 계정의 이메일을 입력한다.

 

Dockerfile 생성

빌드 할 이미지의 Dockerfile을 생성해서 git에 push합니다. 파일명은 변경 가능하고 본 예제에서는 dockerfile로 저장한다.

 

Pod 생성

Kaniko Pod 생성을 위한 yaml 파일을 작성한다. args에 Dockerfile이 있는 git 주소와 파일의 위치, 결과를 push할 레지스트리의 컨텍스트 정보를 입력한다. dockerfile은 git에 저장된 파일을 이용할 수 있고 쿠버네티스의 볼륨 마운트를 통해 파일로 전달하거나 tar.gz 형태의 아카이브로 입력 할 수 있다.

 

빌드 수행

설정이 완료되었으면 Pod를 수행한다. Pod는 Git에서 dockerfile을 checkout 한 뒤 도커 빌드를 수행하며, 그 결과를 도커 레지스트리에 push 할 것 이다.

 

결과 확인

도커 이미지를 수행하여 정상적으로 빌드 되었는지 확인한다.

 

 

마치며

클라우드 네이티브 CI/CD 기술의 핵심인 이미지 빌드에 대해 알아 보았습니다. 클라우드에 CI/CD 구축을 고려하는 경우 Kaniko는 좋은 대안 중 하나라고 생각 한다. 다만 Kaniko는 전용 도커 이미지 내부에서 빌드됨으로 kaniko를 직접 설치하여 빌드 명령어를 호출하는 작업이나 이미지를 복사하거나 태그를 변경하는 등의 이미지 관리는 불가능 하다. CI/CD 구성 중 이러한 빌드 명령이나 이미지 관리 등이 필요하다면 Kaniko 보다는 Buildah 같은 설치형 빌드 도구를 고려하는 것이 좋다. 이 경우 구성은 복잡해 지지만 docker deamon과 유사한 환경에서 작업을 수행 할 수 있다. 이러한 이미지 빌드 도구들은 단독으로 사용 시에도 기능을 발휘 할 수 있지만 클라우드 네이티브 CI/CD 툴들과 결합되면 진가를 발휘할 수 있다. 오픈 소스 툴들을 이용하여 클라우드 내에서 멋진 CI/CD 기능을 구축해 보길 바란다.

# References

- https://github.com/GoogleContainerTools/kaniko
- https://docs.docker.com/engine/
- https://cloud.google.com/blog/products/containers-kubernetes/introducing-kaniko-build-container-images-in-kubernetes-and-google-container-builder-even-without-root-access

노문원 프로

노문원 프로

에스코어 소프트웨어사업부 개발플랫폼그룹

엔터프라이즈 DevOps와 프레임워크에 관심이 많은 개발자 입니다. 현재 클라우드 기반의 웹IDE를 개발하고 있습니다.

연관 아티클

  • 클라우드 플랫폼2022.10.18

    AWS에서의 사용자 접근제어

    자세히 보기
  • IT 트렌드2022.10.04

    전통적 기업의 클라우드 전환

    자세히 보기
  • SW 테크놀로지2022.09.22

    우리는 왜 웹 환경에서 Noto Sans를 사용하는가?

    자세히 보기