#DevOps

Spark Connect on Kubernetes #2: Operator로 만드는 Control Plane

Spark Connect on Kubernetes #2: Operator로 만드는 Control Plane
01

Summary

Spark Connect 서버의 무중단 세션 교체와 쿠버네티스 오퍼레이터 구축기

토스증권 데이터 인프라팀이 겪은 컨트롤 플레인 설계와 드라이버 무중단 전환 기술 노하우

본 아티클은 쿠버네티스 환경에서 Spark Connect 서버들의 생명주기를 효율적으로 제어하기 위한 Control Plane 구성 방식을 다룹니다. Apache Spark Operator와 자체 개발한 Spark Tenant Operator의 역할을 명확히 나누어 Blue-Green 배포 및 세션 드레인을 구현했습니다. 또한 커스텀 gRPC 헬스체크와 Network IP 우회 설정을 통해 기동 과정의 교착 상태까지 해결한 실무적 인사이트를 제공합니다.

  • 01단일 서버 복구(Spark Operator)와 다중 서버 무중단 배포(Tenant Operator)의 계층적 역할 분리
  • 02Blue-Green 기법과 90분 세션 드레인을 통한 기존 세션 영향 최소화
  • 03gRPC 포트 직접 확인 및 Pod IP 우회 설정을 활용한 K8s readiness/DNS 교착 상태 해결
  • 04Degraded, Unavailable, Ready 상태 등으로 테넌트 가용성 및 진행 상황 추상화

RECOMMENDATION

쿠버네티스상에서 대용량 데이터 처리 워크로드를 운영하거나 Stateful한 데이터 분석 서버의 무중단 배포 체계를 고민하는 데브옵스 및 데이터 엔지니어에게 적극 추천합니다.

The Problem

여러 Spark Connect 서버의 생명주기를 관리할 때, 실행 중인 세션을 끊지 않고 버전을 업데이트하거나 장애를 복구해야 하는 문제가 있었습니다. 또한 Driver Pod의 readiness 판정 오류로 인해 초기화 단계에서 Executor와 Driver 간의 연결 교착 상태가 발생했습니다.

The Solution

단일 서버 관리는 Apache Spark Operator에 맡기고, 다중 서버 테넌트 관리는 커스텀 Spark Tenant Operator를 구축하여 두 계층으로 역할을 분리했습니다. 신규 세션 목적지만 전환하는 Blue-Green 방식과 세션 드레인 매커니즘을 도입하고, gRPC 기반 readiness probe 및 Driver Pod IP 직접 연결 옵션을 통해 초기화 교착을 해결했습니다.

The Result

기존 세션을 안전하게 유지하면서 Spark 서버 설정 및 버전을 무중단으로 적용할 수 있는 Control Plane을 구축했습니다. 테넌트 단위의 가용성과 동작 상태를 분리 표현하여 시스템 운용의 투명성을 확보했습니다.

Trade-off

기존 서버의 세션 종료를 기다리는 드레인 제한 시간이 기본 90분으로 설정되어 있어, 90분을 초과하는 초장기 실행 세션은 서버 삭제 시점에 세션이 단절될 수 있습니다.

03

Key Concepts

Concept · 01

Spark Tenant Operator

용도별 Spark Connect 서버 집합(테넌트)의 목표 개수, 이미지, 자원 설정을 선언적으로 관리하는 오퍼레이터입니다. Deployment와 유사하게 여러 SparkApplication의 생명주기와 세션 전환을 제어합니다.

  • 신규 generation 생성을 통한 Blue-Green 배포 수행
  • 기존 서버의 신규 세션 차단 및 세션 드레인(Drain) 관리
Concept · 02

Blue-Green Deployment & Drain

새로운 버전의 서버들을 목표 수만큼 온전히 준비한 뒤 신규 요청 목적지를 한 번에 전환하는 배포 방식입니다. 기존 서버는 드레인 상태로 전환되어 기존 작업이 끝날 때까지 대기한 후 안전하게 정리됩니다.

  • Gateway의 currentGeneration 변경을 통해 신규 세션만 새 서버로 유도
  • 최대 90분의 드레인 대기 시간을 두어 잔여 세션 작업 보장
Concept · 03

Readiness Probe & DNS Deadlock

Driver Pod가 실제 Connect 요청을 수용할 수 있는지 확인하는 검사 메커니즘과, 초기화 과정에서 DNS 게시 조건이 맞물려 발생하는 대기 상태 문제입니다.

  • gRPC 포트 연결을 3초 이내에 검증하는 exec probe 적용
  • spark.kubernetes.executor.useDriverPodIP 옵션을 이용해 Headless Service DNS 대기 교착 회피