작업 명세의 constraint 블록

작업 명세의 constraint 블록 (constraint block in the job specification)

| 배치 | job -> **constraint** | | | job -> group -> **constraint** | | | job -> group -> task -> **constraint** | | | | | | |

constraint는 실행 가능한 노드의 집합을 제한할 수 있게 해줘요. 제약 조건은 속성(attributes) 또는 클라이언트 메타데이터를 기준으로 필터링할 수 있어요. 또한 최고의 유연성을 위해 제약 조건은 job, group, task 수준에서 지정할 수 있어요.

Warning: 작업에 해결 불가능한 제약 조건을 정의하는 것이 가능해요.

예를 들어 태스크 수준에서 서로 다른 ${attr.unique.hostname} 제약 조건을 지정하면, 그룹 내 모든 태스크가 동일한 클라이언트 노드에 스케줄되기 때문에 작업을 배치할 수 없게 돼요.

job "docs" {
  # All tasks in this job must run on linux.
  constraint {
    attribute = "${attr.kernel.name}"
    value     = "linux"
  }

  group "example" {
    # All groups in this job should be scheduled on different hosts.
    constraint {
      operator  = "distinct_hosts"
      value     = "true"
    }

    task "server" {
      # All tasks must run where "my_custom_value" is greater than 3.
      constraint {
        attribute = "${meta.my_custom_value}"
        operator  = ">"
        value     = "3"
      }
    }
  }
}

제약 조건은 계층적으로 적용되므로 job 수준과 group 수준 모두에 배치하는 것은 중복돼요. job 제약 조건은 작업의 모든 그룹(및 태스크)에 영향을 미쳐요.

constraint 블록 업데이트는 비파괴적(non-destructive)이에요. 비파괴적 업데이트만 포함한 작업 명세 업데이트는 기존 할당을 마이그레이션하거나 교체하지 않아요.

출처: 문서

본문

매개변수 (Parameters)

  • attribute (string: "") — 제약 조건을 위해 검사할 속성의 이름 또는 참조를 지정해요. 이것은 Nomad 보간 값 중 하나일 수 있어요.

  • operator (string: "=") — 비교 연산자를 지정해요. operator가 >, >=, <, <= 중 하나라면 피연산자가 모두 정수이거나 모두 부동소수점일 때 순서를 숫자로 비교하고, 그 외에는 사전식으로 비교해요. 가능한 값은 다음과 같아요:

=
!=
>
>=
<
<=
distinct_hosts
distinct_property
regexp
set_contains
set_contains_any
version
semver
is_set
is_not_set

이 값들과 그 동작에 대한 자세한 설명은 operator values 섹션을 참조하세요.

  • value (string: "") — 지정된 연산을 사용해 속성과 비교할 값을 지정해요. 이것은 리터럴 값, 다른 속성, 또는 Nomad 보간 값 중 하나일 수 있어요. is_set, is_not_set, distinct_hosts, distinct_property 연산자를 사용할 때를 제외하고 value 필드는 필수예요.

operator 값 (operator values)

이 섹션은 제약 조건을 위한 Nomad 작업 명세의 "operator" 매개변수에 대한 특정 값을 자세히 설명해요. operator는 항상 문자열로 지정되지만, 문자열은 전체 제약 조건 평가의 동작을 바꾸는 다양한 값을 가질 수 있어요.

constraint {
  operator = "..."
}
  • "distinct_hosts" — 스케줄러가 어떤 그룹도 같은 머신에 배치하지 않도록 지시해요. job 제약 조건으로 지정되면 작업의 모든 그룹에 적용돼요. group 제약 조건으로 지정되면 효과가 해당 그룹으로 제한돼요. 이 제약 조건은 태스크 수준에서 지정할 수 없어요. 이 제약 조건을 사용할 때 attribute 매개변수는 생략해야 한다는 점에 유의하세요.
constraint {
  operator  = "distinct_hosts"
  value     = "true"
}

제약 조건은 더 간결한 표현을 위해 다음과 같이도 지정할 수 있어요:

constraint {
    distinct_hosts = true
}
  • "distinct_property" — 스케줄러가 지정된 속성의 고유한 값을 가진 노드를 선택하도록 지시해요. value 매개변수는 속성의 값을 얼마나 많은 할당이 공유할 수 있는지 지정해요. value는 1 이상이어야 하며 생략하면 기본값 1이 돼요. job 제약 조건으로 지정되면 작업의 모든 그룹에 적용돼요. group 제약 조건으로 지정되면 효과가 해당 그룹으로 제한돼요. 이 제약 조건은 태스크 수준에서 지정할 수 없어요.
constraint {
  operator  = "distinct_property"
  attribute = "${meta.rack}"
  value     = "3"
}

제약 조건은 더 간결한 표현을 위해 다음과 같이도 지정할 수 있어요:

