1일차 2일차 3일차
───────────────────── ───────────────────── ─────────────────────
Dockerfile 작성 → K8s Deployment/Service → GitHub Actions CI
docker build ConfigMap / Secret 이미지 태깅
docker compose up kubectl 진단 명령 Helm 차트 구조 이해
Spring + PostgreSQL 연동 운영 관점 문제 진단 Argo CD GitOps / 롤백
Kubernetes 활성화 준비 → 3일차 배포 소스 확보 빌드-패키징-배포-롤백 한 사이클
Chart.yaml, values.yaml, templates 역할 이해 및 이미지 태그 반영
14:40~16:00
모듈 5
Argo CD 설치 및 앱 등록
Argo CD 애플리케이션
로컬 Kubernetes와 Git 저장소 연결, Helm chart source 등록
16:00~18:00
모듈 6
Sync, 롤백, 운영 체크리스트
Sync/OutOfSync 확인, 롤백 절차서
잘못된 이미지 태그 장애 재현과 복구
5. 1일차 상세 기획 — Docker / Docker Compose
핵심 메시지: 1일차는 컨테이너를 "설명"하는 날이 아니라, Spring 애플리케이션과 PostgreSQL을 직접 컨테이너화하고 실행해보며 이후 Kubernetes 실습의 기반을 만드는 날이다.
학습목표
Docker Desktop 기반의 로컬 컨테이너 실습 환경을 준비할 수 있다.
Dockerfile을 이용해 Spring 애플리케이션 이미지를 생성할 수 있다.
Docker Compose로 Spring 애플리케이션과 PostgreSQL을 함께 실행할 수 있다.
Docker Desktop의 Kubernetes 기능을 활성화해 2일차 쿠버네티스 배포 실습 준비를 완료할 수 있다.
모듈 상세 내용
모듈
시간
내용
모듈 1 사전 설치 점검 + Docker Desktop/WSL2 복구
09:00~10:30
Docker Desktop, WSL2, Git, PowerShell 상태를 점검하고 실습 가능 환경으로 복구한다. 이 단계는 이후 실습 실패를 줄이기 위한 준비 단계로 설계한다.
모듈 2 Docker 기본 개념과 컨테이너 실행
10:30~11:30
이미지와 컨테이너의 차이, 실행 환경 분리, 포트 매핑과 볼륨 개념을 짧게 설명한 뒤 바로 단일 컨테이너 실행으로 연결한다. 개념 설명은 최소화하고 명령 실행 결과를 통해 동작 원리를 체감하게 한다.
모듈 3 Spring 애플리케이션 컨테이너화
11:30~12:30
Spring Boot 예제 애플리케이션을 대상으로 JAR 빌드와 Dockerfile 작성, 이미지 빌드와 실행 흐름을 학습한다. 목표는 "애플리케이션이 이미지가 되고 컨테이너로 실행된다"는 흐름을 확실히 잡는 것이다.
모듈 4 Docker Compose 기반 Spring + PostgreSQL 연동
13:30~15:30
Spring 애플리케이션과 PostgreSQL을 각각 컨테이너로 구성하고, Compose를 통해 함께 기동한다. 환경변수와 설정 파일을 분리해 개발 환경과 실행 환경 간 차이를 이해하게 한다.
모듈 5 Kubernetes 개요와 로컬 준비
15:30~16:30
Docker Desktop에서 Kubernetes를 활성화하고 kubectl 명령으로 노드와 시스템 Pod를 확인한다. Kubernetes 리소스 실습은 2일차 이후로 넘기되, 1일차에는 로컬 클러스터 준비 상태를 확보하는 데 집중한다.
모듈 6 운영 관점 점검과 2일차 연결
16:30~18:00
컨테이너 기동 실패, 포트 충돌, DB 연결 오류, 환경변수 누락 등 초반에 자주 발생하는 오류를 점검한다. 이를 통해 2일차의 쿠버네티스 배포와 운영 오류 대응 실습으로 자연스럽게 연결한다.
실습 시나리오
실습
목표
체크포인트
성공 조건
실습 1 Docker Desktop 설치 및 동작 확인
로컬 PC에서 Docker 명령이 정상 동작하는 환경 준비
docker version, docker ps 명령이 정상 실행된다
수강생 PC에서 컨테이너 실행 준비가 완료된다
실습 2 Spring 애플리케이션 이미지 빌드
예제 Spring Boot 애플리케이션을 Docker 이미지로 패키징
docker build 성공, 이미지 목록 확인, 컨테이너 실행 성공
브라우저 또는 API 호출로 애플리케이션 기동을 확인한다
실습 3 Docker Compose로 PostgreSQL 연동
Spring 애플리케이션과 PostgreSQL을 함께 기동하고 연결 검증
docker compose up 성공, DB 컨테이너 기동, 로그에서 DB 연결 확인
API 호출 시 PostgreSQL 연동 결과가 정상 응답한다
실습 4 Docker Desktop Kubernetes 활성화
로컬 Kubernetes 클러스터를 활성화하고 배포 실습 기반 준비
Kubernetes 활성화, kubectl get nodes 성공, 시스템 Pod 조회 가능
2일차에 바로 Deployment 실습으로 연결 가능한 상태가 된다
강의 운영 포인트
이론 비중을 낮추고, 실습 성공 경험을 누적시키는 방향으로 운영한다.
Spring 코드는 신규 작성보다 템플릿 프로젝트를 제공하는 편이 학습 집중도와 시간 운영 측면에서 유리하다.
PostgreSQL은 DBA 관점 심화보다 애플리케이션 연동과 설정 분리 경험에 초점을 둔다.
Kubernetes는 1일차에 "배포"까지 밀어 넣기보다, 활성화와 준비 상태 확인까지만 다루는 편이 전체 커리큘럼 흐름에 안정적이다.
1일차 준비물
Docker Desktop
Antigravity IDE 권장 (VS Code 또는 IntelliJ IDEA 대체 가능)
예제 Spring Boot 프로젝트 (제공)
kubectl
1일차 완료 기준
Docker Desktop이 정상 동작한다.
Spring 애플리케이션 이미지를 직접 빌드할 수 있다.
Docker Compose로 Spring + PostgreSQL 통합 실행이 가능하다.
Docker Desktop Kubernetes가 활성화되어 있고 kubectl로 상태 확인이 가능하다.
6. 2일차 상세 기획 — Kubernetes 배포
핵심 메시지: 2일차는 컨테이너 실행에서 끝나지 않고, 쿠버네티스 리소스로 애플리케이션을 배포하고 설정을 분리하며 서비스 상태를 점검하는 날이다.
학습목표
Docker Desktop Kubernetes 환경에서 기본 리소스를 조회하고 배포 흐름을 이해할 수 있다.
Spring 애플리케이션과 PostgreSQL을 Deployment와 Service로 배포할 수 있다.
ConfigMap과 Secret을 이용해 설정값과 민감정보를 분리할 수 있다.
배포 후 Pod, Service, 로그 상태를 점검하고 기본적인 문제를 진단할 수 있다.
모듈 상세 내용
모듈
시간
내용
모듈 1 Kubernetes 기본 구조 이해
09:00~10:00
Docker Desktop Kubernetes 환경에서 node, namespace, pod, service 개념을 정리하고 실제 리소스 조회 명령으로 연결한다. 이론 나열보다 "현재 클러스터에 무엇이 떠 있는가"를 확인하는 관찰 중심으로 운영한다.
모듈 2 PostgreSQL 쿠버네티스 배포
10:00~11:30
PostgreSQL을 Deployment와 Service로 구성하고, PersistentVolumeClaim을 통해 데이터 저장 구조를 함께 설명한다. 상태 저장 워크로드를 깊게 다루기보다, 쿠버네티스에서 DB가 어떻게 배치되는지 이해시키는 수준으로 설계한다.
모듈 3 Spring 애플리케이션 배포
11:30~13:00
1일차에 만든 이미지를 기반으로 Spring Boot 애플리케이션을 Deployment로 배포하고 Service로 노출한다. 이미지, 포트, 환경변수, replica 개념을 함께 다룬다.
모듈 4 ConfigMap, Secret 기반 설정 분리
14:00~15:30
애플리케이션 설정과 민감정보를 이미지에 넣지 않고 외부화하는 방법을 학습한다. 환경변수와 설정 파일을 분리하여 개발 환경과 검증 환경 간 차이를 조정하는 방향을 실제 매니페스트로 구현한다.
모듈 5 통합 검증과 서비스 확인
15:30~17:00
kubectl get, describe, logs, 포트 포워딩을 통해 애플리케이션과 PostgreSQL의 연결 상태를 검증한다. "배포 성공 = Pod Running"이 아니라 "서비스 응답까지 확인"이라는 운영 관점을 강조한다.
모듈 6 운영 관점 문제 진단 입문
17:00~18:00
이미지 태그 오류, 환경변수 누락, 서비스 셀렉터 불일치 등 자주 발생하는 문제를 간단히 재현한다. 3일차의 배포 오류 대응, 롤백, 운영 체크리스트 실습으로 자연스럽게 넘어가도록 설계한다.
실습 시나리오
실습
목표
체크포인트
성공 조건
실습 1 로컬 클러스터 상태 점검
Docker Desktop Kubernetes 기본 상태 확인, 실습 namespace 준비
kubectl get nodes, kubectl get pods -A, kubectl create namespace 정상 수행
실습용 namespace 준비, 기본 리소스 조회 가능
실습 2 PostgreSQL 배포
PostgreSQL을 K8s 리소스로 배포하고 내부 서비스로 연결
Deployment 생성, Service 생성, Pod Running, 내부 연결 확인
PostgreSQL Pod 정상 기동, 애플리케이션에서 접근 가능
실습 3 Spring 애플리케이션 배포
Spring Boot 앱을 Deployment와 Service로 배포
이미지 지정, replica 설정, Service 노출, Pod 로그 확인
애플리케이션 Pod 정상 기동, 서비스 접근 가능
실습 4 ConfigMap과 Secret 적용
DB 호스트, 포트, 계정, 비밀번호를 외부 설정으로 분리
ConfigMap 생성, Secret 생성, 환경변수 주입 성공
설정 분리 후에도 애플리케이션이 정상 기동된다
실습 5 서비스 통합 검증
Spring 애플리케이션이 PostgreSQL과 정상 연결되는지 확인
API 호출 성공, 애플리케이션 로그 확인, DB 연결 확인
수강생이 배포 후 점검 절차를 순서대로 수행할 수 있다
강의 운영 포인트
초점은 "쿠버네티스 명령 암기"가 아니라 "배포 단위가 어떻게 달라지는지 이해"에 둔다.
PostgreSQL까지 쿠버네티스에 올리더라도 운영 심화보다 애플리케이션 연동과 서비스 확인에 집중한다.
kubectl apply만 반복하지 말고 get, describe, logs를 반드시 함께 사용하게 해야 운영 관점이 형성된다.
매니페스트는 처음부터 길게 주기보다 Deployment → Service → ConfigMap → Secret을 단계적으로 추가하는 방식이 학습 부담을 줄인다.
2일차 준비물
Docker Desktop Kubernetes 활성화 완료 환경
1일차에 사용한 Spring Boot 이미지 또는 예제 프로젝트
PostgreSQL용 기본 매니페스트 (제공)
Antigravity IDE 권장 (VS Code 또는 IntelliJ IDEA 대체 가능)
kubectl
실습용 namespace 및 YAML 파일 템플릿 (제공)
2일차 완료 기준
로컬 Kubernetes 환경에서 Spring 애플리케이션과 PostgreSQL을 각각 배포할 수 있다.
Deployment, Service, ConfigMap, Secret의 역할을 구분 설명할 수 있다.
배포 후 상태 확인 명령으로 기본적인 문제를 진단할 수 있다.
3일차의 GitHub Actions + Argo CD 기반 자동화 실습으로 이어질 수 있는 매니페스트 구조를 확보한다.
7. 3일차 상세 기획 — GitHub Actions + Helm + Argo CD GitOps
핵심 메시지: 3일차는 코드 변경이 빌드되고, 이미지가 만들어지고, Git 상태를 기준으로 Kubernetes에 반영되는 전체 흐름을 경험하는 날이다.
학습목표
GitHub Actions로 빌드와 테스트를 자동화할 수 있다.
Docker 이미지 버전을 확인하고, 배포 매니페스트 또는 Helm values에 수동으로 반영하는 GitOps 기본 흐름을 수행할 수 있다.
Helm chart의 기본 구성(Chart.yaml, values.yaml, templates/)과 values 기반 배포 설정 변경 방식을 설명할 수 있다.
Argo CD로 로컬 Kubernetes 클러스터에 선언형 배포를 적용할 수 있다.
배포 상태를 확인하고 롤백 또는 재동기화로 복구할 수 있다.
GitOps 전체 흐름
3일차 Argo CD 실습은 2일차에서 만든 todo-app 네임스페이스와 Service, ConfigMap, Secret, PostgreSQL 리소스가 클러스터에 남아 있다는 전제로 진행한다.
3일차는 workspace/k8s-day3-gitops의 애플리케이션 Deployment로 GitOps 흐름을 먼저 잡은 뒤, Helm을 별도 학습 주제로 다룬다.
Helm 파트에서는 같은 앱 배포를 Chart.yaml, values.yaml, templates/ 구조로 재구성하고, 이미지 태그 변경 지점을 values로 분리하는 방식을 학습한다.
2일차 기반 리소스(todo-app Service, postgres Service/Deployment/PVC, app-config, db-secret)는 다시 생성하지 않는다.
코드 push (GitHub main 브랜치)
│
▼
GitHub Actions (CI)
├─ 1. Gradle 빌드 & 테스트
├─ 2. Docker 이미지 빌드
└─ 3. GHCR push (태그: 7자리 short SHA / latest)
│
▼
수강생이 GHCR 이미지 태그 확인
│
▼
workspace/k8s-day3-gitops/app-deployment.yml 이미지 태그 수동 변경
│
▼
Helm chart/values로 같은 변경 지점 구조화
│
▼
Git commit & push
│
▼
Argo CD OutOfSync 감지
│
▼
Argo CD Sync → 클러스터 반영
│
▼
kubectl rollout status 확인
모듈 상세 내용
모듈
시간
내용
모듈 1 CI/CD 구조와 GitOps 이해
09:00~10:00
개발·검증·운영 환경 간 변경 관리 흐름과 GitOps의 핵심 개념을 도식으로 정리한다.
모듈 2 GitHub Actions CI 구성
10:00~11:20
Spring Boot 코드가 push되었을 때 GitHub Actions가 빌드·테스트를 수행하고 GHCR에 이미지를 push하는 workflow를 작성한다.
모듈 3 버전관리와 이미지 태깅
11:20~12:30
GHCR 이미지 태그를 확인하고 workspace/k8s-day3-gitops/app-deployment.yml에 반영해 Git 기반 배포 이력을 만든다.
모듈 4 Helm 기본과 차트 구조
13:30~14:40
Helm을 별도 학습 주제로 다룬다. Chart.yaml, values.yaml, templates/ 구조를 만들고 이미지 태그를 values로 분리한다.
모듈 5 Argo CD 설치 및 앱 등록
14:40~16:00
로컬 Kubernetes에 Argo CD를 설치하고, plain manifest 경로와 Helm chart 경로를 Application source로 등록하는 차이를 학습한다.
모듈 6 Sync, 롤백, 운영 체크리스트
16:00~18:00
수동 Sync, OutOfSync/Healthy 확인, 잘못된 이미지 태그 장애 재현, Git revert 또는 Argo CD rollback 복구를 실습한다.
실습 시나리오
실습
목표
체크포인트
성공 조건
실습 1 GitHub Actions CI 파이프라인 구성
코드 변경 시 테스트와 빌드가 자동 실행되도록 workflow 작성
push 또는 PR 발생 시 job이 실행되고, 테스트와 빌드가 성공
Docker 이미지가 생성되며 레지스트리(GHCR) 반영 완료
실습 2 이미지 태그 수동 반영
GHCR 이미지 태그를 확인하고 기본 매니페스트에 직접 반영
이미지 태그 확인, workspace/k8s-day3-gitops/app-deployment.yml 수정, commit/push
어떤 이미지 태그가 어떤 Git commit으로 배포됐는지 역추적할 수 있다
실습 3 Helm 차트 작성
앱 Deployment를 Helm chart로 패키징하고 values로 변경점을 분리
Chart.yaml, values.yaml, templates/deployment.yaml, helm template 결과 확인
raw manifest와 Helm values 방식의 차이를 설명할 수 있다
실습 4 Argo CD 설치와 애플리케이션 등록
로컬 Kubernetes에 Argo CD를 설치하고 plain manifest/Helm chart 앱 등록
Argo CD UI/CLI 접근, 앱 등록, Sync 상태 확인
Git 저장소의 manifest 또는 Helm chart가 클러스터 대상 앱으로 연결된다
실습 5 롤백 및 복구
잘못된 버전이나 설정을 되돌리고 서비스 정상 상태 복구
이전 revision 선택, rollback 또는 재동기화 수행, 정상 상태 확인
이전 정상 버전으로 서비스가 복구된다
Argo CD 설치 절차 (모듈 5 실습)
# 1. argocd 네임스페이스 생성
kubectl create namespace argocd
# 2. Argo CD 설치 (stable 버전)
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
# 3. Pod 기동 완료 대기 (전체 Running까지 수 분 소요)
kubectl get pods -n argocd -w
# 4. UI 접근을 위한 포트 포워딩 (별도 터미널)
kubectl port-forward svc/argocd-server -n argocd 8443:443# 5. 초기 admin 비밀번호 확인
kubectl get secret argocd-initial-admin-secret -n argocd `-o jsonpath="{.data.password}"|`
[System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($_))
# 브라우저에서 https://localhost:8443 접속 (ID: admin)
Argo CD가 workspace/k8s-day3-gitops/helm 경로에서 Chart.yaml을 감지하면 자동으로 Helm source로 인식한다.
이미지 태그 변경은 values.yaml의 image.tag에서 수행한다.
Argo CD 동기화 상태 설명
상태
의미
Synced
Git 상태 = 클러스터 상태 (정상)
OutOfSync
Git이 변경됐지만 클러스터에 미반영
Healthy
Pod가 정상 동작 중
Degraded
Pod 일부 또는 전체 비정상
Progressing
배포 진행 중
강의 운영 포인트
도구 소개보다 빌드-패키징-배포-롤백이 한 흐름으로 이어진다는 경험을 주는 데 집중한다.
GitHub Actions는 CI, Helm은 배포 패키징, Argo CD는 CD/GitOps로 역할을 명확히 분리하면 수강생 이해도가 높다.
자동 동기화만 강조하면 롤백 개념이 흐려질 수 있으므로, 처음에는 수동 Sync와 롤백을 보여준 뒤 자동화로 넘어가는 편이 좋다.
로컬 Kubernetes 환경이므로 외부 클라우드 연결 이슈 없이 GitOps 개념 자체를 학습하는 데 집중한다.
3일차 준비물
Docker Desktop Kubernetes 활성화 완료 환경
GitHub 저장소 (앱 소스 + 배포 매니페스트)
GitHub Actions Workflow 파일 (제공)
수강생 개인 GitHub fork 저장소
Argo CD 설치 YAML 또는 manifest
kubectl, argocd CLI (선택)
1일차/2일차에서 사용한 Spring Boot + PostgreSQL 예제
3일차 완료 기준
GitHub Actions로 CI가 자동 실행된다.
Argo CD가 Git 저장소를 기준으로 로컬 Kubernetes에 동기화된다.
버전 태그와 배포 이력이 연결되어 추적 가능하다.
장애 또는 잘못된 배포 상황에서 롤백 절차를 수행할 수 있다.
8. 실습 앱 소개
Todo CRUD REST API
Spring Boot 3.2 + PostgreSQL 16 기반의 Todo 목록 API.
동일한 이미지에서 환경변수만 교체해 로컬·Compose·Kubernetes·GitOps 환경 모두 동작한다.
API 엔드포인트
메서드
경로
설명
GET
/todos
전체 목록 조회
GET
/todos/{id}
단건 조회
POST
/todos
항목 추가
PATCH
/todos/{id}/done
완료 여부 변경
DELETE
/todos/{id}
삭제
GET
/actuator/health
헬스체크 (K8s probe용)
DB 연결 환경변수
환경변수
기본값
설명
DB_HOST
localhost
DB 호스트
DB_PORT
5432
DB 포트
DB_NAME
tododb
DB 이름
DB_USER
todo
DB 계정
DB_PASSWORD
todo1234
DB 비밀번호
9. 프로젝트 파일 구조
docker_k8s_tutorial/
│
├── README.md ← 이 강의기획서
│
├── 01_design/ ← 과정 기획 및 설계 가이드
│ ├── course-design-detail.md
│ ├── instructor-runbook.md
│ └── slide-theme.md
│
├── 02_lectures/ ← 이론 강의 슬라이드
│ ├── day1/
│ ├── day2/
│ └── day3/
│
├── 03_practices/ ← 실습 자료 모음
│ ├── day1/ ← 1일차 가이드 문서
│ ├── day2/ ← 2일차 가이드 문서
│ ├── day3/ ← 3일차 가이드 문서
│ │
│ └── workspace/ ← 통합 실습 작업 공간
│ ├── spring-app/ ← 공통 실습 앱 소스
│ │ ├── Dockerfile
│ │ ├── build.gradle
│ │ └── src/main/java/com/tutorial/app/
│ │
│ ├── compose.yml ← Spring + PostgreSQL Compose
│ ├── .env ← 환경변수 분리 예제
│ │
│ ├── k8s-day2/ ← 2일차 Kubernetes 매니페스트
│ │ ├── namespace.yml
│ │ ├── postgres-pvc.yml
│ │ ├── postgres-deployment.yml
│ │ ├── postgres-service.yml
│ │ ├── app-configmap.yml ← DB 호스트/포트/이름
│ │ ├── app-secret.yml ← DB 계정/비밀번호 (base64)
│ │ ├── app-deployment.yml
│ │ └── app-service.yml ← NodePort (localhost:30080)
│ │
│ └── k8s-day3-gitops/ ← 3일차 GitOps 매니페스트 및 Helm
│ ├── app-deployment.yml ← raw manifest (수동 변경 대상)
│ └── helm/ ← Helm chart
│ ├── Chart.yaml
│ ├── values.yaml
│ └── templates/
│
└── .github/
└── workflows/
└── ci.yml ← GitHub Actions CI (GHCR push)
10. 강의 운영 총괄 원칙
원칙
내용
이론 최소화
개념 설명은 실습 직전 5분 이내 요약, 명령 결과로 원리를 체감한다
실습 성공 경험 누적
모듈마다 확인 가능한 산출물(명령 출력, API 응답)을 만든다
오류 대응 내재화
자주 발생하는 오류는 강사가 먼저 재현해 진단 과정을 보여준다
코드 작성 없음
Spring 코드 신규 작성 없이 제공된 템플릿 프로젝트 활용
환경 독립성
클라우드 없이 로컬 Docker Desktop만 사용, 네트워크 의존성 최소화
일차 간 연결
매 일차 끝에서 다음 일차 시작으로 자연스럽게 이어진다
11. 사전 설치 점검 방법
수강 전 아래 명령을 모두 실행해 오류가 없는지 확인한다.
# Docker 버전 확인
docker version
# Compose 플러그인 확인
docker compose version
# Docker 정상 동작 확인 (hello-world 컨테이너 실행)
docker run --rm hello-world
# Git 버전 확인
git --version
# Kubernetes (Docker Desktop에서 활성화 후)
kubectl version --client
kubectl get nodes
정상 출력 예시
Client: Docker Engine - Community
Version: 26.x.x
Docker Compose version v2.x.x
git version 2.4x.x
kubectl version: v1.29.x
NAME STATUS ROLES AGE
docker-desktop Ready control-plane Xd