잡 스펙의 `spread` 블록
잡 스펙의 spread 블록
spread 블록은 할당을 분산해야 하는 노드 속성을 지정해 운영자가 애플리케이션의 실패 허용도를 높일 수 있게 해요. 데이터센터, 가용 영역, 물리 데이터센터의 랙 같은 속성에 걸쳐 할당을 분산할 수 있어요.
출처: 문서
본문
| 배치 | job -> **spread** |
|---|---|
job -> group -> **spread** |
기본적으로 spread가 생략되면 스케줄러는 같은 잡의 할당을 서로 다른 노드에 배치하려고 시도해요(그리고 잡 사이에는 binpack). spread를 사용하면 스케줄러는 주어진 대상의 사용 가능한 값들 사이에 할당을 균등하게 배치하려고 시도해요.
job "docs" {
# Spread allocations over all datacenter
spread {
attribute = "${node.datacenter}"
}
group "example" {
# Spread allocations over each rack based on desired percentage
spread {
attribute = "${meta.rack}"
target "r1" {
percent = 60
}
target "r2" {
percent = 40
}
}
}
}
노드는 spread 블록에 정의된 원하는 대상 백분율에 얼마나 가깝게 일치하는지에 따라 점수가 매겨져요. Spread 점수는 bin packing 같은 다른 점수 요소와 결합돼요.
잡 또는 태스크 그룹은 상대적 선호도를 표현하는 가중치와 함께 둘 이상의 spread 기준을 가질 수 있어요.
Spread 기준은 Nomad 스케줄러에 의해 소프트 선호도로 취급돼요. 주어진 spread 기준과 일치하는 노드가 없어도 배치는 여전히 성공해요. 모든 배치에 대해 모든 노드에 점수를 매기지 않기 위해 할당이 완벽하게 분산되지 않을 수 있어요. Spread는 비슷한 수의 노드를 가진 속성에서 가장 잘 동작해요: 동일하게 구성된 랙 또는 유사하게 구성된 데이터센터.
Spread는 속성 또는 클라이언트 메타데이터에 표현할 수 있어요. 또한 궁극적인 유연성을 위해 job 및 group 레벨에서 지정할 수 있어요. 잡 레벨 spread 기준은 잡의 모든 태스크 그룹에 상속돼요.
spread 블록 업데이트는 비파괴적이에요. 비파괴적 업데이트만 포함한 잡 스펙 업데이트는 기존 할당을 마이그레이션하거나 교체하지 않아요.
매개변수 (Parameters)
-
attribute(string: "")- 사용할 속성의 이름 또는 참조. Nomad 보간 값 중 하나일 수 있어요. -
target([target]: <required>)- spread 블록의attribute각 값에 대한 대상 백분율을 하나 이상 지정. 생략하면 Nomad는 속성의 모든 값에 걸쳐 할당을 균등하게 분산해요. -
weight(integer:0)- spread 블록의 가중치. 가중치는 점수 계산 중에 사용되며 0에서 100 사이의 정수여야 해요. spread 또는 affinity 블록이 여러 개 있을 때 상대적 선호도를 표현하기 위해 가중치를 사용할 수 있어요.
Target 매개변수 (Target parameters)
spread 스케줄링 알고리즘과의 비교 (Comparison to spread scheduling algorithm)
spread 블록은 스케줄러 알고리즘을 "binpack" 대신 "spread"로 설정하는 것과 같은 개념이 아니에요. 스케줄러 알고리즘을 설정하는 것은 클러스터(또는 노드 풀)의 모든 잡에 영향을 주며, 스케줄러가 다른 잡의 워크로드를 같은 노드 집합에 배치하는 경향을 조정해요. spread 블록은 주어진 잡에 대한 할당을 스케줄러가 어떻게 배치하는지에 영향을 줘요.
스케줄링 성능 (Scheduling performance)
service와 batch 잡의 각 할당에 대해 Nomad 스케줄러는 작은 수의 실현 가능한 노드를 찾을 때까지 노드를 순회해요. 그런 다음 최적 배치를 찾기 위해 그 실현 가능한 노드들을 점수 매겨요. 점수 매기는 정확한 노드 수는 잡 스펙에 따라 달라져요. affinity 또는 spread 블록을 사용하면 스케줄링 성능에 상당한 영향을 줄 수 있어요.
affinity 또는 spread 없음 (No affinity or spread)
affinity 또는 spread 블록을 생략하면 batch 잡 노드 제한은 2예요. service 잡의 경우 노드 제한은 최소 2 또는 데이터센터와 노드 풀의 총 노드 수의 log2예요.
affinity와 spread를 피하면 스케줄링 시간을 줄일 수 있어요. 대신 여러 노드에 걸친 잡의 기본 분포에 의존하세요. 이것이 불가능하면 스케줄러가 고려할 노드 수를 줄이기 위해 노드 풀 또는 데이터센터의 크기를 줄이는 것을 고려할 수 있어요.
affinity 또는 spread 포함 (With affinity or spread)
affinity 또는 spread 블록을 포함하면 스케줄러는 태스크 그룹 count와 같은 수의 데이터센터 및 노드 풀 노드에 점수를 매기며, 할당당 최대 100개예요. 이것은 스케줄링 시간을 수십 배 증가시킬 수 있어요.
affinity 또는 spread를 사용할 때 배치 무작위화를 높이고 스케줄러 경합을 줄이려면 node-limit-for-feasibility-checks 스케줄러 구성 옵션을 설정하세요. 잡을 스케줄링할 때 Nomad가 고려해야 할 실현 가능한 노드 수에 상한을 지정할 수 있어요.
- 낮은 숫자는 더 나은 스케줄러 성능과 노드 간 더 많은 잡 무작위화를 제공해요.
- 높은 숫자는 spread 또는 affinity의 더 결정적인 적용을 제공해요.
기본 상한 100을 줄이면 스케줄링 시간 증가, binpacking 밀도, 그리고 Nomad 스케줄러가 affinity나 spread에 점수를 매기는 강도를 줄일 수 있어요.
노드 제한이 spread와 affinity 스케줄링 성능에 미치는 영향에 대한 수학적·그래픽적 설명은 GitHub pull request 주석을 참고하세요.
모니터링 (Monitoring)
affinity 또는 spread 블록에 의해 잠재적으로 영향받는 스케줄링 시간을 모니터링하려면 Key Metrics 표에 있는 nomad.nomad.worker.invoke_scheduler.*를 살펴보세요.
예시 (Examples)
다음 예시는 spread 블록을 사용하는 다양한 방법을 보여줘요.
데이터센터 간 균등 분산 (Even spread across data center)
이 예시는 노드의 datacenter 속성에 걸친 spread 블록을 보여줘요. us-east1과 us-west1 두 데이터센터가 있고 count = 10인 태스크 그룹이 있다면, Nomad는 각 데이터센터에 5개 할당을 배치하려고 시도해요.
spread {
attribute = "${node.datacenter}"
weight = 100
}
대상 백분율이 있는 spread (Spread with target percentages)
이 예시는 대상 백분율을 하나 지정하는 spread 블록을 보여줘요. us-east1, us-east2, us-west1 세 데이터센터가 있고 count = 10인 태스크 그룹이 있다면, Nomad는 5개 할당을 "us-east1"에 배치하고 나머지는 다른 두 데이터센터에 분산하려고 시도해요.
spread {
attribute = "${node.datacenter}"
weight = 100
target "us-east1" {
percent = 50
}
}
이 예시는 두 다른 데이터센터에 대한 대상 백분율을 지정하는 spread 블록을 보여줘요. us-east1과 us-west1 두 데이터센터가 있고 count = 10인 태스크 그룹이 있다면, Nomad는 6개 할당을 us-east1에, 4개를 us-west1에 배치하려고 시도해요.
spread {
attribute = "${node.datacenter}"
weight = 100
target "us-east1" {
percent = 60
}
target "us-west1" {
percent = 40
}
}
여러 속성에 걸친 spread (Spread across multiple attributes)
이 예시는 여러 속성을 가진 spread 블록을 보여줘요. us-east1과 us-west1 두 데이터센터가 있고 각 데이터센터에 ${meta.rack}이 r1 또는 r2인 노드가 있는 Nomad 클러스터를 고려하세요. count=12인 잡에 다음 spread 블록을 사용하면 Nomad는 각 데이터센터에 6개 할당을 배치하려고 시도해요. 데이터센터 안에서 Nomad는 랙 r1의 노드에 3개, 랙 r2의 노드에 3개 할당을 배치하려고 시도해요.
spread {
attribute = "${node.datacenter}"
weight = 50
}
spread {
attribute = "${meta.rack}"
weight = 50
}