여러 스케줄러 구성하기

여러 스케줄러 구성하기 (Configure Multiple Schedulers)

쿠버네티스는 여기에 설명된 기본 스케줄러와 함께 배포됩니다. 기본 스케줄러가 요구 사항에 맞지 않으면 자신만의 스케줄러를 구현할 수 있어요. 또한 기본 스케줄러와 함께 여러 스케줄러를 동시에 실행하고, 각 파드에 어떤 스케줄러를 사용할지 쿠버네티스에 지시할 수도 있습니다. 예시를 통해 쿠버네티스에서 여러 스케줄러를 실행하는 방법을 배워봐요.

스케줄러를 구현하는 방법에 대한 자세한 설명은 이 문서의 범위 밖입니다. 표준 예시는 쿠버네티스 소스 디렉터리의 pkg/scheduler에 있는 kube-scheduler 구현을 참조하세요.

출처: 문서

본문

시작하기 전에

쿠버네티스 클러스터가 필요하고, kubectl 명령줄 도구가 클러스터와 통신하도록 설정돼 있어야 해요.

스케줄러 패키징하기

스케줄러 바이너리를 컨테이너 이미지로 패키징해요. 이 예시의 목적을 위해 기본 스케줄러(kube-scheduler)를 두 번째 스케줄러로 사용할 수 있습니다. GitHub에서 쿠버네티스 소스 코드를 복제하고 소스를 빌드하세요.

git clone https://github.com/kubernetes/kubernetes.git
cd kubernetes
make

kube-scheduler 바이너리를 포함하는 컨테이너 이미지를 만든다. 다음은 이미지를 빌드하기 위한 Dockerfile입니다:

FROM busybox
ADD ./_output/local/bin/linux/amd64/kube-scheduler /usr/local/bin/kube-scheduler

파일을 Dockerfile로 저장하고, 이미지를 빌드한 뒤 레지스트리에 푸시한다. 이 예시는 Google Container Registry (GCR)에 푸시합니다. 자세한 내용은 GCR 문서를 읽어보세요. 또는 docker hub를 사용할 수도 있습니다. 자세한 내용은 docker hub 문서를 참조하세요.

docker build -t gcr.io/my-gcp-project/my-kube-scheduler:1.0 .     # The image name and the repository
gcloud docker -- push gcr.io/my-gcp-project/my-kube-scheduler:1.0 # used in here is just an example

스케줄러를 위한 Kubernetes Deployment 정의하기

이제 스케줄러를 컨테이너 이미지로 만들었으니, 이를 위한 파드 구성을 만들고 쿠버네티스 클러스터에서 실행한다. 하지만 클러스터에 직접 파드를 만드는 대신, 이 예시에서는 Deployment를 사용할 수 있습니다. DeploymentReplica Set을 관리하며 Replica Set이 다시 파드를 관리하므로, 스케줄러가 오류에 탄력적이 됩니다. 다음은 deployment 구성입니다. my-scheduler.yaml로 저장하세요:

[위 매니페스트에서] 스케줄러 구현의 동작을 사용자 정의하기 위해 KubeSchedulerConfiguration을 사용합니다. 이 구성은 --config 옵션으로 초기화 중 kube-scheduler에 전달됩니다. my-scheduler-config ConfigMap이 구성 파일을 저장합니다. my-scheduler Deployment의 파드는 my-scheduler-config ConfigMap을 볼륨으로 마운트합니다.

앞서 언급한 Scheduler Configuration에서 스케줄러 구현은 KubeSchedulerProfile로 표현됩니다.

스케줄러가 특정 파드를 스케줄링할 책임이 있는지 결정하려면 PodTemplate 또는 Pod 매니페스트의 spec.schedulerName 필드가 KubeSchedulerProfileschedulerName 필드와 일치해야 합니다. 클러스터에서 실행되는 모든 스케줄러는 고유한 이름을 가져야 합니다.

또한 전용 서비스 계정 my-scheduler를 만들고 ClusterRole system:kube-scheduler를 바인딩해 kube-scheduler와 같은 권한을 얻도록 한다는 점에 주의하세요.

다른 명령줄 인자에 대한 자세한 설명은 kube-scheduler 문서를, 다른 사용자 정의 가능한 kube-scheduler 구성에 대한 자세한 설명은 Scheduler Configuration 참조를 참조하세요.

클러스터에서 두 번째 스케줄러 실행하기

쿠버네티스 클러스터에서 스케줄러를 실행하려면 위 구성에 지정된 deployment를 쿠버네티스 클러스터에 만든다:

