Helm 배포
GenD 핵심 서비스를 Helm 차트와 kubectl 매니페스트로 배포하는 절차입니다.
개요
GenD는 공식 Helm 차트(Trino)와 직접 K8s 매니페스트(gend-api, Keycloak 등)를 혼합 사용합니다. 서비스 간 의존성을 고려하여 순서대로 배포해야 합니다.
배포 순서
# 1단계: 기반 서비스
kubectl apply -f infra/helm/postgresql/
# 오브젝트 스토리지 — 디렉토리 통째 apply 금지, 명시 파일로 (#2991):
# deployment.yaml 의 Deployment 가 secret.yaml 의 seaweedfs-s3-config 를 볼륨으로
# 마운트하므로 Secret 이 먼저 있어야 한다. secret.yaml 은 **재적용하지 않는다** —
# dev 스타일 정적 자격증명(gend/gend123)이 그대로 박혀 있어, 이미 회전된 기존
# 클러스터에 무조건 apply 하면 회전값이 이 파일의 정적 값으로 되돌아간다(#2991
# 이 고치려던 사고 그 자체 — PR #2999 리뷰).
#
# ① 최초 설치(신규 클러스터): 아래 한 줄이 Secret 이 없을 때만 레포 정적값으로
# 생성한다. 이 정적값은 Kind 로컬 dev 전용이다 — prod 는 SealedSecret 또는
# 외부 Secret 공급자로 별도 프로비저닝하고 이 파일을 그대로 적용하지 말 것.
kubectl get secret seaweedfs-s3-config -n gend >/dev/null 2>&1 || \
kubectl apply -f infra/seaweedfs/secret.yaml
# ② 기존 클러스터(재실행/업그레이드): 위 한 줄은 Secret 이 이미 있으면 아무 것도
# 하지 않는다 — 존재와 필요한 키만 검증하려면:
# kubectl get secret seaweedfs-s3-config -n gend -o jsonpath='{.data.s3\.json}' | head -c1
# kubectl get secret seaweedfs-credentials -n gend -o jsonpath='{.data.AWS_ACCESS_KEY_ID}' | head -c1
# (출력이 없으면 Secret 또는 키가 없다는 뜻 — 수동 확인 필요.)
kubectl apply -f infra/seaweedfs/deployment.yaml
kubectl apply -f infra/seaweedfs/capacity-exporter.yaml
# 2단계: 메타데이터
kubectl apply -f infra/helm/hive-metastore/
# 3단계: 쿼리 엔진
helm install trino trino/trino -n gend -f infra/helm/trino/values.yaml
# 4단계: 인증/보안
kubectl apply -f infra/keycloak/
kubectl apply -f infra/vault/vault-standalone.yaml
# 5단계: GenD 애플리케이션
kubectl apply -f infra/helm/gend-api/
# 6단계: 모니터링/감사
kubectl apply -f infra/opensearch/
kubectl apply -f infra/fluent-bit/
helm install kube-prometheus monitoring/kube-prometheus-stack \
-n monitoring -f infra/monitoring/kube-prometheus-stack-values.yaml
:::note 알람 수신자는 opt-in — 폐쇄망에서도 그대로 동작
위 values 는 알람 수신자 없이 기동합니다(외부 egress 0, 추가 시크릿 불요 —
발화 알람은 Alertmanager/Grafana UI 에서 열람). 알림 전송이 필요하면 설치 후
환경에 맞는 수신자를 붙입니다: Slack(웹훅 시크릿, values 내 주석 절차),
사내 SMTP(email_configs), 사내 메신저 webhook(Mattermost 는 slack_configs
호환). 시크릿 없이 수신자 블록만 켜면 Alertmanager 가 기동에 실패하므로
반드시 시크릿을 먼저 만듭니다.
:::
시크릿 생성
배포 전 필수 시크릿을 생성합니다.
kubectl create secret generic gend-pg-secret -n gend \
--from-literal=password=<PG_PASSWORD>
kubectl create secret generic keycloak-admin-secret -n gend \
--from-literal=admin-password=<KC_PASSWORD>
kubectl create secret generic postgresql-secret -n gend \
--from-literal=password=<PG_PASSWORD>
프로덕션에서는 SealedSecrets(
infra/sealed-secrets/) 또는 Vault를 통해 관리합니다.
Trino Helm 주요 설정
| 설정 | 개발 | 프로덕션 | 설명 |
|---|---|---|---|
worker.replicas | 1 | 3+ | 워커 노드 수 |
coordinator.jvm.maxHeapSize | 3G | 8G+ | JVM 힙 크기 |
query.max-memory | 2GB | 8GB+ | 쿼리당 최대 메모리 |
프로덕션 배포 (Azure)
# Azure 배포 스크립트
bash infra/azure-deploy/scripts/01-push-images.sh
bash infra/azure-deploy/scripts/02-deploy-k8s.sh
bash infra/azure-deploy/scripts/03-status.sh