본문으로 건너뛰기

Admin / SRE — Trino JWT 운영

Phase 5 활성화로 Trino coordinator 가 JWT 검증을 강제합니다. 관리자는 새로 세 가지 운영 시나리오를 알아야 합니다.

사전 준비

  • kubectl context aks-genos-prod 접근 권한
  • Keycloak admin 계정
  • SealedSecret 재봉인용 kubeseal 도구

시나리오 1 — JWT 설정 변경 후 coordinator 재시작

Helm values 변경 (예: required-issuer URL) 후 반영 절차.

# 1) Helm upgrade — 차트 버전은 저장소 스크립트와 동기화 (현재 pin 없음)
# HPA scale 충돌이 나면 PR #533 이슈 참고
helm --kube-context aks-genos-prod upgrade trino trino/trino \
-n gend -f infra/helm/trino/values.yaml --timeout 5m

# 2) ConfigMap 이 업데이트됐는지 확인
kubectl --context aks-genos-prod get cm trino-coordinator -n gend \
-o jsonpath='{.data.config\.properties}' | grep authentication

# 3) coordinator 재기동 + rollout 완료 대기 (새 ConfigMap 반영)
kubectl --context aks-genos-prod rollout restart deploy/trino-coordinator -n gend
kubectl --context aks-genos-prod rollout status deploy/trino-coordinator -n gend --timeout=180s

# 4) GenD API 토큰 캐시 무효화 + 배포 완료 대기 (선택 — 자동 만료 대기 가능)
kubectl --context aks-genos-prod rollout restart deploy/gend-api -n gend
kubectl --context aks-genos-prod rollout status deploy/gend-api -n gend --timeout=120s

시나리오 2 — Keycloak trino client_secret 회전

과도기 운영 상태

현재 GEND_TRINO_JWT_CLIENT_SECRET 은 Deployment 평문 env 로 주입되어 있습니다. 기존 trino-secrets SealedSecret 은 Trino 내부 통신용(shared-secret, keystore-password) 이라 client_secret 전용 키가 없습니다. 전용 SealedSecret 도입은 별도 이슈로 추적 예정 — 자세한 배경은 admin-ops/auth/trino-jwt 참고.

# 1) Keycloak admin 콘솔 → Clients → trino → Credentials → Regenerate secret
NEW_SECRET="<paste_here>"

# 2) (현재 과도기) Deployment env 직접 갱신 + rollout 완료 대기
kubectl --context aks-genos-prod set env deploy/gend-api -n gend \
GEND_TRINO_JWT_CLIENT_SECRET="${NEW_SECRET}"
kubectl --context aks-genos-prod rollout status deploy/gend-api -n gend --timeout=120s

# 3) (목표 아키텍처) 전용 SealedSecret 으로 이전 후에는 다음으로 대체:
# kubectl create secret generic gend-api-trino-jwt \
# --from-literal=client-secret="${NEW_SECRET}" \
# -n gend --dry-run=client -o yaml \
# | kubeseal -o yaml > infra/sealed-secrets/sealed-secrets/gend-api-trino-jwt.yaml
# # PR → ArgoCD 자동 반영

# 4) 검증 (레이블 셀렉터로 첫 실행 Pod 지목)
POD=$(kubectl --context aks-genos-prod get pod -n gend -l app=gend-api \
-o jsonpath='{.items[0].metadata.name}')
kubectl --context aks-genos-prod exec -n gend "$POD" -c gend-api -- python3 -c "
import asyncio
from gend_api.services.trino_client import check_trino_health
print('health:', asyncio.run(check_trino_health()))
"
# → health: True 기대

시나리오 3 — JWT 장애 진단

에러 패턴별 대응표

로그 메시지원인대응
Authentication requiredBearer 미첨부gend-api 의 GEND_TRINO_JWT_ENABLED 확인, Pod env 재로드
Token is not valid — issuer mismatchrequired-issuer URL ≠ Keycloak 발급 issuerKeycloak realm tokenIssuer 와 values.yaml 비교
JWT signature does not matchJWKS endpoint 갱신 실패 또는 키 회전Trino coordinator 재시작, Keycloak JWKS URL 접근성 확인
Unable to fetch JWKDNS/네트워크로 JWKS URL 접근 불가key-file URL 을 클러스터 내부 URL 로 변경
Configuration property 'http-server.authentication.*' was not usedworker 에 JWT 속성이 적용됨values.yaml 에서 additionalConfigPropertiesserver.coordinatorExtraConfig 로 이동
GenD API 로그 Trino JWT is enabled but Keycloak service-account token is emptyKeycloak 다운 또는 client_secret 불일치Keycloak health, SealedSecret 값 재확인

빠른 로그 조회

레이블 셀렉터를 쓰면 다중 레플리카의 모든 Pod 로그가 합쳐져 조회됩니다 (deploy/X 는 단일 Pod 한정).

# coordinator 측
kubectl --context aks-genos-prod logs -n gend -l app.kubernetes.io/component=coordinator --tail=200 \
| grep -iE "Authentication|JWT|Unauthorized|signature"

# GenD API 측
kubectl --context aks-genos-prod logs -n gend -l app=gend-api -c gend-api --tail=200 \
| grep -iE "keycloak|jwt|trino"

긴급 롤백 (JWT 비활성화)

JWT 때문에 운영 장애가 계속되는 경우 임시 비활성화:

# values.yaml 에서 coordinatorExtraConfig 섹션 주석 처리 → helm upgrade
# 또는 GenD API 측만 비활성화:
kubectl --context aks-genos-prod set env deploy/gend-api -n gend \
GEND_TRINO_JWT_ENABLED=false
kubectl --context aks-genos-prod rollout status deploy/gend-api -n gend

# Trino coordinator 의 authentication type 도 주석 처리해야 쿼리가 통과

Trino 는 coordinator 재시작이 필요합니다. 롤백 완료 후에는 반드시 근본 원인(Keycloak 설정, 네트워크, secret 드리프트)을 해결하고 재활성화하십시오.

관련 문서