개념

왜 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로 남기고 별도 공유