1. Yunikorn 이란 ?
- 쿠버네티스에서 동작하는 Batch , Data & ML 서비스를 위한 리소스의 파워를 unleash(해방,촉발시키는) 하는 스케쥴러다.(1)
- k8s 기본 스케쥴러의 대안으로 활용될 수 있는 스케쥴러로, 특히 다양한 리소스의 요구사항을 만족시킬 수 있는 기능들을 제공한다.
2.왜 Yunikorn?
- 기존의 k8s 스케쥴러는 CPU, Memory, GPU 등의 리소스만을 고려하여 스케쥴링을 수행하는데, 만약 다양하고 많은 양의 Pod 가 배포되고 회수되는 환경에서 필요하게되는 미세한 조정이 어려운 단점이 있다.
- 그런 부분에서 Yunikorn 은 아래에서 소개할 다양한 기능으로 단점을 보완해준다.
- yunikorn 과 함께 많이 사용되는 volcano(2) 스케쥴러가 있다.(개인적으로 volcano 가 더 어려워보여서 유니콘을 선택했다.. 유니콘은 대시보드를 제공해주는 점이 더 매력적이었고)
- yunikorn 은 apache incubator 프로젝트고 volcano 는 cnf(cloud native computing foundation) 프로젝트이다.)
3. Features
- App-aware 스케쥴링
- k8s 기본 스케쥴러와 달리 컨텍스트 정보(사용자, 애플리케이션, 큐 등) 기반의 스케쥴링을 지원한다.
- 리소스 총량, 공정성 정책, 우선순위 정책으로 스케쥴링 fine-grained controls (적은 범위의 제어)를 할 수 있다.
- 계층적 구조의 리소스 큐
- 큐 간의 계층적 구조를 통해 multi-tenancy 환경에서 효율적인 리소스 할당을 할 수 있다.
- Job Ordering and Queuing
- 작업의 우선순위를 지정하고, 작업이 큐에 들어갈 때 우선순위에 따라 큐에 배치된다.
- FIFO, Fair, StateAware, piriority 정책을 지원한다.
- 갱 스케쥴
- 쉽게 말해 분산 환경에서 All or Nothing 스케쥴 방식이다.
- 애플리케이션이 필요한 리소스의 세트(묶음)을 요청하고, 이 리소스가 모두 확보될 때 한 번에 스케쥴링한다.
- 갱 스케쥴러가 placeholder pod(임시 pod)를 배정하고, UpScaling이 일어난 후 실제 pod 와 교체되는 방식이다.
- 갱 스케쥴을 사용할 경우 FIFO 정책을 사용하게 된다. (왜냐하면 policy 는 리소스를 부분적으로 예약하기 때문에 리소스 세그먼트가 발생할 수 있다.)
4. Yunikorn 사용하기
***아래 가이드는 쿠버네티스 사용이 익숙한 사람들 기준으로 작성된 점 참고바랍니다.
A.yunikorn 설치
2가지 설치 모드
- embeddedAdmissionController
- 쿠버네티스 기본 스케쥴러 대신 유니콘 스케쥴러를 사용하는 모드
- api server 와 통신하는 모든 트래픽을 유니콘 스케쥴러로 라우팅한다
- 성능이 뛰어나다고 하다..ㅇㅅㅇ
- plugin Mode
- 기본 스케쥴러의 framework 일부로 작동하는 모드
- mixed workload 에 적합하다.
그리고 helm repo values.yaml 파일 작성 (4)
service:
type: NodePort
targetPort: 9080
portWeb: 9889
** 다른 설정은 하지 않았고, Dashboard ingress 생성을 위해 service 만 NodePort 로 변경했다
Ingress 생성
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: yunikorn-ingress
namespace: yunikorn
annotations:
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: instance
alb.ingress.kubernetes.io/subnets: [ 사용하는 서브넷 ]
alb.ingress.kubernetes.io/security-groups: [보안 그룹 ]
alb.ingress.kubernetes.io/load-balancer-name: [로드밸랜서 이름]
spec:
ingressClassName: alb
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: yunikorn-service
port:
number: 9889
helm 설치 스크립트
#!/bin/bash
helm repo add yunikorn https://apache.github.io/yunikorn-release
helm repo update
echo "install yunikorn by helm.."
helm upgrade --cleanup-on-fail \
--install yunikorn yunikorn/yunikorn \
--namespace yunikorn \
--create-namespace \
--version=1.6.0 \
--values values.yaml
**혹시 필요한 사람을 위해 설치스크립트도 공유한다.**
대시보드 화면
B. Yunikorn 사용
- Standard mode 로 설치했을 경우 어떤 파드로 배포하더라도 yunikorn 스케쥴러가 파드를 스케쥴링한다.
- 필자의 경우 처럼 Spark Job 을 실행할때는 아래와 같이 속성값을 추가해줘야 한다
- controller.batchScheduler.enable=true
- controller.batchScheduler.default=yunikorn
* EKS 기준으로 yunikorn 을 이용해 spark job 을 배포하는 가이드는 별도로 포스팅하고, 잘 작성된 가이드로 마무리하겠다. (3)
5.출처
- 이 포스팅에 대한 설명은 함께 작업했던 강인호(aws 코리아)님께서 공유해주신 자료를 복습하고 요약하였다.
6.References
(1) https://yunikorn.apache.org/
(2) https://volcano.sh/en/
(3) https://docs.aws.amazon.com/ko_kr/emr/latest/EMR-on-EKS-DevelopmentGuide/tutorial-yunikorn.html
(4) https://artifacthub.io/packages/helm/yunikorn/yunikorn
'Data Engineer' 카테고리의 다른 글
airflow - Dag Factory (0) | 2025.02.18 |
---|---|
airflow - gitSync 기능 연동 (0) | 2025.02.17 |
쿠버네티스 -스테이트풀셋(statefulset)를 이용해 ElasticSearch 배포 (0) | 2024.12.29 |
쿠버네티스 - 디플로이먼트(deployment)를 이용해 MySQL 배포 (1) | 2024.12.09 |
파이썬 데일리코딩 - 다이나믹 프로그래밍 (0) | 2024.11.25 |