개념
왜 Config 레포를 따로 분리?
App 레포 → 소스코드, Dockerfile, CI
Config 레포 → K8s 매니페스트, ArgoCD가 이걸 바라봄
ArgoCD가 Config 레포를 감시하다가
변경이 생기면 클러스터에 자동 반영
"Git이 단일 진실 공급원" = GitOps
디렉터리 구조
team3-config/
├── base/ # 공통 매니페스트
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── ingress.yaml
│ ├── configmap.yaml
│ ├── secret.yaml
│ ├── serviceaccount.yaml
│ └── kustomization.yaml
└── overlays/
├── dev/ # dev 환경 패치
│ ├── kustomization.yaml
│ └── patch-replicas.yaml
└── prod/ # prod 환경 패치
├── kustomization.yaml
└── patch-replicas.yaml
Deployment
- replicas 설정
dev: 1 (비용 절감)
prod: 2 이상 (고가용성, Multi-AZ 분산 배포)
- ECR 이미지 주소 (SHA 태그 사용, latest 금지)
형식: <계정ID>.dkr.ecr.ap-northeast-2.amazonaws.com/team3/foldy:<SHA>
- 환경변수 주입
민감하지 않은 값 → ConfigMap (envFrom)
민감한 값 → Secret (env.valueFrom.secretKeyRef)
필요한 키: DB_URL, DB_USERNAME, DB_PASSWORD, JWT_SECRET
- resources requests / limits (둘 다 필수)
- readinessProbe / livenessProbe
- serviceAccountName 지정 → serviceaccount.yaml의 name과 반드시 일치
readiness vs liveness 차이 꼭 이해하고 쓰기
readiness 실패 → 트래픽 차단 (Pod는 살아있음)
liveness 실패 → Pod 재시작
둘 다 /actuator/health 바라보되
initialDelaySeconds는 liveness를 더 길게 잡기
앱 뜨기 전에 liveness가 실패하면 무한 재시작 루프에 빠짐
리소스 설정 안 하면?
노드 자원을 무한정 먹어서 다른 Pod가 OOMKilled 됨
requests / limits 둘 다 필수
Service
- type은 ClusterIP로 시작
- 외부 노출은 Ingress가 담당
- selector가 Deployment label과 일치
- port: 80, targetPort: 8080
Ingress
- ALB Controller가 annotation을 보고 ALB를 생성
- annotation 없으면 ALB가 생성 안됨
- 필수 annotation 3가지
kubernetes.io/ingress.class: alb
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: ip
- path: /, pathType: Prefix
⚠️ ALB Controller가 먼저 설치되어 있어야 함
없으면 Ingress 만들어도 아무 일도 일어나지 않음
ConfigMap
- 민감하지 않은 설정값만 여기에
- 예: TZ, SPRING_PROFILES_ACTIVE, APP_NAME
- dev / prod 프로파일 분리
dev: SPRING_PROFILES_ACTIVE: "dev"
prod: SPRING_PROFILES_ACTIVE: "prod"
Secret
- DB 접속 정보, JWT 시크릿 등 민감한 값
- 값은 반드시 base64 인코딩해서 넣기
방법: echo -n "값" | base64
- 필요한 키: DB_URL, DB_USERNAME, DB_PASSWORD, JWT_SECRET
- DB_URL은 Terraform output의 rds_endpoint 값 사용
방법: terraform output rds_endpoint
⚠️ 절대 평문으로 깃허브에 올리면 안됨
⚠️ secret.yaml은 .gitignore 처리하거나
값을 placeholder로 남기고 별도 공유