본문으로 건너뛰기

빌드/배포

코드를 작성했다면, 이제 실제로 동작하는 서비스로 만들어야 합니다. KIWI는 복잡한 빌드/배포 과정을 몇 번의 클릭으로 처리할 수 있도록 도와드립니다.

이 가이드를 읽기 전에

서비스가 [서비스 관리] 페이지에 등록되어 있어야 합니다. 아직 등록하지 않았다면 서비스 등록 가이드를 먼저 참고하세요.


빌드 탭

배포 탭

왜 빌드/배포가 필요한가요?

개발한 코드를 사용자가 접근할 수 있는 서비스로 만들려면, 코드를 컨테이너 이미지로 패키징하고 서버에 배포해야 합니다. 이 과정을 수동으로 하면 실수가 발생하기 쉽고 시간도 많이 걸립니다.

KIWI는 이 과정을 자동화하여 일관성 있고 안정적인 배포를 가능하게 합니다.


빌드/배포 흐름

KIWI의 빌드/배포는 다음 단계로 진행됩니다:

  • 1. 빌드 설정 (최초 1회만): Dockerfile과 빌드 옵션을 구성합니다.
  • 2. 이미지 빌드 (2~10분): Kaniko로 소스 코드를 컨테이너 이미지로 변환합니다.
  • 3. 이미지 푸시 (1~3분): 빌드된 이미지를 Harbor/DockerHub에 저장합니다.
  • 4. 배포 (1~5분): Kubernetes 또는 Docker에 이미지를 배포합니다.
Kaniko란?

Kaniko는 Docker 데몬 없이 컨테이너 내부에서 이미지를 빌드할 수 있는 도구입니다. Kubernetes 환경에서 보안상 권한 상승 없이 안전하게 이미지를 빌드할 수 있어, 기업 환경에서 널리 사용됩니다.


CI 빌드 설정하기

서비스의 CI 빌드 파이프라인을 설정합니다. 한 번 설정하면 이후 빌드에 자동으로 적용됩니다.

Step 1: 서비스 상세 페이지 이동

[서비스 관리] 페이지에서 빌드할 서비스를 클릭하여 상세 페이지로 이동합니다.

Step 2: 빌드 탭에서 설정 열기

상단 탭에서 빌드 탭을 클릭한 후, 빌드 설정 버튼을 클릭하여 설정 모달을 엽니다.

Step 3: Dockerfile 설정

Dockerfile을 구성하는 방법을 선택합니다:

  • 자동 감지 (권장): 저장소 내 Dockerfile을 자동으로 찾습니다. 대부분의 프로젝트에 권장합니다.
  • 경로 지정: Dockerfile 경로를 직접 입력합니다. 여러 Dockerfile이 있을 때 사용합니다. (예: ./docker/Dockerfile.prod)
  • 빌드 마법사: KIWI가 Dockerfile을 자동 생성합니다. Dockerfile이 없는 프로젝트에서 사용하세요.
Dockerfile이 없어도 괜찮아요

빌드 마법사를 사용하면 Node.js, Python, Java 등 주요 언어에 맞는 Dockerfile을 자동으로 생성해 줍니다. 프로젝트 언어와 프레임워크만 선택하면 됩니다.

Step 4: 빌드 인자 설정 (선택사항)

필요한 경우 빌드 인자를 설정합니다:

  • 빌드 경로: Docker 빌드 시 사용할 파일들이 있는 폴더입니다. 기본값은 .(프로젝트 루트)입니다.
  • 빌드 인자(ARG): Dockerfile에 전달할 값입니다. 환경별 설정에 유용합니다.
    • 예: NODE_ENV=production, API_URL=https://api.example.com
  • 타겟 스테이지: 멀티스테이지 빌드에서 특정 단계까지만 빌드합니다.
빌드 경로란?

빌드 경로는 Dockerfile의 COPY, ADD 명령어가 접근할 수 있는 파일 범위를 결정합니다. 보통 프로젝트 루트(.)를 사용하지만, 모노레포 구조에서는 특정 하위 폴더를 지정할 수 있습니다.

Step 5: 이미지 레지스트리 설정

빌드된 이미지를 저장할 레지스트리 정보를 입력합니다:

  • 레지스트리 URL: Harbor 또는 DockerHub 주소 (예: harbor.company.com)
  • 프로젝트/네임스페이스: 이미지 저장 위치 (예: library)
  • 이미지 이름: 이미지 이름 (예: my-web-app)
  • 태그 규칙: 버전 태깅 방식

