본문 바로가기
DevOps

Kaniko

by 이강복 2023. 5. 23.

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

 

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

권한 문제

클라우드 내부에서 도커 이미지를 빌드한다는 것은 이미지 내부에서 이미지를 빌드한다는 의미와 같다. 일반적으로 도커 이미지를 빌드하기 위해서는 도커 데몬이 필요하고, 도커 데몬은 도커의 수행환경으로써 리눅스의 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는 빌드를 수행하고 결과를 이미지 레지스트리에 등록한다

 

Secret 생성

docker login
cat ~/.docker/config.json
cat ~/.docker/config.json | base64

 

regcred.yaml

apiVersion: v1
kind: Secret
metadata:
  name: docker-config-secret
data:
  .dockerconfigjson: "config.json을 base64로 인코딩한 데이터"
type: kubernetes.io/dockerconfigjson

 

kubectl apply -f regcred.yaml
mkdir /home/adminuser/kaniko

 

kaniko.yaml

apiVersion: v1
kind: Pod
metadata:
  name: kaniko
spec:
  containers:
  - name: kaniko
    image: gcr.io/kaniko-project/executor:latest
    args: [ "--dockerfile=./nginx/Dockerfile",
            "--context=git://github.com/kangbock/jenkins.git#refs/heads/main",
            "--destination=kangbock/nginx",
            "--skip-tls-verify=true",
            "--insecure=true" ]
    volumeMounts:
      - name: kaniko-secret
        mountPath: /kaniko/.docker
  restartPolicy: Never
  volumes:
    - name: kaniko-secret
      secret:
        secretName: docker-config-secret
        items:
          - key: .dockerconfigjson
            path: config.json

 

kubectl apply -f kaniko.yaml
kubectl logs pod/kaniko --follow

 

오류

더보기

 

또는 /kaniko/buildcontext 가 client에 있는지 확인 후 nginx에 있는 파일들 옮기기

 

kubernetes 내부에 들어가서 /kaniko/buildcontext에 nginx가 있지만 nginx안에 Dockerfile이 있으므로 경로를 추가해야했음

 

해결 완료

 

 

Kaniko로 도커 이미지 배포 완료

'DevOps' 카테고리의 다른 글

Jenkins + Argo CD (kaniko, harbor, cert-manager)  (0) 2023.08.11
Dapr with AKS  (0) 2023.06.09
Harbor  (1) 2023.05.23
ArgoCD Image Updater (현재 Beta 버전)  (0) 2023.02.24
Helm chart / kustomize  (0) 2023.02.24