학습 목표
CI(Continuous Integration)와 CD(Continuous Delivery/Deployment) 차이를 설명할 수 있다.
build → test → scan → deploy 파이프라인 단계와 실패 시 중단 원칙을 설명할 수 있다.
아티팩트(이미지·바이너리) 불변성과 환경별 설정 분리를 설명할 수 있다.
Kubernetes Deployment·ConfigMap·Secret과 CI/CD가 어디서 만나는지 설명할 수 있다.
문제 상황
main에 merge했는데 로컬에서만 돌아갔다- 통합 빌드·테스트 없음 — CI 부재
- staging은 OK인데 production 배포 후 설정·버전이 달랐다
- 다른 바이너리를 다시 빌드해 배포
- 배포마다 서버에 SSH로 수동
docker pull·kubectl apply- 자동화·감사 추적 없음
- 취약점 스캔 없이 이미지만 올렸더니 CVE가 프로덕션까지
- scan 단계 누락
- dev·staging·prod가 같은 DB·같은 Secret을 공유
- 환경 분리·설정 주입 실패
- “CI/CD 했다”는데 배포는 여전히 수동 — CD가 없음
앞서 Kubernetes 워크로드·스케줄링까지 봤다. Part 3 DevOps는 코드가 클러스터에 도달하기까지의 파이프라인이다.
1. CI vs CD

| CI | CD | |
|---|---|---|
| 목적 | 변경을 자주·안전하게 통합 | 검증된 빌드를 환경에 전달 |
| 시점 | commit·PR마다 | CI 성공 후 (또는 태그·승인) |
| 산출 | 테스트 결과·아티팩트 | 배포된 런타임 상태 |
| 실패 | merge·배포 차단 | 롤백·이전 아티팩트 |
CI — every change: build · test · scan → artifact
CD — verified artifact → staging → production
- Continuous Integration — 팀 코드를 하루에 여러 번 main에 통합, 자동 검증
- Continuous Delivery — production 배포 직전까지 자동, prod는 승인 가능
- Continuous Deployment — CI 통과 시 prod까지 자동 (조직·규제에 따라 선택)
- 오리엔테이션 Delivery Pipeline — Code → CI → Artifact → CD → Runtime — 이번 편에서 단계를 쪼갠다
2. 파이프라인 단계

| 단계 | 역할 | 실패 시 |
|---|---|---|
| build | 컴파일·이미지 빌드·패키징 | 파이프라인 중단 |
| test | unit·integration·contract | merge/deploy 차단 |
| scan | SAST·이미지 CVE·의존성 | 정책 위반 시 중단 |
| deploy | K8s·클라우드에 적용 | 롤백·알림 |
stages:
- build # docker build, mvn package
- test # pytest, go test
- scan # trivy, semgrep
- deploy # kubectl apply, helm upgrade
- build — Dockerfile·앞서 본 레이어 캐시·멀티 스테이지
- test — PR에서 먼저 실행 (shift-left)
- scan — Security 시리즈 SBOM·취약점과 연결
- deploy — 같은 이미지를 환경만 바꿔 promote
# 실패한 job은 이후 stage 실행 안 함 (fail fast)
# logs · artifacts · commit SHA 로 추적
3. 아티팩트
아티팩트 — 파이프라인이 만든 불변 결과물.
| 종류 | 예 | 저장 |
|---|---|---|
| 컨테이너 이미지 | my/api:abc123f |
registry (ECR, GCR, Harbor) |
| 바이너리/JAR | app-1.2.0.jar |
artifact store |
| Helm chart | api-1.2.0.tgz |
OCI·chart repo |
| manifest bundle | kustomize output | Git·artifact |
- 태그 —
latest만 쓰지 말고 Git SHA·semver (v1.2.0) - 한 번 빌드 — staging·prod는 동일 digest promote
- prod에서 재빌드하면 “같은 버전 다른 바이너리” — 재현 불가
- K8s
Deploymentimage:— CI가 push한 digest 참조
4. 환경 분리

| 레이어 | dev | staging | production |
|---|---|---|---|
| 코드/이미지 | 동일 아티팩트 promote | 동일 | 동일 |
| 설정 | dev ConfigMap/Secret | staging values | prod values |
| 클러스터 | dev cluster/namespace | staging | prod |
| 데이터 | mock·소량 | anonymized | real |
- 12-factor — 설정은 환경에, 코드·이미지는 공통 (앞서 ConfigMap·Secret)
- ConfigMap/Secret — env별 values·External Secrets (Security)
- namespace·cluster 분리 — blast radius 축소
- 승인 gate — staging 통과 → prod deploy (CD Delivery)
# same image, different config per env
# staging
image: registry/my/api:abc123f
envFrom:
- configMapRef:
name: api-config-staging
# production — same digest, prod config only
5. Kubernetes와 CI/CD
Developer → Git push → CI (build test scan) → push image
↓
CD → kubectl/helm → Deployment
↓
Pod · Service · Ingress (앞서 Part 2)
| K8s 리소스 | CI/CD에서 |
|---|---|
| Deployment | CD가 image tag·replicas 갱신 |
| ConfigMap/Secret | env별 별도 apply 또는 Helm values |
| Ingress | staging/prod 호스트·TLS 분리 |
| HPA | 배포 후 런타임 스케일 (CI와 별개) |
- CI는 클러스터 밖 (runner·agent)에서 실행되는 경우가 많음
- CD는 kubeconfig·service account — 최소 권한 RBAC
- GitOps (14편) — desired state를 Git에, controller가 sync
6. 실무 체크리스트
| 항목 | 권장 |
|---|---|
| PR | test + scan 필수, main merge 전 green |
| 이미지 태그 | SHA 또는 semver, latest prod 금지 |
| 환경 | 동일 아티팩트 promote, 설정만 분리 |
| Secret | CI 변수·vault, Git 평문 금지 |
| 롤백 | 이전 digest·Deployment rollback |
| 관측 | deploy 후 health·메트릭 (Observability) |
| 안티패턴 | 문제 |
|---|---|
| prod에서만 빌드 | staging과 다른 바이너리 |
| scan skip | CVE 프로덕션 유입 |
| SSH 배포 | 선언적·감사 불가 |
| CI만 있고 CD 없음 | 수동 apply 지연·휴먼 에러 |
7. 정리
- CI — 변경 통합·검증 · CD — 검증된 아티팩트 배포
- build → test → scan → deploy — 실패 시 중단
- 아티팩트 불변 — env는 설정·클러스터만 다름
- K8s Deployment·ConfigMap·Secret과 CD 단계에서 만남
- Part 3 시작 — 다음은 GitHub Actions·GitLab CI 구현
다음에 다룰 것
- GitHub Actions와 GitLab CI
- workflow·trigger·job·step·cache·배포 연동
해당 내용은 Production Kubernetes (O'Reilly) 및 GitHub Actions / GitLab CI 공식 문서를 참고했습니다.
'플랫폼, 데브옵스와 클라우드' 카테고리의 다른 글
| 배포 전략 (0) | 2026.06.30 |
|---|---|
| GitHub Actions와 GitLab CI (0) | 2026.06.29 |
| 스케줄링과 리소스 (0) | 2026.06.27 |
| 스토리지와 StatefulSet (0) | 2026.06.26 |
| ConfigMap과 Secret (0) | 2026.06.25 |