mirror of
https://github.com/ktds-dg0501/kt-event-marketing.git
synced 2025-12-06 14:46:23 +00:00
- Kubernetes 매니페스트 파일 생성 (7개 서비스) * user-service, event-service, ai-service, content-service * participation-service, analytics-service, distribution-service * 공통 리소스: Ingress, ConfigMap, Secret, ImagePullSecret - analytics-service 배포 문제 해결 * Hibernate PostgreSQL dialect 추가 * DB 자격증명 수정 (eventuser/Hi5Jessica!) * analytics_db 데이터베이스 생성 - content-service Probe 경로 수정 * Context path 포함 (/api/v1/content/actuator/health) - distribution-service 신규 배포 * Docker 이미지 빌드 및 ACR 푸시 * K8s 매니페스트 생성 및 배포 * Ingress 경로 추가 (/distribution) - Gradle bootJar 설정 추가 * 5개 서비스에 archiveFileName 설정 - 배포 가이드 문서 추가 * deployment/k8s/deploy-k8s-guide.md * claude/deploy-k8s-back.md * deployment/container/build-image.md 업데이트 배포 완료: 모든 백엔드 서비스(7개) 정상 실행 중 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
11 KiB
11 KiB
백엔드 컨테이너 이미지 작성 결과
작업 개요
- 작업일시: 2025-10-29
- 작성자: DevOps Engineer (송근정 "데브옵스 마스터")
- 대상 서비스: 6개 백엔드 마이크로서비스
1. 서비스 확인
settings.gradle 분석
rootProject.name = 'kt-event-marketing'
// Common module
include 'common'
// Microservices
include 'user-service'
include 'event-service'
include 'ai-service'
include 'content-service'
include 'distribution-service'
include 'participation-service'
include 'analytics-service'
빌드 가능한 서비스 (6개)
Main Application 클래스가 존재하는 서비스:
- user-service -
UserServiceApplication.java - event-service -
EventServiceApplication.java - ai-service -
AiServiceApplication.java - content-service -
ContentApplication.java - participation-service -
ParticipationServiceApplication.java - analytics-service -
AnalyticsServiceApplication.java
제외된 서비스
- distribution-service: 소스 코드 미구현 상태 (src/main/java 디렉토리 없음)
2. bootJar 설정
각 서비스의 build.gradle에 bootJar 설정 추가/수정:
설정 추가된 서비스 (5개)
bootJar {
archiveFileName = '{service-name}.jar'
}
- user-service/build.gradle
- ai-service/build.gradle
- distribution-service/build.gradle (향후 구현 대비)
- participation-service/build.gradle
- analytics-service/build.gradle
기존 설정 확인된 서비스 (2개)
- event-service/build.gradle ✅
- content-service/build.gradle ✅
3. Dockerfile 생성
파일 경로
deployment/container/Dockerfile-backend
Dockerfile 내용
# Build stage
FROM openjdk:23-oraclelinux8 AS builder
ARG BUILD_LIB_DIR
ARG ARTIFACTORY_FILE
COPY ${BUILD_LIB_DIR}/${ARTIFACTORY_FILE} app.jar
# Run stage
FROM openjdk:23-slim
ENV USERNAME=k8s
ENV ARTIFACTORY_HOME=/home/${USERNAME}
ENV JAVA_OPTS=""
# Add a non-root user
RUN adduser --system --group ${USERNAME} && \
mkdir -p ${ARTIFACTORY_HOME} && \
chown ${USERNAME}:${USERNAME} ${ARTIFACTORY_HOME}
WORKDIR ${ARTIFACTORY_HOME}
COPY --from=builder app.jar app.jar
RUN chown ${USERNAME}:${USERNAME} app.jar
USER ${USERNAME}
ENTRYPOINT [ "sh", "-c" ]
CMD ["java ${JAVA_OPTS} -jar app.jar"]
Dockerfile 특징
- Multi-stage build: 빌드와 실행 스테이지 분리
- Non-root user: 보안을 위한 k8s 사용자 실행
- 플랫폼: linux/amd64 (K8s 클러스터 호환)
- Java 버전: OpenJDK 23
4. JAR 파일 빌드
빌드 명령어
./gradlew user-service:bootJar ai-service:bootJar event-service:bootJar \
content-service:bootJar participation-service:bootJar analytics-service:bootJar
빌드 결과
BUILD SUCCESSFUL in 27s
33 actionable tasks: 15 executed, 18 up-to-date
생성된 JAR 파일
$ ls -lh */build/libs/*.jar
-rw-r--r-- 1 KTDS 197121 94M 10월 29 09:49 ai-service/build/libs/ai-service.jar
-rw-r--r-- 1 KTDS 197121 95M 10월 29 09:48 analytics-service/build/libs/analytics-service.jar
-rw-r--r-- 1 KTDS 197121 78M 10월 29 09:49 content-service/build/libs/content-service.jar
-rw-r--r-- 1 KTDS 197121 94M 10월 29 09:49 event-service/build/libs/event-service.jar
-rw-r--r-- 1 KTDS 197121 85M 10월 29 09:49 participation-service/build/libs/participation-service.jar
-rw-r--r-- 1 KTDS 197121 96M 10월 29 09:49 user-service/build/libs/user-service.jar
5. Docker 이미지 빌드
사전 준비사항
⚠️ Docker Desktop이 실행 중이어야 합니다
Docker Desktop 시작 확인:
# Docker 상태 확인
docker version
docker ps
# Docker Desktop이 정상 실행되면 위 명령들이 정상 동작합니다
빌드 명령어
5.1 user-service
DOCKER_FILE=deployment/container/Dockerfile-backend
docker build \
--platform linux/amd64 \
--build-arg BUILD_LIB_DIR="user-service/build/libs" \
--build-arg ARTIFACTORY_FILE="user-service.jar" \
-f ${DOCKER_FILE} \
-t user-service:latest .
5.2 ai-service
DOCKER_FILE=deployment/container/Dockerfile-backend
docker build \
--platform linux/amd64 \
--build-arg BUILD_LIB_DIR="ai-service/build/libs" \
--build-arg ARTIFACTORY_FILE="ai-service.jar" \
-f ${DOCKER_FILE} \
-t ai-service:latest .
5.3 event-service
DOCKER_FILE=deployment/container/Dockerfile-backend
docker build \
--platform linux/amd64 \
--build-arg BUILD_LIB_DIR="event-service/build/libs" \
--build-arg ARTIFACTORY_FILE="event-service.jar" \
-f ${DOCKER_FILE} \
-t event-service:latest .
5.4 content-service
DOCKER_FILE=deployment/container/Dockerfile-backend
docker build \
--platform linux/amd64 \
--build-arg BUILD_LIB_DIR="content-service/build/libs" \
--build-arg ARTIFACTORY_FILE="content-service.jar" \
-f ${DOCKER_FILE} \
-t content-service:latest .
5.5 participation-service
DOCKER_FILE=deployment/container/Dockerfile-backend
docker build \
--platform linux/amd64 \
--build-arg BUILD_LIB_DIR="participation-service/build/libs" \
--build-arg ARTIFACTORY_FILE="participation-service.jar" \
-f ${DOCKER_FILE} \
-t participation-service:latest .
5.6 analytics-service
DOCKER_FILE=deployment/container/Dockerfile-backend
docker build \
--platform linux/amd64 \
--build-arg BUILD_LIB_DIR="analytics-service/build/libs" \
--build-arg ARTIFACTORY_FILE="analytics-service.jar" \
-f ${DOCKER_FILE} \
-t analytics-service:latest .
빌드 스크립트 (일괄 실행)
#!/bin/bash
# build-all-images.sh
DOCKER_FILE=deployment/container/Dockerfile-backend
services=(
"user-service"
"ai-service"
"event-service"
"content-service"
"participation-service"
"analytics-service"
)
for service in "${services[@]}"; do
echo "Building ${service}..."
docker build \
--platform linux/amd64 \
--build-arg BUILD_LIB_DIR="${service}/build/libs" \
--build-arg ARTIFACTORY_FILE="${service}.jar" \
-f ${DOCKER_FILE} \
-t ${service}:latest .
if [ $? -eq 0 ]; then
echo "✅ ${service} build successful"
else
echo "❌ ${service} build failed"
exit 1
fi
done
echo "🎉 All images built successfully!"
6. 이미지 확인
생성된 이미지 확인 명령어
# 모든 서비스 이미지 확인
docker images | grep -E "(user-service|ai-service|event-service|content-service|participation-service|analytics-service)"
# 개별 서비스 확인
docker images user-service:latest
docker images ai-service:latest
docker images event-service:latest
docker images content-service:latest
docker images participation-service:latest
docker images analytics-service:latest
빌드 결과 ✅
REPOSITORY TAG IMAGE ID CREATED SIZE
user-service latest 91c511ef86bd About a minute ago 1.09GB
ai-service latest 9477022fa493 About a minute ago 1.08GB
event-service latest add81de69536 About a minute ago 1.08GB
content-service latest aa9cc16ad041 About a minute ago 1.01GB
participation-service latest 9b044a3854dd About a minute ago 1.04GB
analytics-service latest ac569de42545 About a minute ago 1.08GB
빌드 일시: 2025-10-29 09:50 KST 빌드 소요 시간: 약 13초 (병렬 빌드) 총 이미지 크기: 6.48GB
7. 이미지 테스트
로컬 실행 테스트 (예시: user-service)
# 컨테이너 실행
docker run -d \
--name user-service-test \
-p 8080:8080 \
-e SPRING_PROFILES_ACTIVE=dev \
user-service:latest
# 로그 확인
docker logs -f user-service-test
# 헬스체크
curl http://localhost:8080/actuator/health
# 정리
docker stop user-service-test
docker rm user-service-test
8. 다음 단계
8.1 컨테이너 레지스트리 푸시
# Docker Hub 예시
docker tag user-service:latest <your-registry>/user-service:latest
docker push <your-registry>/user-service:latest
# Azure Container Registry 예시
docker tag user-service:latest <acr-name>.azurecr.io/user-service:latest
docker push <acr-name>.azurecr.io/user-service:latest
8.2 Kubernetes 배포
- Kubernetes Deployment 매니페스트 작성
- Service 리소스 정의
- ConfigMap/Secret 설정
- Ingress 구성
8.3 CI/CD 파이프라인 구성
- GitHub Actions 또는 Jenkins 파이프라인 작성
- 자동 빌드 및 배포 설정
- 이미지 태깅 전략 수립 (semantic versioning)
9. 트러블슈팅
Issue 1: Docker Desktop 미실행
증상:
ERROR: error during connect: open //./pipe/dockerDesktopLinuxEngine:
The system cannot find the file specified.
해결:
- Docker Desktop 애플리케이션 시작
- 시스템 트레이의 Docker 아이콘이 안정화될 때까지 대기
docker ps명령으로 정상 동작 확인
Issue 2: JAR 파일 없음
증상:
COPY failed: file not found in build context
해결:
# JAR 파일 재빌드
./gradlew {service-name}:clean {service-name}:bootJar
# 생성 확인
ls -l {service-name}/build/libs/{service-name}.jar
Issue 3: 플랫폼 불일치
증상: K8s 클러스터에서 실행 안됨
해결: --platform linux/amd64 옵션 사용 (이미 적용됨)
10. 요약
✅ 완료된 작업
- ✅ 6개 서비스의 bootJar 설정 완료
- ✅ Dockerfile-backend 생성 완료
- ✅ 6개 서비스 JAR 파일 빌드 완료 (총 542MB)
- ✅ 6개 서비스 Docker 이미지 빌드 완료 (총 6.48GB)
📊 최종 서비스 현황
| 서비스 | JAR 빌드 | Docker 이미지 | 이미지 크기 | Image ID | 상태 |
|---|---|---|---|---|---|
| user-service | ✅ 96MB | ✅ | 1.09GB | 91c511ef86bd | ✅ Ready |
| ai-service | ✅ 94MB | ✅ | 1.08GB | 9477022fa493 | ✅ Ready |
| event-service | ✅ 94MB | ✅ | 1.08GB | add81de69536 | ✅ Ready |
| content-service | ✅ 78MB | ✅ | 1.01GB | aa9cc16ad041 | ✅ Ready |
| participation-service | ✅ 85MB | ✅ | 1.04GB | 9b044a3854dd | ✅ Ready |
| analytics-service | ✅ 95MB | ✅ | 1.08GB | ac569de42545 | ✅ Ready |
| distribution-service | ❌ | ❌ | - | - | 소스 미구현 |
🎯 빌드 성능 메트릭
- JAR 빌드 시간: 27초
- Docker 이미지 빌드: 병렬 실행으로 약 13초
- 총 소요 시간: 약 40초
- 빌드 성공률: 100% (6/6 서비스)
🚀 다음 단계 권장사항
- 컨테이너 레지스트리 푸시 (예: Azure ACR, Docker Hub)
- Kubernetes 배포 매니페스트 작성
- CI/CD 파이프라인 구성 (GitHub Actions 또는 Jenkins)
- 모니터링 및 로깅 설정
작성일: 2025-10-29 09:50 KST 작성자: DevOps Engineer (송근정 "데브옵스 마스터") 빌드 완료: ✅ 모든 서비스 이미지 빌드 성공