3.10. 사용자 정의 스케줄러 실행


기본 스케줄러와 함께 여러 사용자 정의 스케줄러를 실행하고 각 Pod에 사용할 스케줄러를 구성할 수 있습니다.

중요

OpenShift Container Platform에서 사용자 정의 스케줄러를 사용하는 것이 지원되지만 Red Hat은 사용자 정의 스케줄러의 기능을 직접 지원하지 않습니다.

기본 스케줄러를 구성하는 방법에 대한 자세한 내용은 Pod 배치를 제어하도록 기본 스케줄러 구성을 참조하십시오.

특정 스케줄러를 사용하여 지정된 Pod를 예약하려면 해당 Pod 사양에서 스케줄러의 이름을 지정합니다.

3.10.1. 사용자 정의 스케줄러 배포

클러스터에 사용자 지정 스케줄러를 포함하려면 배포에 사용자 지정 스케줄러의 이미지를 포함합니다.

사전 요구 사항

  • cluster-admin 역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.
  • 스케줄러 바이너리가 있습니다.

    참고

    스케줄러 바이너리 생성 방법에 대한 정보는 이 문서의 범위를 벗어납니다. 예를 들어 Kubernetes 문서 의 다중 스케줄러 구성을 참조하십시오. 사용자 지정 스케줄러의 실제 기능은 Red Hat에서 지원하지 않습니다.

  • 스케줄러 바이너리가 포함된 이미지를 생성하여 레지스트리로 푸시했습니다.

절차

  1. 스케줄러 구성 파일을 보유한 구성 맵이 포함된 파일을 생성합니다.

    scheduler-config-map.yaml의 예

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: scheduler-config
      namespace: kube-system 1
    data:
      scheduler-config.yaml: | 2
        apiVersion: kubescheduler.config.k8s.io/v1beta2
        kind: KubeSchedulerConfiguration
        profiles:
          - schedulerName: custom-scheduler 3
        leaderElection:
          leaderElect: false

    1
    이 절차에서는 kube-system 네임스페이스를 사용하지만 선택한 네임스페이스를 사용할 수 있습니다.
    2
    이 절차의 뒷부분에서 Deployment 리소스를 정의할 때 --config 인수를 사용하여 이 파일을 스케줄러 명령에 전달합니다.
    3
    사용자 정의 스케줄러의 스케줄러 프로필을 정의합니다. 이 스케줄러 이름은 Pod 구성에서 schedulerName 을 정의할 때 사용됩니다.
  2. config map을 생성합니다.

    $ oc create -f scheduler-config-map.yaml
  3. 사용자 정의 스케줄러의 배포 리소스가 포함된 파일을 생성합니다.

    custom-scheduler.yaml 파일의 예

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: custom-scheduler
      namespace: kube-system 1
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: custom-scheduler-as-kube-scheduler
    subjects:
    - kind: ServiceAccount
      name: custom-scheduler
      namespace: kube-system 2
    roleRef:
      kind: ClusterRole
      name: system:kube-scheduler
      apiGroup: rbac.authorization.k8s.io
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: custom-scheduler-as-volume-scheduler
    subjects:
    - kind: ServiceAccount
      name: custom-scheduler
      namespace: kube-system 3
    roleRef:
      kind: ClusterRole
      name: system:volume-scheduler
      apiGroup: rbac.authorization.k8s.io
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        component: scheduler
        tier: control-plane
      name: custom-scheduler
      namespace: kube-system 4
    spec:
      selector:
        matchLabels:
          component: scheduler
          tier: control-plane
      replicas: 1
      template:
        metadata:
          labels:
            component: scheduler
            tier: control-plane
            version: second
        spec:
          serviceAccountName: custom-scheduler
          containers:
          - command:
            - /usr/local/bin/kube-scheduler
            - --config=/etc/config/scheduler-config.yaml 5
            image: "<namespace>/<image_name>:<tag>" 6
            livenessProbe:
              httpGet:
                path: /healthz
                port: 10259
                scheme: HTTPS
              initialDelaySeconds: 15
            name: kube-second-scheduler
            readinessProbe:
              httpGet:
                path: /healthz
                port: 10259
                scheme: HTTPS
            resources:
              requests:
                cpu: '0.1'
            securityContext:
              privileged: false
            volumeMounts:
            - name: config-volume
              mountPath: /etc/config
          hostNetwork: false
          hostPID: false
          volumes:
            - name: config-volume
              configMap:
                name: scheduler-config

    1 2 3 4
    이 절차에서는 kube-system 네임스페이스를 사용하지만 선택한 네임스페이스를 사용할 수 있습니다.
    5
    사용자 지정 스케줄러의 명령에는 다른 인수가 필요할 수 있습니다.
    6
    사용자 정의 스케줄러에 대해 생성한 컨테이너 이미지를 지정합니다.
  4. 클러스터에 배포 리소스를 생성합니다.

    $ oc create -f custom-scheduler.yaml

