3.2.3. 스케줄러 정책 수정

openshift-config 프로젝트에서 스케줄러 정책 구성 맵을 생성하거나 편집하여 예약 동작을 변경합니다. 구성 맵에 서술자 및 우선순위를 추가하고 제거하여 스케줄러 정책을 생성합니다.

프로세스

현재 사용자 정의 예약을 수정하려면 다음 방법 중 하나를 사용합니다.

  • 스케줄러 정책 구성 맵을 편집합니다.

    $ oc edit configmap <configmap-name>  -n openshift-config

    예를 들면 다음과 같습니다.

    $ oc edit configmap scheduler-policy -n openshift-config

    출력 예

    apiVersion: v1
    data:
      policy.cfg: |
        {
            "kind" : "Policy",
            "apiVersion" : "v1",
            "predicates" : [ 1
                    {"name" : "MaxGCEPDVolumeCount"},
                    {"name" : "GeneralPredicates"},
                    {"name" : "MaxAzureDiskVolumeCount"},
                    {"name" : "MaxCSIVolumeCountPred"},
                    {"name" : "CheckVolumeBinding"},
                    {"name" : "MaxEBSVolumeCount"},
                    {"name" : "MatchInterPodAffinity"},
                    {"name" : "CheckNodeUnschedulable"},
                    {"name" : "NoDiskConflict"},
                    {"name" : "NoVolumeZoneConflict"},
                    {"name" : "PodToleratesNodeTaints"}
                    ],
            "priorities" : [ 2
                    {"name" : "LeastRequestedPriority", "weight" : 1},
                    {"name" : "BalancedResourceAllocation", "weight" : 1},
                    {"name" : "ServiceSpreadingPriority", "weight" : 1},
                    {"name" : "NodePreferAvoidPodsPriority", "weight" : 1},
                    {"name" : "NodeAffinityPriority", "weight" : 1},
                    {"name" : "TaintTolerationPriority", "weight" : 1},
                    {"name" : "ImageLocalityPriority", "weight" : 1},
                    {"name" : "SelectorSpreadPriority", "weight" : 1},
                    {"name" : "InterPodAffinityPriority", "weight" : 1},
                    {"name" : "EqualPriority", "weight" : 1}
                    ]
        }
    kind: ConfigMap
    metadata:
      creationTimestamp: "2019-09-17T17:44:19Z"
      name: scheduler-policy
      namespace: openshift-config
      resourceVersion: "15370"
      selfLink: /api/v1/namespaces/openshift-config/configmaps/scheduler-policy

    1
    필요한 경우 서술자를 추가하거나 제거합니다.
    2
    필요한 경우 서술자를 추가, 제거 또는 변경합니다.

    스케줄러에서 업데이트된 정책을 사용하여 Pod를 재시작하는 데 몇 분 정도 걸릴 수 있습니다.

  • 사용 중인 정책 및 서술자를 변경합니다.

    1. 스케줄러 정책 구성 맵을 제거합니다.

      $ oc delete configmap -n openshift-config <name>

      예를 들면 다음과 같습니다.

      $ oc delete configmap -n openshift-config  scheduler-policy
    2. 필요한 경우 policy.cfg 파일을 편집하여 정책과 서술자를 추가 및 제거합니다.

      예를 들면 다음과 같습니다.

      $ vi policy.cfg

      출력 예

      apiVersion: v1
      data:
        policy.cfg: |
          {
          "kind" : "Policy",
          "apiVersion" : "v1",
          "predicates" : [
                  {"name" : "MaxGCEPDVolumeCount"},
                  {"name" : "GeneralPredicates"},
                  {"name" : "MaxAzureDiskVolumeCount"},
                  {"name" : "MaxCSIVolumeCountPred"},
                  {"name" : "CheckVolumeBinding"},
                  {"name" : "MaxEBSVolumeCount"},
                  {"name" : "MatchInterPodAffinity"},
                  {"name" : "CheckNodeUnschedulable"},
                  {"name" : "NoDiskConflict"},
                  {"name" : "NoVolumeZoneConflict"},
                  {"name" : "PodToleratesNodeTaints"}
                  ],
          "priorities" : [
                  {"name" : "LeastRequestedPriority", "weight" : 1},
                  {"name" : "BalancedResourceAllocation", "weight" : 1},
                  {"name" : "ServiceSpreadingPriority", "weight" : 1},
                  {"name" : "NodePreferAvoidPodsPriority", "weight" : 1},
                  {"name" : "NodeAffinityPriority", "weight" : 1},
                  {"name" : "TaintTolerationPriority", "weight" : 1},
                  {"name" : "ImageLocalityPriority", "weight" : 1},
                  {"name" : "SelectorSpreadPriority", "weight" : 1},
                  {"name" : "InterPodAffinityPriority", "weight" : 1},
                  {"name" : "EqualPriority", "weight" : 1}
                  ]
          }

    3. 스케줄러 JSON 파일을 기반으로 스케줄러 정책 구성 맵을 다시 생성합니다.

      $ oc create configmap -n openshift-config --from-file=policy.cfg <configmap-name> 1
      1
      구성 맵의 이름을 입력합니다.

      예를 들면 다음과 같습니다.

      $ oc create configmap -n openshift-config --from-file=policy.cfg scheduler-policy

      출력 예

      configmap/scheduler-policy created

3.2.3.1. 스케줄러 서술자 이해

서술자는 정규화되지 않은 노드를 필터링하는 규칙입니다.

OpenShift Container Platform에는 기본적으로 제공되는 몇 가지 서술자가 있습니다. 이러한 서술자 중 일부는 특정 매개변수를 제공하여 사용자 정의할 수 있습니다. 여러 개의 서술자를 결합하여 노드 필터링을 추가로 제공할 수도 있습니다.

