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
'Cloud > Kubernetes' 카테고리의 다른 글
[v1.21] Kubeadm + Containerd + Calico + NFS-Provisioner + Ingress-Nginx 설치 (0) | 2021.05.22 |
---|---|
[kubeadm] kubernetes에 metrics-server 설치하기 (0) | 2021.02.15 |
[kubeadm] Hyper-V를 사용한 Kubernetes 설치 (1) | 2021.02.12 |
[Docker Desktop] 도커 데스크탑 쿠버네티스 인그레스 컨트롤러 설치 (0) | 2021.01.08 |
[K3S] 쿠버네티스 마스터 노드 부하 줄이기 (0) | 2021.01.04 |