사용 가능한 태그 변수:

  • ${BRANCH}: Git 브랜치 이름입니다. (예: main)
  • ${SHORT_SHA}: 커밋 해시 앞 7자리입니다. (예: a1b2c3d)
  • ${TAG}: Git 태그입니다. (예: v1.0.0)
  • ${BUILD_NUMBER}: 빌드 번호입니다. (예: 42)

예: ${BRANCH}-${SHORT_SHA}main-a1b2c3d

Step 6: 빌드 트리거 설정

빌드가 실행되는 조건을 선택합니다:

  • 수동: 빌드 버튼 클릭 시에만 실행합니다. 테스트 빌드나 긴급 배포에 사용합니다.
  • 커밋 푸시: 특정 브랜치에 코드 푸시 시 자동으로 빌드합니다. 개발/스테이징 환경에 적합합니다.
  • 태그 생성: Git 태그 생성 시 자동으로 빌드합니다. 릴리스 배포에 사용합니다.
  • 스케줄: cron 스케줄 기반으로 정기 빌드합니다. 야간 빌드나 주간 빌드에 사용합니다.
환경별 권장 트리거 설정
  • develop 브랜치: 커밋 푸시 → 개발 환경 자동 배포
  • main 브랜치: 커밋 푸시 → 스테이징 환경 자동 배포
  • v 태그*: 태그 생성 → 운영 환경 배포

Step 7: 설정 저장

저장 버튼을 클릭하여 빌드 설정을 저장합니다.


컨테이너 이미지 빌드하기

설정이 완료되면 실제로 이미지를 빌드해 봅시다.

Step 1: 빌드 탭에서 브랜치 선택

[서비스 관리] → 서비스 선택 → 빌드 탭으로 이동합니다. 브랜치 선택 드롭다운에서 빌드할 브랜치를 선택합니다.

Step 2: 빌드 실행

빌드 시작 버튼을 클릭합니다. 빌드가 시작되면 실시간 로그 뷰어가 표시됩니다.

Step 3: 빌드 진행 상황 확인

빌드는 다음 단계로 진행됩니다:

  • 소스 클론 (10~30초): Git 저장소에서 코드를 가져옵니다.
  • Dockerfile 분석 (5~10초): 빌드 계획을 수립합니다.
  • 레이어 빌드 (1~5분): 이미지 레이어를 순차적으로 빌드합니다.
  • 이미지 푸시 (30초~2분): 완성된 이미지를 레지스트리에 업로드합니다.
빌드 로그 활용하기

빌드 중 오류가 발생하면 로그에서 error 또는 failed 키워드를 검색하세요. 대부분의 문제는 Dockerfile 문법 오류나 의존성 설치 실패입니다.

Step 4: 빌드 완료 확인

빌드가 완료되면 결과 화면에서 다음 정보를 확인합니다:

  • 빌드 상태: 성공 또는 실패
  • 이미지 태그: 생성된 이미지의 전체 경로와 태그
  • 이미지 크기: 최종 이미지 크기 (작을수록 배포가 빠릅니다)
  • 소요 시간: 빌드에 걸린 총 시간

Kubernetes에 배포하기

빌드된 이미지를 Kubernetes 클러스터에 배포합니다. Kubernetes는 컨테이너를 자동으로 관리하고, 장애 시 자동 복구해 주는 강력한 플랫폼입니다.

사전 준비
  • Kubernetes 클러스터가 **[런타임 환경]**에 등록되어 있어야 합니다.
  • 이미지가 빌드되어 레지스트리에 푸시되어 있어야 합니다.

Step 1: 배포 탭에서 환경 선택

[서비스 관리] → 서비스 선택 → 배포 탭으로 이동합니다. 배포할 환경을 선택합니다:

  • Development: 개발 환경입니다. 빠른 테스트에 적합하며 낮은 리소스를 사용합니다.
  • Staging: QA/테스트 환경입니다. 운영과 유사한 설정으로 구성합니다.
  • Production: 운영 환경입니다. 높은 가용성과 충분한 리소스를 할당합니다.

Step 2: 클러스터와 네임스페이스 선택

클러스터 선택 드롭다운에서 배포할 Kubernetes 클러스터를 선택하고, 네임스페이스를 지정합니다.

네임스페이스란?

네임스페이스는 Kubernetes에서 리소스를 논리적으로 분리하는 방법입니다. 예를 들어 development, staging, production 네임스페이스로 환경을 분리할 수 있습니다.

Step 3: 배포 설정 구성

배포에 필요한 설정을 입력합니다:

  • 이미지 태그: 배포할 이미지 버전 (예: main-abc123)
  • 레플리카 수: Pod 복제본 개수
