배치
배치 (Placement)
이 페이지는 클라이언트에서의 작업 할당 배치에 대한 개념 정보를 제공해요. affinity, constraint, 데이터센터, 노드 풀을 사용해 할당 배치를 지정하는 방법을 알아봐요.
출처: 문서
본문
Nomad 스케줄러가 작업 등록 요청을 받으면, 어떤 클라이언트가 작업의 할당을 실행할지 결정해야 해요.
이 과정을 할당 배치(allocation placement)라고 하며, 고가용성과 복원력 같은 애플리케이션의 중요한 목표를 달성하는 데 이해하는 것이 중요할 수 있어요.
기본적으로 모든 노드가 배치 대상으로 간주되지만, 이 과정은 에이전트와 작업 구성을 통해 조정할 수 있어요.
원하는 결과에 따라 사용할 수 있는 여러 옵션이 있어요.
Affinity와 Constraint (Affinities and Constraints)
affinity와 constraint를 사용하면 사용자가 작업에 대한 소프트(soft) 또는 하드(hard) 요구 사항을 정의할 수 있어요. affinity 블록은 특정 노드 속성에 대한 소프트 요구 사항을 지정하며, 이는 작업의 할당이 일부 노드를 선호하지만 규칙이 일치하지 않으면 다른 곳에 배치될 수 있음을 의미해요. 반면 constraint 블록은 하드 요구 사항을 만들어 규칙과 일치하는 노드에만 할당을 배치할 수 있어요. 제약 조건을 충족하지 못하면 작업 배치가 실패해요.
이 규칙들은 Nomad가 자동으로 감지하는 노드 속성(node attributes)이라고 하는 내장 노드 특성, 클러스터 관리자가 에이전트 구성 파일에 정의한 정적 값, 또는 에이전트 시작 후 정의되는 동적 값을 참조할 수 있어요.
affinity와 constraint 사용의 한 가지 제약은 작업에서 노드로의 관계만 표현한다는 점이에요. 따라서 노드를 특정 작업의 할당만 받도록 제한하는 데는 사용할 수 없어요.
일부 작업이 특정 노드 선호도나 요구 사항을 가지지만 다른 작업이 같은 노드를 공유하는 것이 허용될 때 affinity와 constraint를 사용해요.
아래 섹션들은 작업 affinity와 constraint 규칙에서 구성하고 사용할 수 있는 노드 값을 설명해요.
노드 클래스 (Node Class)
노드 클래스는 인스턴스 크기나 빠른 하드 드라이브 존재 같은 일부 특성에 따라 노드를 그룹화하는 데 사용할 수 있는 임의의 값이에요. 클라이언트 구성 파일에서 node_class 매개변수를 사용해 지정해요.
동적·정적 노드 메타데이터 (Dynamic and Static Node Metadata)
노드 메타데이터는 클라이언트 구성 파일에서 meta 매개변수로 지정하거나, nomad node meta 명령어와 /v1/client/metadata API 엔드포인트로 동적으로 지정하는 임의의 키-값 매핑이에요.
메타데이터 값에 대한 미리 정해진 사용 사례는 없으며, 각 팀이 다른 방식으로 사용하기로 선택할 수 있어요. 정적 메타데이터의 몇 가지 예로는 owner = "team-qa" 같은 리소스 소유권이나 rack = "3" 같은 세분화된 위치가 있어요. 동적 메타데이터는 주어진 클라이언트에서 실행되는 작업 같은 런타임 정보를 추적하는 데 사용할 수 있어요.
데이터센터 (Datacenter)
데이터센터는 장애 허용과 인프라 격리에 사용할 수 있는 리전 내 지리적 위치를 나타내요.
에이전트 구성 파일에서 datacenter 매개변수로 정의되며, affinity와 constraint와 달리 데이터센터는 작업 수준에서 옵트인(opt-in) 방식이에요. 즉, 작업이 자신이 사용하는 데이터센터에만 할당을 배치하고, 더 중요하게는 주어진 데이터센터에 있는 작업만 해당 노드에 할당을 배치할 수 있어요.
지리적 위치의 강한 함의를 고려해, 데이터센터는 노드의 의도된 용도보다는 노드가 위치한 곳을 나타내는 데 사용하세요. spread 블록은 데이터센터 간 장애 허용을 달성하는 데 도움이 될 수 있어요.
노드 풀 (Node Pool)
노드 풀은 작업이 대상으로 삼을 수 있는 노드를 그룹화해 워크로드 격리를 달성할 수 있게 해줘요.
데이터센터와 유사하게, 노드 풀은 에이전트 구성 파일에서 node_pool 속성으로 구성되며 작업에서 옵트인 방식이에요. 이는 추가 구성 없이 특정 작업이 특정 노드를 제한적으로 사용할 수 있게 해줘요.
하지만 데이터센터와 달리 노드 풀은 미리 정해진 개념이 없고 여러 사용 사례에 사용할 수 있어요. 예를 들어 환경별(개발, 스테이징, 프로덕션), 부서별(엔지니어링, 재무, 지원), 기능별(데이터베이스, 인그레스 프록시, 애플리케이션)로 인프라를 분리할 수 있어요.
노드 풀은 또한 일급 개념(first-class)이며 추가 메타데이터와 구성을 담을 수 있어요.
특정 워크로드에 특정 노드를 제한하고 예약해야 할 때, 또는 특정 스케줄러 구성 값을 조정해야 할 때 노드 풀을 사용해요.
Nomad Enterprise는 또한 노드 풀을 네임스페이스와 연결해 작업, 네임스페이스, 노드 풀 간의 관계 관리를 용이하게 해줘요.
자세한 내용은 노드 풀 개념 페이지를 참고해요.
평가 상태 이해하기 (Understanding Evaluation Status)
작업을 즉시 배치할 수 없으면 Nomad는 배치를 관리하기 위해 평가(evaluation) 체인을 만들어요. 먼저 초기 평가가 배치에 실패하더라도 complete로 표시될 수 있어요. 그런 다음 Nomad는 리소스를 사용할 수 있게 될 때 배치를 재시도하기 위해 차단 평가(blocked evaluation)를 만들어요. Nomad가 모든 할당을 배치할 때까지 작업은 pending 상태로 유지돼요.
예를 들어 작업에 사용할 수 없는 특정 제약 조건이 있으면 초기 complete 평가와 차단 평가를 얻게 돼요. Nomad는 제약 조건에 맞는 노드를 사용할 수 있을 때까지 진행 중인 배치 시도를 추적해요.
배치 문제를 해결하려면 nomad eval status <eval_id>를 사용해요. 출력에서 배치 실패와 연결된 평가를 확인해요.