작업 명세의 affinity 블록
작업 명세의 affinity 블록 (affinity block in the job specification)
| 배치 | job -> **affinity** |
| | job -> group -> **affinity** |
| | job -> group -> task -> **affinity** |
| | |
| | |
|----------------------------------------|-----------------------|
affinity 블록은 운영자가 노드 집합에 대한 배치 선호도를 표현할 수 있게 해줘요. 선호도는 속성(attributes) 또는 클라이언트 메타데이터에 대해 표현할 수 있어요. 또한 최고의 유연성을 위해 선호도는 job, group, task 수준에서 지정할 수 있어요.
job "docs" {
# Prefer nodes in the us-west1 datacenter
affinity {
attribute = "${node.datacenter}"
value = "us-west1"
weight = 100
}
group "example" {
# Prefer the "r1" rack
affinity {
attribute = "${meta.rack}"
value = "r1"
weight = 50
}
task "server" {
# Prefer nodes where "my_custom_value" is greater than 3
affinity {
attribute = "${meta.my_custom_value}"
operator = ">"
value = "3"
weight = 50
}
}
}
}
선호도는 태스크 그룹에 적용되지만 job과 task 블록 안에서도 지정할 수 있어요. job 선호도는 작업 내 모든 그룹에 적용돼요. task 선호도는 태스크가 속한 전체 태스크 그룹에 적용돼요.
Nomad는 배치를 위한 점수를 계산할 때 선호도를 사용해요. 선호도와 일치하는 노드는 점수가 올라가요. 선호도 점수는 빈 패킹 같은 다른 점수화 요소와 결합돼요. 운영자는 가중치(weight)를 사용해 여러 선호도 간의 상대적 선호를 표현할 수 있어요. 주어진 선호도와 일치하는 노드가 없어도 배치는 여전히 성공해요. 이는 배치가 제약 조건의 기준을 충족하는 노드로만 제한되는 constraint와는 다르다는 점에 유의하세요.
affinity 블록 업데이트는 비파괴적(non-destructive)이에요. 비파괴적 업데이트만 포함한 작업 명세 업데이트는 기존 할당을 마이그레이션하거나 교체하지 않아요.
출처: 문서
본문
스케줄링 성능 (Scheduling performance)
서비스 및 배치(batch) 작업의 각 할당에 대해 Nomad 스케줄러는 소수의 실행 가능한 노드를 찾을 때까지 노드를 순회해요. 그런 다음 스케줄러는 최적의 배치를 찾기 위해 그 실행 가능한 노드들을 점수화해요. 점수화되는 정확한 노드 수는 작업 명세에 따라 달라져요. affinity 또는 spread 블록을 사용하면 스케줄링 성능에 큰 영향을 줄 수 있어요.
affinity나 spread가 없는 경우
affinity나 spread 블록을 생략하면 배치 작업의 노드 한도는 2개예요. 서비스 작업의 경우 노드 한도는 최소 2개 또는 데이터센터와 노드 풀의 전체 노드 수에 대한 log2 중 하나예요.
affinity와 spread를 피하면 스케줄링 시간을 줄일 수 있어요. 대신 여러 노드에 걸친 작업의 기본 분포에 의존해요. 이것이 불가능하다면 노드 풀이나 데이터센터의 크기를 줄여 스케줄러가 고려할 수 있는 노드 수를 줄이는 방법을 고려할 수 있어요.
affinity나 spread가 있는 경우
affinity나 spread 블록을 포함하면 스케줄러는 태스크 그룹 수와 동일한 수의 노드(할당당 최대 100개)를 데이터센터와 노드 풀에서 점수화해요. 이로 인해 스케줄링 시간이 한 자릿수 이상으로 증가할 수 있어요.
affinity나 spread를 사용할 때 배치 무작위성을 높이고 스케줄러 경합을 줄이려면 node-limit-for-feasibility-checks 스케줄러 구성 옵션을 설정해요. 작업을 스케줄링할 때 Nomad가 고려해야 하는 실행 가능한 노드 수의 상한을 지정할 수 있어요.
- 숫자가 낮을수록 스케줄러 성능이 더 좋아지고 노드 간 작업 무작위화가 더 커져요.
- 숫자가 높을수록 spread나 affinity 적용이 더 결정적이 돼요.
기본 상한인 100을 줄이면 스케줄링 시간 증가, 빈 패킹 밀도, 그리고 Nomad 스케줄러가 affinity나 spread를 점수화하는 강도를 줄일 수 있어요.
노드 한도가 spread와 affinity 스케줄링 성능에 어떤 영향을 미치는지에 대한 수학적·그래픽적 설명은 GitHub 풀 리퀘스트 댓글을 참조하세요.
모니터링 (Monitoring)
affinity나 spread 블록에 의해 영향을 받을 수 있는 스케줄링 시간을 모니터링하려면 핵심 메트릭 (Key Metrics) 표의 nomad.nomad.worker.invoke_scheduler.*를 살펴보세요.
매개변수 (Parameters)
-
attribute(string: "")— 선호도를 위해 검사할 속성의 이름 또는 참조를 지정해요. 이것은 Nomad 보간 값 중 하나일 수 있어요. -
operator(string: "=")— 비교 연산자를 지정해요. 순서는 사전식(lexically)으로 비교돼요. 가능한 값은 다음과 같아요:
=
!=
>
>=
<
<=
regexp
set_contains_all
set_contains_any
version
이 값들과 그 동작에 대한 자세한 설명은 operator values 섹션을 참조하세요.
-
value(string: <required>)— 지정된 연산을 사용해 속성과 비교할 값을 지정해요. 이것은 리터럴 값, 다른 속성, 또는 Nomad 보간 값 중 하나일 수 있어요.value필드는 필수예요. -
weight(integer: 50)— 선호도의 가중치를 지정해요. 가중치는 점수화 동안 사용되며 -100에서 100 사이의 정수여야 해요. 음수 가중치는 반-친화성(anti affinity) 역할을 하여 일치하는 노드가 더 낮은 점수를 받게 해요. 가중치는 둘 이상의 선호도가 있을 때 그들 사이의 상대적 선호를 표현하는 데 사용할 수 있어요.
operator 값 (operator values)
이 섹션은 선호도를 위한 Nomad 작업 명세의 "operator" 매개변수에 대한 특정 값을 자세히 설명해요. operator는 항상 문자열로 지정되지만, 문자열은 전체 선호도 평가의 동작을 바꾸는 다양한 값을 가질 수 있어요.
affinity {
operator = "..."
}
"regexp"— 속성에 대한 정규식 선호도를 지정해요. 허용되는 정규식의 구문은 Perl, Python 및 많은 다른 언어에서 사용되는 일반 구문과 동일해요. 더 정확히는 RE2가 허용하는 구문이며 Google RE2 구문에 설명되어 있어요.
affinity {
attribute = "..."
operator = "regexp"
value = "[a-z0-9]"
weight = 50
}
"set_contains_all"— 속성에 대한 포함(contains) 선호도를 지정해요. 속성과 검사되는 목록은 쉼표로 분리돼요. 주어진 속성이 지정된 요소 모두를 포함하는지 확인해요.
affinity {
attribute = "..."
operator = "set_contains_all"
value = "a,b,c"
weight = 50
}
-
"set_contains"—set_contains_all과 같음. -
"set_contains_any"— 속성에 대한 포함(contains) 선호도를 지정해요. 속성과 검사되는 목록은 쉼표로 분리돼요. 주어진 속성이 지정된 요소 중 하나라도 포함하는지 확인해요.
affinity {
attribute = "..."
operator = "set_contains_any"
value = "a,b,c"
weight = 50
}
"version"— 속성에 대한 버전 선호도를 지정해요. 이는 회의적(pessimistic) 연산자를 포함한 쉼표로 구분된 값 목록을 지원해요. 더 구체적인 예제는 go-version 저장소를 참조하세요.
affinity {
attribute = "..."
operator = "version"
value = ">= 0.1.0, < 0.2"
weight = 50
}
예제 (Examples)
다음 예제는 affinity 블록만 보여줘요. affinity 블록은 위에 나열된 배치에서만 유효하다는 것을 기억하세요.
커널 데이터 (Kernel data)
이 예제는 "3.19"보다 높은 커널 버전을 가진 노드에서 실행하는 선호도를 추가해요.
affinity {
attribute = "${attr.kernel.version}"
operator = "version"
value = "> 3.19"
weight = 50
}
운영체제 (Operating systems)
이 예제는 Ubuntu 14.04를 실행하는 노드에서 실행하는 선호도를 추가해요.
affinity {
attribute = "${attr.os.name}"
value = "ubuntu"
weight = 50
}
affinity {
attribute = "${attr.os.version}"
value = "14.04"
weight = 100
}
메타데이터 (Metadata)
다음 예제는 특정 랙 메타데이터를 가진 노드에서 실행하는 선호도를 추가해요.
affinity {
attribute = "${meta.rack}"
value = "rack1"
weight = 50
}
다음 예제는 특정 데이터센터의 노드에서 실행하는 선호도를 추가해요.
affinity {
attribute = "${node.datacenter}"
value = "us-west1"
weight = 50
}
클라우드 메타데이터 (Cloud metadata)
가능할 때 Nomad는 클라우드 환경에서 노드 속성을 채워넣어요. 이 값들은 선호도의 필터로 접근할 수 있어요. 이 예제는 AWS에서 메모리 최적화된 노드에서 이 태스크를 실행하는 선호도를 추가해요.
affinity {
attribute = "${attr.platform.aws.instance-type}"
value = "m4.xlarge"
weight = 50
}
배치 세부 정보 (Placement details)
운영자는 nomad alloc status -verbose를 실행해 최종 배치에 영향을 주는 선호도를 포함한 다양한 요소에 대한 더 자세한 정보를 얻을 수 있어요.
다음은 점수화 메타데이터를 보여주는 nomad alloc status -verbose <alloc-id>의 CLI 출력 스니펫이에요.
Placement Metrics
Node binpack job-anti-affinity node-reschedule-penalty node-affinity final score
30bd48cc-d760-1096-9bab-13caac424af5 0.225 -0.6 0 1 0.208
f2aa8b59-96b8-202f-2258-d98c93e360ab 0.225 -0.6 0 1 0.208
86df0f74-15cc-3a0e-23f0-ad7306131e0d 0.0806 0 0 0 0.0806
7d6c2e9e-b080-5995-8b9d-ef1695458b52 0.0806 0 0 0 0.0806
배치 점수는 다음 요소의 영향을 받아요:
bin-packing— 요구 사항에 얼마나 잘 맞는지에 따라 노드를 점수화해요. 최소한의 노드 수를 사용하는 것을 최적화해요.job-anti-affinity— 노드에 같은 작업의 추가 인스턴스가 있을 때 추가되는 페널티로, 같은 노드에 작업 인스턴스가 너무 많지 않도록 하는 데 사용돼요.node-reschedule-penalty— 작업이 재스케줄될 때 사용돼요. Nomad는 이전에 실행에 실패한 노드에 작업을 배치하지 않도록 페널티를 추가해요.node-affinity—affinity블록에 지정된 기준이 노드와 일치할 때 사용돼요.