kubectl create -f my-scheduler.yaml

스케줄러 파드가 실행 중인지 확인한다:

kubectl get pods --namespace=kube-system
NAME                                           READY     STATUS    RESTARTS   AGE
....
my-scheduler-lnf4s-4744f                       1/1       Running   0          2m
...

이 목록에서 기본 kube-scheduler 파드 외에 "Running" 상태의 my-scheduler 파드가 보여야 합니다.

리더 선출(leader election) 활성화하기

리더 선출이 활성화된 다중 스케줄러를 실행하려면 다음을 수행해야 합니다:

YAML 파일의 my-scheduler-config ConfigMap에서 KubeSchedulerConfiguration에 대해 다음 필드를 업데이트한다:

  • leaderElection.leaderElecttrue
  • leaderElection.resourceNamespace<lock-object-namespace>
  • leaderElection.resourceName<lock-object-name>으로

컨트롤 플레인이 잠금 객체를 만들어 주지만, 네임스페이스는 이미 존재해야 합니다. kube-system 네임스페이스를 사용할 수 있습니다.

클러스터에서 RBAC가 활성화되어 있다면 system:kube-scheduler 클러스터 역할을 업데이트해야 합니다. 다음 예시처럼 endpointsleases 리소스에 적용되는 규칙의 resourceNames에 스케줄러 이름을 추가하세요:

kubectl edit clusterrole system:kube-scheduler

파드에 스케줄러 지정하기

이제 두 번째 스케줄러가 실행 중이니 몇 개의 파드를 만들고, 기본 스케줄러 또는 배포한 스케줄러 중 하나가 스케줄링하도록 지시한다. 특정 스케줄러로 주어진 파드를 스케줄링하려면 그 파드 스펙에 스케줄러의 이름을 지정하세요. 세 가지 예시를 살펴봅시다.

  • 스케줄러 이름이 없는 파드 스펙

    스케줄러 이름이 제공되지 않으면 파드는 기본 스케줄러(default-scheduler)를 사용해 자동으로 스케줄링됩니다.

    이 파일을 pod1.yaml로 저장하고 쿠버네티스 클러스터에 제출한다.

    kubectl create -f pod1.yaml
    
  • default-scheduler가 있는 파드 스펙

    스케줄러는 spec.schedulerName에 스케줄러 이름을 값으로 제공해 지정됩니다. 이 경우 기본 스케줄러의 이름인 default-scheduler를 제공합니다.

    이 파일을 pod2.yaml로 저장하고 쿠버네티스 클러스터에 제출한다.

    kubectl create -f pod2.yaml
    
  • my-scheduler가 있는 파드 스펙

    이 경우 이 파드가 우리가 배포한 스케줄러 my-scheduler를 사용해 스케줄링되어야 한다고 지정합니다. spec.schedulerName의 값이 매핑 KubeSchedulerProfileschedulerName 필드에 제공된 이름과 일치해야 한다는 점에 주의하세요.

    이 파일을 pod3.yaml로 저장하고 쿠버네티스 클러스터에 제출한다.

    kubectl create -f pod3.yaml
    

    세 파드 모두 실행 중인지 확인한다.

    kubectl get pods
    

파드가 원하는 스케줄러로 스케줄링되었는지 확인하기

이 예시들을 쉽게 진행하기 위해 파드가 실제로 원하는 스케줄러로 스케줄링되었는지는 검증하지 않았습니다. 파드와 deployment 구성의 제출 순서를 바꿔 이를 검증할 수 있습니다. 모든 파드 구성을 스케줄러 deployment 구성보다 먼저 쿠버네티스 클러스터에 제출하면, annotation-second-scheduler 파드는 다른 두 파드가 스케줄링되는 동안 영원히 "Pending" 상태로 남는 것을 볼 수 있습니다. 스케줄러 deployment 구성을 제출하고 새 스케줄러가 실행을 시작하면, annotation-second-scheduler 파드도 스케줄링됩니다.

또는 이벤트 로그의 "Scheduled" 항목을 살펴 파드가 원하는 스케줄러로 스케줄링되었는지 확인할 수 있습니다.

kubectl get events

관련 컨트롤 플레인 노드에서 스태틱 파드 매니페스트를 수정해 클러스터의 기본 스케줄러에 사용자 정의 스케줄러 구성이나 사용자 정의 컨테이너 이미지를 사용할 수도 있습니다.

더 알아보기 (Learn more)