본문으로 건너뛰기

[Ray Autoscaler] ALLOCATION_TIMEOUT에서 TERMINATED로의 상태 전이 허용

PR 링크: ray-project/ray#61382 상태: Merged | 변경: +19 / -3

들어가며

Ray의 v2 오토스케일러는 인스턴스 생명주기를 상태 머신으로 관리한다. KubeRay 환경에서 GPU 파드가 리소스 부족으로 Pending 상태에 머물면 ALLOCATION_TIMEOUT으로 전이된다. 이때 해당 파드가 외부에서 삭제되거나 사라지면 reconciler가 TERMINATED로 전이를 시도하는데, 기존 상태 머신은 ALLOCATION_TIMEOUT -> TERMINATED를 허용하지 않아 assertion 오류가 발생했다.

핵심 코드 분석

Before: ALLOCATION_TIMEOUT에서 TERMINATING만 허용

Instance.ALLOCATION_TIMEOUT: {
    Instance.TERMINATING
},

After: TERMINATED 직접 전이도 허용

Instance.ALLOCATION_TIMEOUT: {
    Instance.TERMINATING,
    # Cloud instance already disappeared; skip termination request.
    Instance.TERMINATED,
},
Instance.TERMINATION_FAILED: {
    Instance.TERMINATING,
    Instance.TERMINATED,  # 동일한 이유로 추가
},

왜 이게 좋은가

  1. 실제 운영 시나리오 반영: KubeRay에서 파드가 수동 삭제되거나, 클라우드 인스턴스가 다른 프로세스에 의해 종료되는 경우는 실제로 흔하게 발생한다. 상태 머신이 이를 허용하지 않으면 오토스케일러 전체가 에러 상태에 빠진다.
  2. 불필요한 중간 단계 제거: 이미 사라진 인스턴스에 대해 TERMINATING(종료 요청)을 거치는 것은 의미가 없다. 존재하지 않는 리소스에 종료 요청을 보내는 것은 불필요한 재시도만 유발한다.
  3. TERMINATION_FAILED에도 동일 적용: 종료 실패 후에도 인스턴스가 사라졌으면 바로 TERMINATED로 전이할 수 있도록 하여, 좀비 인스턴스 상태를 방지한다.

상태 머신 설계에서 현실 세계의 비동기성을 반영하는 것이 중요하다. 외부 시스템(클라우드, Kubernetes)은 우리의 상태 전이 순서를 반드시 따르지 않기 때문이다.

참고 자료

댓글

관련 포스트

PR Analysis 의 다른글