devops

Hashicorp Nomad Scheduling 본문

DevOps/Nomad x Consul

Hashicorp Nomad Scheduling

vataops 2024. 6. 6. 18:18
반응형

하시코프의 Nomad는 Kubernetes에 비해서 간단하며, 다양한 워크로드를 지원, 지속가능한 배포와 확장성이라는 장점을 가진 오케스트레이션 툴이다.

내가 현재 몸담고 있는 회사에선 여러 베어메탈 서버와 컨테이너들을 운영하고 있고 Disk 사이즈도 TB 단위로 사용하는 워크로드가 많다. 이런 조건에선 Kubernetes는 적합하지 않다. Kubernetes를 사용하면 자칫 노드당 하나의 컨테이너만 돌려야할 수 도 있고 바이너리로 실행되는 어플리케이션은 매니징하지도 못한다.

오케스트레이션에 있어 가장 중요한 기능은 리소스를 효율적으로 관리하는 스케쥴링(Scheduling)이라 생각한다. Nomad의 스케쥴링은 어떤 방식으로 진행되고 어떤 요소들이 있는지 살펴보자.


Nomad Scheduling Concept

nomad에는 4가지 주요 요소가 있다. Evaluation, Allocation, Node, Job

  • Job: 실행할 task의 선언적인 디스크립션으로 제약 조건에 맞춰 리소스를 요구하며, nomad 클라이언트를 운영하는 클러스터가 task를 노드에 할당한다.
# nginx 컨테이너를 실행하는 job 예시

job "example-service" {
  region = "global"

  datacenters = ["dc1"]

  type = "service"

  group "example-group" {
    count = 3

    task "web" {
      driver = "docker"

      config {
        image = "nginx:latest"
        ports = ["http"]
      }

      resources {
        cpu    = 500
        memory = 256
      }

      service {
        name = "example-service"
        port = "http"

        check {
          type     = "http"
          path     = "/"
          interval = "10s"
          timeout  = "2s"
        }
      }
    }

    network {
      port "http" {
        static = 8080
      }
    }
  }
}
  • Allocation: Job을 노드에 매핑하는 것은 Allocation을 통해서 이뤄지며 특정 노드에서 실행되는 것을 선언하는데 사용된다. 스케쥴링은 적절한 Allocation을 결정하는 프로세스다.
  • Evaluation: 외부 상태의 변경, 요청에 따라서 이뤄진다. 원하는 상태(desired state)는 job을 기반으로 새로운 job이 제출되거나 존재하는 job이 업데이트 되거나 제거되었을때 변하게 된다. 또한 비상 상태(Emergent state)는 클라이언트 노드에 의한 것으로 시스템에서 클라이언트의 실패를 다뤄야하는 상태다.
  • Node: Node는 클러스터에 의해서 job을 스케쥴링 받아 실질적으로 task를 수행하는 클라이언트다.

Evaluation의 라이프사이클은 다음과 같다.

  1. Evaluation 트리거
  2. Evaluation 생성
  3. Evaluation 큐에 추가
  4. 스케쥴러 서버에 의해 처리
  5. Allocation 생성
  6. Allocation 배포 및 실행
  7. Evaluation 완료

1. Evaluation 트리거

Evaluation은 다양한 이벤트에 의해 트리거된다. 여기에는 job 제출, 구성 변경, 노드 상태 변경 및 기타 내부 트리거가 포함된다.
새로운 job 제출, 기존 작업 업데이트 또는 노드 장애가 발생하면 Evaluation이 트리거된다.

2. Evaluation 생성

트리거 발생하면 Nomad는 새로운 Evaluation을 생성한다.

3. Evaluation Queue에 추가

생성된 Evaluation은 스케쥴링을 위해서 Evaluation 브로커의 Queue에 추가된다. 우선순위에 따라서 Evaluation을 정렬하여 처리된다.

4. 스케쥴러 서버에 의해서 처리

스케쥴러는 Evaluation 브로커로부터 Evaluation을 가져와 처리한다. 스케쥴러는 job의 요구사항에 맞춰 job이 가능한 최적의 노드를 찾고 리소스 할당을 결정한다.  

5. Allocation 생성

스케쥴러가 적절한 노드를 찾으면 job을 해당 노드에 할당하기 위해서 Allocation을 생성한다. Allocation은 job이 실제로 실행될 수 있는 구체적인 리소스의 할당 단위라고 보면 된다.

6. Allocation 배포 및 실행

생성된 Allocation은 노드에 배포되고 Nomad 클라이언트에 의해서 실행된다. 

7. Evaluation 완료

job이 성공적으로 실행되거나 실패하면 Evaluation은 완료상태가 된다. 완료된 Evaluation은 시스템에서 정리된다. 필요에 따라 로그에 기록된다.


Scheduling Placement

allocation을 실행할 클라이언트를 선정하는 과정을 Allocation Placement라고 한다. 이 부분은 어플리케이션의 목표 달성을 위한 복원력과 높은 가용성에 중요한 프로세스다.

Nomad는 기본적으로 모든 노드를 고려하여 Allocation Placement를 진행한다. 이 과정은 에이전트 및 job 구성 파일을 통해 정해진다. Placement의 옵션은 다음과 같다.

Affinity & Contraint

  • 선호도(Affinity): Affinity는 특정 노드 속성에 대한 Soft Requirement를 정의한다. Placemnet는 affinity 규칙을 따르지만, 규칙을 충족하지 못할 경우 다른 노드에도 배치될 수 있다.
  • 제약 조건(Constraint): Constraint는 Hard Requirement를 정의한다. 조건을 충족시키지 못하면 job Placemnet가 실패된다.

Node Class

노드 클래스는 노드를 그룹화하는 데 사용된다. 클라이언트 구성 파일의 node_class 매개변수를 통해 설정된다.

Node metadata

노드 메타데이터는 클라이언트 구성 파일의 meta 매개변수를 통해 지정되거나 nomad node meta 명령 및 /v1/client/metadata API 엔드포인트를 통해 동적으로 지정된다.

Datacenter

데이터센터는 특정 지역의 지리적 위치를 나타내며, fault tolerance와 인프라 격리를 위해 사용된다. 에이전트 구성 파일의 datacenter 매개변수를 통해 정의된다. 데이터센터는 job에서 선택적으로 사용된다.

Node Pool

노드 풀은 job의 격리를 위해 노드를 그룹화한다. 에이전트 구성 파일의 node_pool 속성을 통해 구성된다. 노드 풀은 특정 작업에 대해 특정 노드를 사용할 수 있도록 제한하는 데 사용된다.


참고

https://developer.hashicorp.com/nomad/docs/

반응형
Comments