constraint {
  distinct_property = "${meta.rack}"
  value             = "3"
}
  • "regexp" — 속성에 대한 정규식 제약 조건을 지정해요. 허용되는 정규식의 구문은 Perl, Python 및 많은 다른 언어에서 사용되는 일반 구문과 동일해요. 더 정확히는 RE2가 허용하는 구문이며 Google RE2 구문에 설명되어 있어요.
constraint {
  attribute = "..."
  operator  = "regexp"
  value     = "[a-z0-9]"
}
  • "set_contains" — 속성에 대한 포함(contains) 제약 조건을 지정해요. 속성과 검사되는 목록은 쉼표로 분리돼요. 주어진 속성이 지정된 요소 모두를 포함하는지 확인해요.
constraint {
  attribute = "..."
  operator  = "set_contains"
  value     = "a,b,c"
}
  • "set_contains_any" — 속성에 대한 포함(contains) 제약 조건을 지정해요. 속성과 검사되는 목록은 쉼표로 분리돼요. 주어진 속성이 지정된 요소 중 하나라도 포함하는지 확인해요.
constraint {
  attribute = "..."
  operator  = "set_contains_any"
  value     = "a,b,c"
}
  • "version" — 속성에 대한 버전 제약 조건을 지정해요. 이는 회의적(pessimistic) 연산자를 포함한 쉼표로 구분된 제약 조건 목록을 지원해요. version은 비-프리릴리스 제약 조건(예: >= 1.0)을 충족하는 데 프리릴리스(예: 1.6.0-beta)를 충분한 것으로 간주하지 않아요. 엄격한 Semantic Versioning 2.0 순서를 위해서는 semver 제약 조건을 사용하세요. 더 구체적인 예제는 go-version 저장소를 참조하세요.
constraint {
  attribute = "..."
  operator  = "version"
  value     = ">= 0.1.0, < 0.2"
}
  • "semver" — 속성에 대한 버전 제약 조건을 지정해요. Semantic Versioning 2.0 호환 버전과 비교 연산자만 지원되므로 회의적 연산자는 없어요. version과 달리 이 연산자는 프리릴리스(예: 1.6.0-beta)가 비-프리릴리스 제약 조건(예: >= 1.0)을 충족하기에 충분한 것으로 간주해요. Nomad v0.10.2에서 추가됨.
constraint {
  attribute = "..."
  operator  = "semver"
  value     = ">= 0.1.0, < 0.2"
}
  • "is_set" — 주어진 속성이 존재해야 한다고 지정해요. 이는 등호 검사 전에 속성이 설정되었는지 요구하려면 "!=" 연산자와 결합할 수 있어요. "!="의 기본 동작은 해당 속성이 설정되지 않은 노드도 포함하는 것이에요.

  • "is_not_set" — 주어진 속성이 존재하지 않아야 한다고 지정해요.

예제 (Examples)

다음 예제는 constraint 블록만 보여줘요. constraint 블록은 위에 나열된 배치에서만 유효하다는 것을 기억하세요.

커널 데이터 (Kernel data)

이 예제는 "3.19"보다 높은 커널 버전을 가진 노드에서만 태스크가 실행되도록 제한해요.

constraint {
  attribute = "${attr.kernel.version}"
  operator  = "version"
  value     = "> 3.19"
}

고유 속성 (Distinct property)

distinct_property 제약 조건의 잠재적 사용 사례는 count > 1인 서비스를 랙에 걸쳐 분산해 상관 장애를 최소화하는 것이에요. 노드는 사용자 지정 클라이언트 메타데이터를 사용해 "rack-12-1", "rack-12-2" 같은 값으로 어느 랙에 있는지 주석을 달 수 있어요. 다음 제약 조건은 개별 랙이 태스크 그룹의 인스턴스를 2개보다 많이 실행하지 않도록 보장해요.

constraint {
  distinct_property = "${meta.rack}"
  value             = "2"
}

운영체제 (Operating systems)

이 예제는 Ubuntu 14.04를 실행하는 노드에서만 태스크가 실행되도록 제한해요.

constraint {
  attribute = "${attr.os.name}"
  value     = "ubuntu"
}

constraint {
  attribute = "${attr.os.version}"
  value     = "14.04"
}

클라우드 메타데이터 (Cloud metadata)

가능할 때 Nomad는 클라우드 환경에서 노드 속성을 채워넣어요. 이 값들은 제약 조건의 필터로 접근할 수 있어요. 이 예제는 AWS에서 메모리 최적화된 노드에서만 이 태스크가 실행되도록 제한해요.

constraint {
  attribute = "${attr.platform.aws.instance-type}"
  value     = "m4.xlarge"
}

사용자 지정 메타데이터 (User-Specified metadata)

이 예제는 redis, cypress, nginx용 바이너리가 모두 로컬에 캐시된 노드에서만 태스크가 실행되도록 제한해요. 이 특정 예제는 사용자 지정 클라이언트 메타데이터를 활용해요.

constraint {
  attribute    = "${meta.cached_binaries}"
  set_contains = "redis,cypress,nginx"
}

더 알아보기 (Learn more)