레플리카 수 설정 가이드
  • 개발 환경: 1개면 충분합니다.
  • 스테이징: 2개 이상 권장 (운영과 유사하게)
  • 운영 환경: 최소 2개 이상 (가용성 확보)

레플리카가 2개 이상이면, 하나의 Pod에 문제가 생겨도 다른 Pod가 요청을 처리합니다.

Step 4: 리소스 설정

Pod에 할당할 CPU와 메모리를 설정합니다:

  • CPU 요청: 최소 보장 CPU입니다. (예: 100m = 0.1 코어)
  • CPU 제한: 최대 사용 CPU입니다. (예: 500m = 0.5 코어)
  • 메모리 요청: 최소 보장 메모리입니다. (예: 128Mi = 128 메가바이트)
  • 메모리 제한: 최대 사용 메모리입니다. (예: 512Mi = 512 메가바이트)
메모리 제한 주의

메모리 제한을 너무 낮게 설정하면 애플리케이션이 OOM(Out of Memory)으로 종료될 수 있습니다. 애플리케이션의 평균 메모리 사용량보다 여유 있게 설정하세요.

Step 5: 환경 변수 설정 (선택사항)

애플리케이션에 필요한 환경 변수를 설정합니다:

  • 직접 입력: 키-값 쌍을 직접 입력합니다.
  • ConfigMap 참조: Kubernetes ConfigMap에서 값을 가져옵니다.
  • Secret 참조: 비밀번호, API 키 등 민감한 정보는 Secret을 사용합니다.

Step 6: 배포 전략 선택

배포 전략에 따라 서비스 중단 여부가 달라집니다:

  • Rolling Update (기본 권장): 점진적으로 새 버전을 배포합니다. 서비스 중단 없이 배포되며, 대부분의 경우에 권장합니다.
  • Recreate: 기존 Pod를 종료한 후 새 버전을 배포합니다. 서비스 중단이 발생하며, DB 마이그레이션 등 특수한 경우에 사용합니다.
  • Blue-Green: 새 버전을 별도로 배포한 후 트래픽을 전환합니다. 서비스 중단 없이 배포되며, 즉시 롤백이 필요한 경우에 적합합니다.

Step 7: 배포 실행 및 상태 확인

배포 버튼을 클릭합니다. 배포 진행 상태를 실시간으로 모니터링할 수 있습니다.

배포가 완료되면 다음을 확인하세요:

  • Pod 상태: Running이어야 정상입니다.
  • 레플리카 수: Ready/Total이 일치해야 합니다 (예: 3/3)
  • 이벤트 로그: 오류가 없는지 확인합니다.

Docker/Podman에 배포하기

Kubernetes가 아닌 단일 서버 환경에서는 Docker 또는 Podman에 직접 배포할 수 있습니다. 설정이 간단하고 소규모 프로젝트에 적합합니다.

사전 준비

Docker/Podman 런타임이 **[런타임 환경]**에 등록되어 있어야 합니다.

Step 1: 배포 탭에서 Docker 선택

[서비스 관리] → 서비스 선택 → 배포 탭으로 이동합니다. 배포 유형에서 Docker를 선택하고, 런타임 드롭다운에서 대상 런타임을 선택합니다.

Step 2: 컨테이너 설정

컨테이너 정보를 입력합니다:

  • 컨테이너 이름: 컨테이너를 식별하는 이름입니다. (예: my-web-app)
  • 이미지 태그: 배포할 이미지 전체 경로입니다. (예: harbor.company.com/library/app:latest)
  • 포트 매핑: 호스트:컨테이너 포트를 지정합니다. (예: 8080:80)
포트 매핑 이해하기

8080:80은 "호스트의 8080 포트로 들어오는 요청을 컨테이너의 80 포트로 전달한다"는 의미입니다. 웹 애플리케이션은 보통 컨테이너 내부에서 80 또는 8080 포트를 사용합니다.

Step 3: 볼륨 마운트 설정 (선택사항)

컨테이너가 재시작되어도 데이터를 유지하려면 볼륨을 설정합니다:

  • 호스트 경로: 서버의 디렉토리 (예: /data/app)
  • 컨테이너 경로: 컨테이너 내 마운트 위치 (예: /app/data)
  • 읽기 전용: 설정 파일 등 변경이 불필요한 경우 체크
볼륨이 필요한 경우
  • 업로드된 파일을 저장하는 경우
  • 로그 파일을 호스트에 보관하는 경우
  • 데이터베이스 파일을 영속화하는 경우

Step 4: 환경 변수 설정 및 배포

필요한 환경 변수를 입력하고 배포 버튼을 클릭합니다.