검증

  • 스케줄러 Pod가 실행 중인지 확인합니다.

    $ oc get pods -n kube-system

    사용자 정의 스케줄러 Pod는 Running 으로 나열됩니다.

    NAME                                                       READY   STATUS    RESTARTS   AGE
    custom-scheduler-6cd7c4b8bc-854zb                          1/1     Running   0          2m

3.10.2. 사용자 정의 스케줄러를 사용하여 Pod 배포

사용자 정의 스케줄러가 클러스터에 배포된 후 기본 스케줄러 대신 해당 스케줄러를 사용하도록 Pod를 구성할 수 있습니다.

참고

각 스케줄러에는 클러스터에 있는 별도의 리소스 보기가 있습니다. 따라서 각 스케줄러는 자체 노드 집합에서 작동해야 합니다.

두 개 이상의 스케줄러가 동일한 노드에서 작동하는 경우 서로 개입하여 사용 가능한 리소스보다 동일한 노드에 더 많은 포드를 예약할 수 있습니다. 이 경우 리소스가 부족하여 Pod가 거부될 수 있습니다.

사전 요구 사항

  • cluster-admin 역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.
  • 사용자 지정 스케줄러가 클러스터에 배포되었습니다.

절차

  1. 클러스터에서 역할 기반 액세스 제어(RBAC)를 사용하는 경우 사용자 정의 스케줄러 이름을 system:kube-scheduler 클러스터 역할에 추가합니다.

    1. system:kube-scheduler 클러스터 역할을 편집합니다.

      $ oc edit clusterrole system:kube-scheduler
    2. 사용자 정의 스케줄러의 이름을 leasesendpoints 리소스에 대한 resourceNames 목록에 추가합니다.

      apiVersion: rbac.authorization.k8s.io/v1
      kind: ClusterRole
      metadata:
        annotations:
          rbac.authorization.kubernetes.io/autoupdate: "true"
        creationTimestamp: "2021-07-07T10:19:14Z"
        labels:
          kubernetes.io/bootstrapping: rbac-defaults
        name: system:kube-scheduler
        resourceVersion: "125"
        uid: 53896c70-b332-420a-b2a4-f72c822313f2
      rules:
      ...
      - apiGroups:
        - coordination.k8s.io
        resources:
        - leases
        verbs:
        - create
      - apiGroups:
        - coordination.k8s.io
        resourceNames:
        - kube-scheduler
        - custom-scheduler 1
        resources:
        - leases
        verbs:
        - get
        - update
      - apiGroups:
        - ""
        resources:
        - endpoints
        verbs:
        - create
      - apiGroups:
        - ""
        resourceNames:
        - kube-scheduler
        - custom-scheduler 2
        resources:
        - endpoints
        verbs:
        - get
        - update
      ...
      1 2
      이 예에서는 사용자 정의 스케줄러 이름으로 custom-scheduler 를 사용합니다.
  2. Pod 구성을 생성하고 scheduler Name 매개변수에서 사용자 정의 스케줄러 의 이름을 지정합니다.

    custom-scheduler-example.yaml 파일의 예

    apiVersion: v1
    kind: Pod
    metadata:
      name: custom-scheduler-example
      labels:
        name: custom-scheduler-example
    spec:
      schedulerName: custom-scheduler 1
      containers:
      - name: pod-with-second-annotation-container
        image: docker.io/ocpqe/hello-pod

    1
    사용할 사용자 정의 스케줄러의 이름입니다. 이 예에서는 custom-scheduler 입니다. 스케줄러 이름을 제공하지 않으면 기본 스케줄러를 사용하여 Pod가 자동으로 예약됩니다.
  3. Pod를 생성합니다.

    $ oc create -f custom-scheduler-example.yaml

검증

  1. 다음 명령을 입력하여 Pod가 생성되었는지 확인합니다.

    $ oc get pod custom-scheduler-example

    custom-scheduler-example Pod는 출력에 나열됩니다.

    NAME                       READY     STATUS    RESTARTS   AGE
    custom-scheduler-example   1/1       Running   0          4m
  2. 다음 명령을 입력하여 사용자 정의 스케줄러에서 Pod를 예약했는지 확인합니다.

    $ oc describe pod custom-scheduler-example

    스케줄러, custom-scheduler 는 다음 잘린 출력에 표시된 대로 나열됩니다.

    Events:
      Type    Reason          Age        From                                               Message
      ----    ------          ----       ----                                               -------
      Normal  Scheduled       <unknown>  custom-scheduler                                   Successfully assigned default/custom-scheduler-example to <node_name>

3.10.3. 추가 리소스

Red Hat logoGithubRedditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

© 2024 Red Hat, Inc.