본문으로 건너뛰기

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.replicas13+워커 노드 수
coordinator.jvm.maxHeapSize3G8G+JVM 힙 크기
query.max-memory2GB8GB+쿼리당 최대 메모리

프로덕션 배포 (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

관련 문서