refactor: 폴더 구조 변경

This commit is contained in:
donghyeon-ka
2026-08-02 00:22:19 +09:00
parent f9c463f87a
commit be2f8e4863
1869 changed files with 4565 additions and 295591 deletions
@@ -12,7 +12,7 @@
이 문서의 목표:
- dev / staging / prod 환경 분리를 **label·namespace·selector 레벨에서** 일관되게 만든다
- lab / dev / staging / prod 환경 분리를 **label·namespace·selector 레벨에서** 일관되게 만든다
- 서비스별 리소스 소유권(팀·도메인·컴포넌트)을 label로 쿼리 가능하게 한다
- K3s packaged component와 사용자 AddOn을 혼동하지 않는다
- 멀티 서버에서 `manifests/` 디렉터리를 source-of-truth로 쓰는 사고를 원천 차단한다
@@ -35,11 +35,13 @@
기본 환경:
- `lab` — 폐기 가능한 실험 환경
- `dev`
- `staging`
- `prod`
필요 시 `sandbox` / `canary` / `dr`을 추가할 수 있으나 dev/staging/prod 의미를 흐리지 않는다.
`lab`은 운영 승격 단계가 아니다. 필요 시 `canary` / `dr`을 추가할 수 있으나
dev/staging/prod 의미를 흐리지 않는다.
각 리소스는 두 곳에 동시에 환경이 드러나야 한다.
@@ -95,7 +97,7 @@
well-known label 6종으로 표현되지 않는 축은 다음 키로 고정한다.
- `example.com/environment``dev|staging|prod|canary|dr`
- `example.com/environment``lab|dev|staging|prod|canary|dr`
- `example.com/team` — 소유 팀 (예: `identity-sre`)
- `example.com/tier``frontend|backend|data|platform`
- `example.com/data-classification``public|internal|confidential|restricted`
@@ -107,7 +109,7 @@ well-known label 6종으로 표현되지 않는 축은 다음 키로 고정한
- `app.kubernetes.io/environment` 사용 (well-known set에 없음)
- 도메인 없는 커스텀 키 (`environment: prod` 같은 top-level key)
### 6. selector에 들어가는 label은 **불변 3종만**
### 6. selector에 들어가는 label은 **불변 2종만**
Deployment / StatefulSet의 `selector.matchLabels`는 일단 apply 후 수정 불가다. 여기에는 운영 중 **절대 바뀌지 않는** 값만 넣는다.
@@ -115,11 +117,11 @@ Deployment / StatefulSet의 `selector.matchLabels`는 일단 apply 후 수정
- `app.kubernetes.io/name`
- `app.kubernetes.io/instance`
- `app.kubernetes.io/component`
금지 (selector에 넣지 말 것):
- `app.kubernetes.io/version` (배포 때마다 바뀜)
- `app.kubernetes.io/component` (역할 재분류 시 immutable selector 충돌)
- `app.kubernetes.io/managed-by` (툴 교체 시 drift)
- `example.com/environment` (overlay에서 주입되면 selector immutable 위반)
@@ -146,10 +148,11 @@ Deployment / StatefulSet의 `selector.matchLabels`는 일단 apply 후 수정
기본:
- Git repo의 `k8s/` 디렉터리가 SoT
- Git repo의 `gitops/` 디렉터리가 Kubernetes desired state의 SoT
- CI/ArgoCD/Flux가 `kubectl apply --server-side`로 push
- 서버별 scp / vim 절대 금지
- 멀티 서버 bootstrap AddOn도 Git 관리(예: `k8s/bootstrap/*`를 첫 서버에만 배치)
- 멀티 서버 bootstrap AddOn도 Git 관리(`bootstrap/`에서 최소 설치 후
`gitops/clusters/` root로 인계)
### 9. GitOps apply는 Server-Side Apply가 기본
@@ -168,20 +171,25 @@ kubectl diff --server-side -k <overlay>
이후 `kustomize.md`에서 상세히 다룬다. 이 문서에서는 원칙만 박는다.
- `k8s/base/` — 공통 shape, 환경-agnostic
- `k8s/overlays/{dev,staging,prod}/` — patches / images / replicas / resources / labels
- `gitops/{apps,platform,policies,tenants}/<unit>/base` — 공통 shape, 환경-agnostic
- 각 unit의 `overlays/{lab,dev,staging,prod}` — patches / images / replicas / resources / labels
- `gitops/clusters/<env>/<cluster>` — catalog를 선택하는 실제 rollout entrypoint
overlay는 base를 재작성하지 않는다. overlay diff가 100줄을 넘으면 base 설계 실패 신호다.
### 11. `app/managing/plugins` 책임 분리
### 11. catalog와 rollout 책임 분리
`k8s/base/` 하위는 다음 3축으로 고정한다.
`gitops/` 하위 소유권은 다음 축으로 고정한다.
- `app/units/<domain>/<service>/` — 애플리케이션 유닛 (auth, keycloak, test-server)
- `managing/` — Job/CronJob 운영 작업 (flyway-migrate, backup, restore, bootstrap admin)
- `plugins/`플랫폼 (ingress-controller, cert-manager, external-secrets, observability, policy)
- `apps/` — application-facing workload와 그 app이 독점 소유하는 data/operation
- `platform/` — 여러 app이 공유하는 platform service와 operator
- `policies/`admission, security와 governance policy
- `tenants/` — namespace, RBAC, quota와 tenant boundary
- `clusters/` — 환경/클러스터별 최종 조립과 rollout entrypoint
이 축은 **소유 팀이 다르다**는 가정 위에 있다. 각 축은 독립된 Git owner (CODEOWNERS)를 가진다.
stateful 여부보다 실제 lifecycle owner를 우선합니다. 예를 들어 app 전용
PostgreSQL과 Flyway는 해당 app catalog가, 공용 MinIO와 Vault는 platform이
소유합니다. 각 축은 독립된 Git owner(CODEOWNERS)를 가질 수 있습니다.
### 12. 상태 저장 / 외부 공개 범위를 architecture 단계에서 분류
@@ -247,50 +255,41 @@ K3s multi-server에서는 아래가 모든 서버에서 동일해야 한다(불
## 추천 디렉터리 구조
```text
k8s/
base/
app/
shared/
units/
identity/
auth/
kustomization.yaml
keycloak/
kustomization.yaml
data/
postgres-identity/
kustomization.yaml
managing/
flyway-migrate-identity/
backup-postgres/
plugins/
ingress-nginx/
cert-manager/
external-secrets/
kube-prometheus-stack/
overlays/
dev/
kustomization.yaml
staging/
kustomization.yaml
prod/
kustomization.yaml
region-kr-main/
region-kr-dr/
bootstrap/
k3s-addons-disabled/
scripts/
render.sh
diff.sh
apply.sh
bootstrap/
foundation/
gitops/
gitops/
apps/
auth-server/
base/
overlays/{lab,staging,prod}/
identity-postgres/
auth-migration/
platform/
ingress-nginx/
cert-manager/
secret-delivery/
policies/
baseline/
tenants/
identity/
clusters/
lab/main/stages/
staging/main/stages/
prod/kr-main/stages/
prod/kr-dr/stages/
scripts/
bin/
ci/
tasks/
```
## 프로젝트 기준 요약
- 환경 3종(`dev`/`staging`/`prod`) + namespace prefix 고정
- 환경 4종(`lab`/`dev`/`staging`/`prod`) + namespace prefix 고정
- well-known `app.kubernetes.io/*` 6개 + 자체 도메인 운영 label 필수
- `app.kubernetes.io/environment` 사용 금지, `example.com/environment`로 대체
- selector에는 불변 3종
- selector에는 불변 2종(`name`/`instance`)
- K3s packaged component는 초기에 disable 여부 결정, 직접 수정 금지
- `manifests/`는 apply sink, Git이 SoT
- `kubectl apply --server-side` GitOps 기본