배포가 완료되면 컨테이너 상태를 확인하세요:

  • Running: 정상 실행 중
  • Stopped: 중지됨 (수동 또는 오류)
  • Error: 오류 발생 (로그 확인 필요)

이전 버전으로 롤백하기

배포 후 문제가 발생했나요? 걱정하지 마세요. KIWI를 사용하면 몇 번의 클릭으로 이전 버전으로 돌아갈 수 있습니다.

롤백 전 확인사항

롤백하면 현재 버전의 변경사항이 모두 되돌려집니다. 데이터베이스 스키마 변경이 있었다면, 롤백 전에 데이터 마이그레이션 영향을 확인하세요.

Step 1: 배포 이력에서 롤백 대상 선택

[서비스 관리] → 서비스 선택 → 배포 탭에서 배포 이력 테이블을 확인합니다.

각 배포 항목에서 다음 정보를 확인할 수 있습니다:

  • 배포 시간: 언제 배포되었는지
  • 이미지 태그: 어떤 버전인지
  • 배포 상태: 성공/실패 여부
  • 배포자: 누가 배포했는지

Step 2: 롤백 실행

롤백할 배포 항목의 롤백 버튼을 클릭하고, 확인 모달에서 롤백 실행을 클릭합니다.

Step 3: 롤백 완료 확인

롤백이 완료되면 서비스 상태와 Pod 상태가 정상인지 확인합니다. Rolling Update 전략을 사용하면 롤백 중에도 서비스 중단이 없습니다.

빠른 롤백을 위한 팁

Blue-Green 배포 전략을 사용하면 트래픽만 전환하므로 롤백이 거의 즉시 완료됩니다. 중요한 서비스에는 Blue-Green 전략을 고려해 보세요.


빌드 시간 최적화

빌드가 5분 이상 걸린다면, 최적화가 필요할 수 있습니다. 다음 방법들로 빌드 시간을 크게 줄일 수 있습니다.

캐시 활용하기

빌드 설정에서 캐시 옵션을 활성화하세요:

  • 레이어 캐시: 변경되지 않은 Docker 레이어를 재사용합니다. 가장 효과적인 방법입니다.
  • 레지스트리 캐시: 레지스트리에 저장된 기존 이미지 레이어를 활용합니다. 첫 빌드를 제외하고 효과적입니다.
  • 로컬 캐시: 빌드 노드의 로컬 캐시를 사용합니다. 동일 노드에서 빌드할 때 효과적입니다.

Dockerfile 최적화 팁

빌드 속도를 높이는 베스트 프랙티스
  1. 변경이 적은 레이어를 앞에 배치: 의존성 설치(npm install, pip install)를 코드 복사보다 먼저 실행
  2. 멀티스테이지 빌드 사용: 빌드 도구는 빌드 스테이지에만, 최종 이미지에는 실행에 필요한 것만 포함
  3. .dockerignore 활용: node_modules, .git, 테스트 파일 등 불필요한 파일 제외
  4. 작은 베이스 이미지 사용: alpine 기반 이미지는 크기가 작아 빌드와 배포가 빠릅니다.

자주 묻는 질문

빌드가 실패합니다

원인 확인 방법:

  1. 빌드 로그에서 error 또는 failed 키워드 검색
  2. Dockerfile 문법 오류 확인 (들여쓰기, 명령어 순서)
  3. 의존성 설치 명령어 확인 (네트워크, 버전 호환성)

가장 흔한 원인은 의존성 설치 실패입니다. npm install이나 pip install 부분의 로그를 먼저 확인하세요.

이미지 푸시가 실패합니다

확인 사항:

  • 레지스트리 URL이 정확한지 확인
  • 인증 정보(사용자명/비밀번호 또는 토큰)가 올바른지 확인
  • 레지스트리에 프로젝트/네임스페이스가 존재하는지 확인

배포 후 Pod가 시작되지 않습니다

확인 사항:

  • ImagePullBackOff: 이미지 경로가 올바른지, 레지스트리 인증 Secret이 설정되어 있는지 확인
  • CrashLoopBackOff: 애플리케이션 시작 오류. 컨테이너 로그 확인 필요
  • Pending: 리소스(CPU/메모리)가 부족하거나 노드 스케줄링 문제

롤백이 안 됩니다

이전 이미지가 레지스트리에 존재해야 롤백이 가능합니다. 레지스트리의 이미지 보관 정책을 확인하세요.

이미지 보관 권장사항

최소 최근 10개 버전의 이미지는 보관하는 것을 권장합니다. 레지스트리에서 오래된 이미지 자동 삭제 정책을 설정할 때 주의하세요.


관련 가이드