RayService
RayService란 무엇인가?
RayService는 두 가지 핵심 컴포넌트를 관리하는 Kubernetes 리소스입니다
RayCluster: Kubernetes 클러스터 내의 리소스를 관리
Ray Serve Applications: 사용자의 애플리케이션을 관리
RayService가 제공하는 주요 기능
- Kubernetes 네이티브 지원
Kubernetes 설정을 통해 Ray 클러스터와 Ray Serve 애플리케이션을 정의
kubectl 명령어로 클러스터와 애플리케이션 생성 가능
- In-place 업데이트
Ray Serve 애플리케이션의 무중단 업데이트 지원
서비스 중단 없이 새로운 버전 배포 가능
- 제로 다운타임 업그레이드
Ray 클러스터 업그레이드 시 서비스 중단 최소화
롤링 업데이트 방식으로 안전한 업그레이드
- 고가용성 서비스
장애 발생 시 자동 복구 메커니즘
여러 노드에 걸친 분산 배포로 안정성 확보
실습 예제: 두 개의 Ray Serve 애플리케이션 서빙
Step 1: Kind를 사용한 Kubernetes 클러스터 생성
kind create cluster --image=kindest/node:v1.26.0
- Kind: Kubernetes in Docker, 로컬 개발용 Kubernetes 클러스터
- v1.26.0 노드 이미지 사용으로 호환성 보장
Step 2: KubeRay Operator 설치
- Helm 저장소에서 최신 안정 버전의 KubeRay operator 설치
- serveConfigV2 사용으로 멀티 애플리케이션 Serve 구성 지원 (KubeRay v0.6.0부터 지원)
Step 3: RayService 설치
kubectl apply -f https://raw.githubusercontent.com/ray-project/kuberay/v1.4.0/ray-operator/config/samples/ray-service.sample.yaml
- 미리 정의된 샘플 RayService 매니페스트 적용
- 두 개의 샘플 애플리케이션 (과일 가게, 계산기) 포함
Step 4: 클러스터 상태 확인
4.1 RayService 리소스 확인
kubectl get rayservice
- SERVICE STATUS: Running (실행 상태)
- NUM SERVE ENDPOINTS: 2 (두 개의 서브 엔드포인트)
4.2 RayCluster 리소스 확인
kubectl get raycluster
- DESIRED WORKERS: 1 (원하는 워커 노드 수)
- AVAILABLE WORKERS: 1 (사용 가능한 워커 노드 수)
- CPUS/MEMORY/GPUS: 리소스 할당 현황
- STATUS: ready (준비 상태)
4.3 Ray Pod 상태 확인
kubectl get pods -l=ray.io/is-ray-node=yes
- Head 노드와 Worker 노드 Pod들의 실행 상태 확인
- ray.io/is-ray-node=yes 라벨로 Ray 관련 Pod만 필터링
4.4 RayService Ready 상태 확인
kubectl describe rayservices.ray.io rayservice-sample
- Ready 조건이 True일 때 요청을 처리할 준비 완료
- NonZeroServeEndpoints 이유로 준비 상태 달성
4.5 서비스 목록 확인
두 가지 주요 서비스가 생성됩니다:
- rayservice-sample-cxm7t-head-svc
- 활성 RayCluster의 head pod를 가리킴
- Ray Dashboard 접근용 (포트 8265)
- 클러스터 모니터링 및 관리
- rayservice-sample-serve-svc
- Ray Serve의 HTTP 인터페이스 노출 (포트 8000)
- REST API, ML 추론 등의 요청 처리
- 실제 애플리케이션 서비스 엔드포인트
Step 5: Serve 애플리케이션 상태 확인
kubectl port-forward svc/rayservice-sample-head-svc 8265:8265
Step 6: 애플리케이션 요청 테스트
6.1 테스트용 curl Pod 실행
kubectl run curl --image=radial/busyboxplus:curl -i --tty
- 클러스터 내부에서 서비스 테스트용 Pod 생성
6.2 과일 가게 앱 테스트
curl -X POST -H 'Content-Type: application/json' rayservice-sample-serve-svc:8000/fruit/ -d '["MANGO", 2]' # 출력 6
- /fruit/ 엔드포인트에 POST 요청
- 망고 2개의 가격 계산 (결과: 6)
6.3 계산기 앱 테스트
bashcurl -X POST -H 'Content-Type: application/json' rayservice-sample-serve-svc:8000/calc/ -d '["MUL", 3]' # 출력: "15 pizzas please!"
- /calc/ 엔드포인트에 곱셈 요청
- 3을 곱한 결과를 피자 주문 형태로 반환
Step 7: 리소스 정리
# RayService 삭제
kubectl delete -f https://raw.githubusercontent.com/ray-project/kuberay/v1.4.0/ray-operator/config/samples/ray-service.sample.yaml
# KubeRay operator 제거
helm uninstall kuberay-operator
# curl Pod 삭제
kubectl delete pod curl