3.2.3.1.1. 정적 서술자

이러한 서술자에는 구성 매개변수 또는 사용자 입력이 사용되지 않습니다. 대신 정확한 이름을 사용하여 스케줄러 구성에 지정됩니다.

3.2.3.1.1.1. 기본 서술자

기본 스케줄러 정책에는 다음과 같은 서술자가 포함됩니다.

NoVolumeZoneConflict 서술자는 Pod에서 요청하는 볼륨을 해당 영역에서 사용할 수 있는지 확인합니다.

{"name" : "NoVolumeZoneConflict"}

MaxEBSVolumeCount 서술자는 AWS 인스턴스에 연결할 수 있는 최대 볼륨 수를 확인합니다.

{"name" : "MaxEBSVolumeCount"}

MaxAzureDiskVolumeCount 서술자는 최대 Azure Disk 볼륨 수를 확인합니다.

{"name" : "MaxAzureDiskVolumeCount"}

PodToleratesNodeTaints 서술자는 Pod에서 노드 테인트를 허용할 수 있는지 확인합니다.

{"name" : "PodToleratesNodeTaints"}

CheckNodeUnschedulable 서술자는 Unschedulable 사양을 사용하여 노드에서 Pod를 예약할 수 있는지 확인합니다.

{"name" : "CheckNodeUnschedulable"}

CheckVolumeBinding 서술자는 바인딩된 PVC 및 바인딩되지 않은 PVC 모두에 대해 요청하는 볼륨에 따라 Pod를 맞출 수 있는지 평가합니다.

  • 바인딩된 PVC의 경우 서술자는 해당 PV의 노드 유사성이 지정된 노드로 충족되는지 확인합니다.
  • 바인딩되지 않은 PVC의 경우 서술자는 PVC 요구 사항을 충족할 수 있는 사용 가능한 PV 및 지정된 노드로 PV 노드 유사성을 충족하는 사용 가능한 PV가 있는지 검색합니다.

서술자는 바인딩된 모든 PVC에 노드와 호환되는 PV가 있고 바인딩되지 않은 모든 PVC를 사용 가능하고 노드와 호환되는 PV와 연결할 수 있는 경우 True를 반환합니다.

{"name" : "CheckVolumeBinding"}

NoDiskConflict 서술자는 Pod에서 요청한 볼륨을 사용할 수 있는지 확인합니다.

{"name" : "NoDiskConflict"}

MaxGCEPDVolumeCount 서술자는 최대 GCE(Google Compute Engine) PD(영구 디스크) 수를 확인합니다.

{"name" : "MaxGCEPDVolumeCount"}

MaxCSIVolumeCountPred 서술자는 노드에 연결해야 하는 CSI(Container Storage Interface) 볼륨 수와 해당 수가 구성된 제한을 초과하는지 여부를 결정합니다.

{"name" : "MaxCSIVolumeCountPred"}

MatchInterPodAffinity 서술자는 Pod 유사성/유사성 방지 규칙에서 해당 Pod를 허용하는지 확인합니다.

{"name" : "MatchInterPodAffinity"}
3.2.3.1.1.2. 기타 정적 서술자

OpenShift Container Platform에서는 다음과 같은 서술자도 지원합니다.

참고

조건별 노드 테인트 기능이 활성화된 경우 CheckNode-* 서술자를 사용할 수 없습니다. 조건별 노드 테인트 기능은 기본적으로 활성화되어 있습니다.

CheckNodeCondition 서술자는 디스크 없음, 네트워크 사용 불가 또는 준비되지 않음 상태를 보고하는 노드에 Pod를 예약할 수 있는지 확인합니다.

{"name" : "CheckNodeCondition"}

CheckNodeLabelPresence 서술자는 해당 값과 관계없이 지정된 라벨이 모두 노드에 존재하는지 확인합니다.

{"name" : "CheckNodeLabelPresence"}

checkServiceAffinity 서술자는 노드에 예약된 Pod에서 ServiceAffinity 라벨이 동종인지 확인합니다.

{"name" : "checkServiceAffinity"}

PodToleratesNodeNoExecuteTaints 서술자는 Pod 허용 오차에서 노드 NoExecute 테인트를 허용할 수 있는지 확인합니다.

{"name" : "PodToleratesNodeNoExecuteTaints"}
3.2.3.1.2. 일반 서술자

다음 일반 서술자는 중요하지 않은 서술자 및 필수 서술자의 전달 여부를 확인합니다. 중요하지 않은 서술자는 중요하지 않은 Pod에서만 전달해야 하는 서술자이고 필수 서술자는 모든 Pod에서 전달해야 하는 서술자입니다.

기본 스케줄러 정책에는 일반 서술자가 포함됩니다.

심각하지 않은 일반 서술자

PodFitsResources 서술자는 리소스 가용성(CPU, 메모리, GPU 등)에 따라 적합성을 결정합니다. 노드는 해당 리소스 용량을 선언할 수 있으며 Pod는 필요한 리소스를 지정할 수 있습니다. 적합성은 사용된 리소스가 아닌 요청된 리소스를 기반으로 합니다.

{"name" : "PodFitsResources"}
필수 일반 서술자

PodFitsHostPorts 서술자는 노드에 요청된 Pod 포트에 사용할 수 있는 포트가 있는지 확인합니다(포트 충돌 없음).

{"name" : "PodFitsHostPorts"}

HostName 서술자는 Host 매개변수의 존재 여부 및 호스트 이름과 일치하는 문자열에 따라 적합성을 결정합니다.

{"name" : "HostName"}

MatchNodeSelector 서술자는 Pod에 정의된 노드 선택기(nodeSelector) 쿼리에 따라 적합성을 결정합니다.

{"name" : "MatchNodeSelector"}