3.2. Pod 배치를 제어하도록 기본 스케줄러 구성
기본 OpenShift Container Platform Pod 스케줄러는 클러스터 내의 노드에 대한 새 Pod 배치를 결정합니다. Pod에서 데이터를 읽고 구성된 정책에 따라 적합한 노드를 찾으려고 합니다. 이 스케줄러는 완전히 독립적이며 독립형/플러그형 솔루션으로 존재합니다. Pod를 수정하지 않고 Pod를 특정 노드에 연결하는 Pod 바인딩만 생성합니다.
스케줄러 정책 구성 기능은 더 이상 사용되지 않으며 향후 릴리스에서 제거될 예정입니다. 대안에 대한 자세한 내용은 스케줄러 프로필을 사용하여 Pod 예약을 참조하십시오.
서술자 및 우선순위를 선택하면 스케줄러에 대한 정책이 정의됩니다. 서술자 및 우선순위 목록은 스케줄러 정책 수정을 참조하십시오.
기본 스케줄러 오브젝트 샘플
apiVersion: config.openshift.io/v1 kind: Scheduler metadata: annotations: release.openshift.io/create-only: "true" creationTimestamp: 2019-05-20T15:39:01Z generation: 1 name: cluster resourceVersion: "1491" selfLink: /apis/config.openshift.io/v1/schedulers/cluster uid: 6435dd99-7b15-11e9-bd48-0aec821b8e34 spec: policy: 1 name: scheduler-policy defaultNodeSelector: type=user-node,region=east 2
3.2.1. 기본 예약 이해
기존 일반 스케줄러는 3단계 작업에서 Pod를 호스팅할 노드를 선택하는 기본 플랫폼 제공 스케줄러 엔진에 해당합니다.
- 노드 필터링
- 사용 가능한 노드를 지정된 제약 조건 또는 요구 사항에 따라 필터링합니다. 이 작업은 서술자라는 필터링 함수 목록을 통해 각 노드를 실행하는 방식으로 수행됩니다.
- 필터링된 노드 목록 우선순위 지정
- 이 작업은 0~10 사이의 점수를 지정하는 일련의 priority_ 함수를 통해 수행되는데, 0은 Pod를 호스팅하는 데 적합하지 않음을 나타내고 10은 적합함을 나타냅니다. 스케줄러 구성은 각 우선순위 함수에 간단한 가중치(양의 숫자 값)를 사용할 수도 있습니다. 각 우선순위 함수에서 제공하는 노드 점수에 가중치(대부분의 우선순위에 대한 기본 가중치는 1임)를 곱한 다음 모든 우선순위에서 제공하는 각 노드의 점수를 더하여 결합합니다. 관리자는 이러한 가중치 특성을 사용하여 일부 우선순위에 높은 중요성을 부여할 수 있습니다.
- 최적의 노드 선택
- 노드는 해당 점수에 따라 정렬되며 점수가 가장 높은 노드가 Pod를 호스팅하도록 선택됩니다. 여러 노드의 점수가 동일한 경우 해당 노드 중 하나가 무작위로 선택됩니다.
3.2.1.1. 스케줄러 정책 이해
서술자 및 우선순위를 선택하면 스케줄러에 대한 정책이 정의됩니다.
스케줄러 구성 파일은 스케줄러에서 고려할 서술자 및 우선순위를 지정하는 policy.cfg
라는 JSON 파일입니다.
스케줄러 정책 파일이 없는 경우 기본 스케줄러 동작이 사용됩니다.
스케줄러 구성 파일에 정의된 서술자 및 우선순위는 기본 스케줄러 정책을 완전히 덮어씁니다. 기본 서술자 및 우선순위 중 하나라도 필요한 경우 정책 구성에서 함수를 명시적으로 지정해야 합니다.
스케줄러 구성 맵 샘플
apiVersion: v1
data:
policy.cfg: |
{
"kind" : "Policy",
"apiVersion" : "v1",
"predicates" : [
{"name" : "MaxGCEPDVolumeCount"},
{"name" : "GeneralPredicates"}, 1
{"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}
]
}
kind: ConfigMap
metadata:
creationTimestamp: "2019-09-17T08:42:33Z"
name: scheduler-policy
namespace: openshift-config
resourceVersion: "59500"
selfLink: /api/v1/namespaces/openshift-config/configmaps/scheduler-policy
uid: 17ee8865-d927-11e9-b213-02d1e1709840`
- 1
GeneralPredicates
서술자는PodFitsResources
,HostName
,PodFitsHostPorts
,MatchNodeSelector
서술자를 나타냅니다. 동일한 서술자를 여러 번 구성할 수 없기 때문에GeneralPredicates
서술어를 표시된 4개의 서술자와 함께 사용할 수 없습니다.
3.2.2. 스케줄러 정책 파일 생성
원하는 서술자 및 우선순위로 JSON 파일을 생성하여 기본 예약 동작을 변경할 수 있습니다. 그런 다음 JSON 파일에서 구성 맵을 생성하고 이 구성 맵을 사용하도록 cluster
스케줄러 오브젝트를 가리킵니다.
프로세스
스케줄러 일정을 구성하려면 다음을 수행합니다.
원하는 서술자 및 우선순위를 사용하여
policy.cfg
라는 JSON 파일을 생성합니다.스케줄러 JSON 파일 샘플
{ "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} ] }
스케줄러 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
작은 정보다음 YAML을 적용하여 구성 맵을 만들 수 있습니다.
kind: ConfigMap apiVersion: v1 metadata: name: scheduler-policy namespace: openshift-config data: 1 policy.cfg: | { "kind": "Policy", "apiVersion": "v1", "predicates": [ { "name": "RequireRegion", "argument": { "labelPreference": {"label": "region"}, {"presence": true} } } ], "priorities": [ { "name":"ZonePreferred", "weight" : 1, "argument": { "labelPreference": {"label": "zone"}, {"presence": true} } } ] }
- 1
- 서술자 및 우선순위가 있는 JSON 형식의
policy.cfg
파일입니다.
Scheduler Operator 사용자 정의 리소스를 편집하여 구성 맵을 추가합니다.
$ oc patch Scheduler cluster --type='merge' -p '{"spec":{"policy":{"name":"<configmap-name>"}}}' --type=merge 1
- 1
- 구성 맵 이름을 지정합니다.
예를 들면 다음과 같습니다.
$ oc patch Scheduler cluster --type='merge' -p '{"spec":{"policy":{"name":"scheduler-policy"}}}' --type=merge
작은 정보다음 YAML을 적용하여 구성 맵을 추가할 수도 있습니다.
apiVersion: config.openshift.io/v1 kind: Scheduler metadata: name: cluster spec: mastersSchedulable: false policy: name: scheduler-policy 1
- 1
- 스케줄러 정책 구성 맵의 이름을 추가합니다.
Scheduler
구성 리소스를 변경한 후openshift-kube-apiserver
Pod가 재배포될 때까지 기다립니다. 이 작업은 몇 분 정도 걸릴 수 있습니다. Pod가 재배포될 때까지 새 스케줄러가 적용되지 않습니다.openshift-kube-scheduler
네임스페이스에서 스케줄러 Pod의 로그를 확인하여 스케줄러 정책이 구성되었는지 확인합니다. 다음 명령은 스케줄러에서 등록하는 서술자 및 우선순위가 있는지 확인합니다.$ oc logs <scheduler-pod> | grep predicates
예를 들면 다음과 같습니다.
$ oc logs openshift-kube-scheduler-ip-10-0-141-29.ec2.internal | grep predicates
출력 예
Creating scheduler with fit predicates 'map[MaxGCEPDVolumeCount:{} MaxAzureDiskVolumeCount:{} CheckNodeUnschedulable:{} NoDiskConflict:{} NoVolumeZoneConflict:{} GeneralPredicates:{} MaxCSIVolumeCountPred:{} CheckVolumeBinding:{} MaxEBSVolumeCount:{} MatchInterPodAffinity:{} PodToleratesNodeTaints:{}]' and priority functions 'map[InterPodAffinityPriority:{} LeastRequestedPriority:{} ServiceSpreadingPriority:{} ImageLocalityPriority:{} SelectorSpreadPriority:{} EqualPriority:{} BalancedResourceAllocation:{} NodePreferAvoidPodsPriority:{} NodeAffinityPriority:{} TaintTolerationPriority:{}]'
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
스케줄러에서 업데이트된 정책을 사용하여 Pod를 재시작하는 데 몇 분 정도 걸릴 수 있습니다.
사용 중인 정책 및 서술자를 변경합니다.
스케줄러 정책 구성 맵을 제거합니다.
$ oc delete configmap -n openshift-config <name>
예를 들면 다음과 같습니다.
$ oc delete configmap -n openshift-config scheduler-policy
필요한 경우
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} ] }
스케줄러 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.1. 스케줄러 JSON 파일을 기반으로 하는 샘플 구성 맵
kind: ConfigMap apiVersion: v1 metadata: name: scheduler-policy namespace: openshift-config data: policy.cfg: | { "kind": "Policy", "apiVersion": "v1", "predicates": [ { "name": "RequireRegion", "argument": { "labelPreference": {"label": "region"}, {"presence": true} } } ], "priorities": [ { "name":"ZonePreferred", "weight" : 1, "argument": { "labelPreference": {"label": "zone"}, {"presence": true} } } ] }
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"}
3.2.3.2. 스케줄러 우선순위 이해
우선순위는 기본 설정에 따라 노드의 순위를 정하는 규칙입니다.
스케줄러를 구성하기 위해 사용자 정의 우선순위 집합을 지정할 수 있습니다. OpenShift Container Platform에는 기본적으로 제공되는 몇 가지 우선순위가 있습니다. 특정 매개변수를 제공하여 기타 우선순위를 사용자 정의할 수 있습니다. 여러 우선순위를 결합하고 각각 서로 다른 가중치를 부여하여 우선순위 지정에 영향을 미칠 수 있습니다.
3.2.3.2.1. 정적 우선순위
정적 우선순위에는 가중치를 제외하고 사용자의 구성 매개변수가 사용되지 않습니다. 가중치를 지정해야 하며 0 또는 음수를 사용할 수 없습니다.
해당 값은 openshift-config
프로젝트의 스케줄러 정책 구성 맵에 지정됩니다.
3.2.3.2.1.1. 기본 우선순위
기본 스케줄러 정책에는 다음과 같은 우선순위가 포함됩니다. 가중치가 10000
인 NodePreferAvoidPodsPriority
를 제외하고 각 우선순위 함수의 가중치는 1
입니다.
NodeAffinityPriority
우선순위는 노드 유사성 예약 설정에 따라 노드에 우선순위를 지정합니다.
{"name" : "NodeAffinityPriority", "weight" : 1}
TaintTolerationPriority
우선순위는 Pod에 대해 허용 불가 테인트 수가 적은 노드에 우선순위를 지정합니다. 허용 불가 테인트에는 주요 PreferNoSchedule
이 있습니다.
{"name" : "TaintTolerationPriority", "weight" : 1}
ImageLocalityPriority
우선순위는 요청된 Pod 컨테이너의 이미지가 이미 있는 노드에 우선순위를 지정합니다.
{"name" : "ImageLocalityPriority", "weight" : 1}
SelectorSpreadPriority
우선순위는 서비스, RC(복제 컨트롤러), RS(복제 세트), Pod와 일치하는 상태 저장 세트를 찾은 다음 해당 선택기와 일치하는 기존 Pod를 찾습니다. 스케줄러에서는 일치하는 기존 Pod가 적은 노드를 선호합니다. 그런 다음 Pod를 예약할 때 해당 선택기와 일치하는 Pod 수가 가장 적은 노드에 Pod를 예약합니다.
{"name" : "SelectorSpreadPriority", "weight" : 1}
InterPodAffinityPriority
우선순위는 weightedPodAffinityTerm
의 요소를 반복하고 해당 PodAffinityTerm이 해당 노드에서 충족되는 경우 합계에 가중치를 더하여 합계를 계산합니다. 합계가 가장 많은 노드를 가장 우선적으로 고려합니다.
{"name" : "InterPodAffinityPriority", "weight" : 1}
LeastRequestedPriority
우선순위는 요청된 리소스가 적은 노드를 우선 고려합니다. 노드에 예약된 Pod에서 요청한 메모리 및 CPU의 백분율을 계산하고 사용 가능한/남은 용량이 가장 많은 노드에 우선순위를 부여합니다.
{"name" : "LeastRequestedPriority", "weight" : 1}
BalancedResourceAllocation
우선순위는 리소스 사용률이 분산된 노드에 우선순위를 부여합니다. 사용한 CPU와 메모리 간의 차이를 용량의 일부로 계산하고 두 메트릭이 서로 얼마나 비슷한지에 따라 노드에 우선순위를 부여합니다. 이 우선순위는 항상 LeastRequestedPriority
와 함께 사용해야 합니다.
{"name" : "BalancedResourceAllocation", "weight" : 1}
NodePreferAvoidPodsPriority
우선순위는 복제 컨트롤러 이외의 컨트롤러에서 보유하는 Pod를 무시합니다.
{"name" : "NodePreferAvoidPodsPriority", "weight" : 10000}
3.2.3.2.1.2. 기타 정적 우선순위
OpenShift Container Platform에서는 다음과 같은 우선순위도 지원합니다.
EqualPriority
우선순위는 우선순위 구성이 제공되지 않는 경우 모든 노드에 동일한 가중치인 1
을 부여합니다. 이 우선순위는 테스트 환경에만 사용하는 것이 좋습니다.
{"name" : "EqualPriority", "weight" : 1}
MostRequestedPriority
우선순위는 요청된 리소스가 가장 많은 노드에 우선순위를 부여합니다. 노드에 예약된 Pod에서 요청한 메모리와 CPU의 백분율을 계산하고 평균 용량 대비 요청 비율의 최댓값에 따라 우선순위를 부여합니다.
{"name" : "MostRequestedPriority", "weight" : 1}
ServiceSpreadingPriority
우선순위는 동일한 서비스에 속하는 Pod 수를 최소화하여 동일한 머신에 Pod를 분배합니다.
{"name" : "ServiceSpreadingPriority", "weight" : 1}
3.2.3.2.2. 구성 가능한 우선순위
openshift-config
네임스페이스의 스케줄러 정책 구성 맵에 이러한 우선순위를 구성하여 우선순위가 작동하는 방식에 영향을 주는 라벨을 추가할 수 있습니다.
우선순위 함수의 유형은 사용하는 인수로 확인됩니다. 이러한 우선순위는 구성 가능하므로 사용자 정의 이름이 다른 경우 유형은 동일하지만 구성 매개변수는 다른 우선순위 여러 개를 결합할 수 있습니다.
이러한 우선순위 사용법에 대한 자세한 내용은 스케줄러 정책 수정을 참조하십시오.
ServiceAntiAffinity
우선순위는 라벨을 사용하며 해당 라벨 값에 따라 동일한 서비스에 속하는 Pod를 노드 그룹 전체에 적절하게 분배합니다. 지정된 라벨에 동일한 값이 있는 모든 노드에 동일한 점수를 부여합니다. Pod 밀도가 가장 낮은 그룹 내의 노드에 더 높은 점수를 부여합니다.
{ "kind": "Policy", "apiVersion": "v1", "priorities":[ { "name":"<name>", 1 "weight" : 1 2 "argument":{ "serviceAntiAffinity":{ "label": "<label>" 3 } } } ] }
예를 들면 다음과 같습니다.
{ "kind": "Policy", "apiVersion": "v1", "priorities": [ { "name":"RackSpread", "weight" : 1, "argument": { "serviceAntiAffinity": { "label": "rack" } } } ] }
일부 상황에서는 사용자 정의 라벨에 따라 ServiceAntiAffinity
매개변수를 사용해도 Pod가 예상대로 분배되지 않습니다. 이 Red Hat 솔루션을 참조하십시오.
labelPreference
매개변수는 지정된 라벨에 따라 우선순위를 지정합니다. 라벨이 노드에 있으면 해당 노드에 우선순위가 부여됩니다. 라벨이 지정되지 않은 경우 라벨이 없는 노드에 우선순위가 부여됩니다. labelPreference
매개변수를 사용하여 여러 개의 우선순위를 설정한 경우 모든 우선순위의 가중치가 같아야 합니다.
{ "kind": "Policy", "apiVersion": "v1", "priorities":[ { "name":"<name>", 1 "weight" : 1 2 "argument":{ "labelPreference":{ "label": "<label>", 3 "presence": true 4 } } } ] }
3.2.4. 정책 구성 샘플
아래 구성에서는 스케줄러 정책 파일을 사용하여 지정한 것처럼 기본 스케줄러 구성을 지정합니다.
{ "kind": "Policy", "apiVersion": "v1", "predicates": [ { "name": "RegionZoneAffinity", 1 "argument": { "serviceAffinity": { 2 "labels": ["region, zone"] 3 } } } ], "priorities": [ { "name":"RackSpread", 4 "weight" : 1, "argument": { "serviceAntiAffinity": { 5 "label": "rack" 6 } } } ] }
아래의 모든 샘플 구성에서 서술자 및 우선순위 함수 목록은 지정된 사용 사례와 관련된 항목만 포함하도록 잘립니다. 실제로 완료된/유의미한 스케줄러 정책에는 위에 나열된 기본 서술자 및 우선순위 전부는 아니더라도 대부분이 포함되어야 합니다.
다음 예제에서는 세 가지 토폴로지 수준, 즉 region(유사성)
{ "kind": "Policy", "apiVersion": "v1", "predicates": [ { "name": "RegionZoneAffinity", "argument": { "serviceAffinity": { "labels": ["region, zone"] } } } ], "priorities": [ { "name":"RackSpread", "weight" : 1, "argument": { "serviceAntiAffinity": { "label": "rack" } } } ] }
다음 예제에서는 세 가지 토폴로지 수준, 즉 city
(유사성) building
(유사성 방지) room
(유사성 방지)을 정의합니다.
{ "kind": "Policy", "apiVersion": "v1", "predicates": [ { "name": "CityAffinity", "argument": { "serviceAffinity": { "label": "city" } } } ], "priorities": [ { "name":"BuildingSpread", "weight" : 1, "argument": { "serviceAntiAffinity": { "label": "building" } } }, { "name":"RoomSpread", "weight" : 1, "argument": { "serviceAntiAffinity": { "label": "room" } } } ] }
다음 예제에서는 'region' 라벨이 정의된 노드만 사용하고 'zone' 라벨이 정의된 노드를 선호하는 정책을 정의합니다.
{ "kind": "Policy", "apiVersion": "v1", "predicates": [ { "name": "RequireRegion", "argument": { "labelPreference": { "labels": ["region"], "presence": true } } } ], "priorities": [ { "name":"ZonePreferred", "weight" : 1, "argument": { "labelPreference": { "label": "zone", "presence": true } } } ] }
다음 예제에서는 정적 및 구성 가능 서술자와 우선순위를 둘 다 결합합니다.
{ "kind": "Policy", "apiVersion": "v1", "predicates": [ { "name": "RegionAffinity", "argument": { "serviceAffinity": { "labels": ["region"] } } }, { "name": "RequireRegion", "argument": { "labelsPresence": { "labels": ["region"], "presence": true } } }, { "name": "BuildingNodesAvoid", "argument": { "labelsPresence": { "label": "building", "presence": false } } }, {"name" : "PodFitsPorts"}, {"name" : "MatchNodeSelector"} ], "priorities": [ { "name": "ZoneSpread", "weight" : 2, "argument": { "serviceAntiAffinity":{ "label": "zone" } } }, { "name":"ZonePreferred", "weight" : 1, "argument": { "labelPreference":{ "label": "zone", "presence": true } } }, {"name" : "ServiceSpreadingPriority", "weight" : 1} ] }