본문 바로가기
WIKI 기술 지식 베이스

Nomad 서비스 디스커버리

원문 보기 위키 갱신

Nomad 서비스 디스커버리 (Nomad Service Discovery)

출처: Nomad Service Discovery

본문

Traefik & Nomad 서비스 디스커버리

구성 예시 (Configuration Example)

아래에서 설명하는 것처럼 Nomad 프로바이더를 활성화할 수 있어요.

File (YAML)

providers:
  nomad: {}

File (TOML)

[providers.nomad]

CLI

--providers.nomad=true

서비스에 태그 붙이기:

...
service {
  name = "myService"
  tags = [
    "traefik.http.routers.my-router.rule=Host(`example.com`)",
  ]
}
...

구성 옵션 (Configuration Options)

| Field | Description | Default | Required | | providers.providersThrottleDuration | 구성 리로드 이후, 새로운 구성 갱신 이벤트를 반영하기까지 기다리는 최소 시간. 이 시간 안에 여러 이벤트가 발생하면 가장 최근 이벤트 하나만 반영되고 나머지는 모두 버려져요. 이 옵션은 프로바이더별로 설정할 수 없지만, 스로틀링 알고리즘은 각 프로바이더에 독립적으로 적용됩니다. | 2s | No | | providers.nomad.namespaces | Nomad 서비스가 발견될 네임스페이스를 정의해요. | "" | No | | providers.nomad.refreshInterval | 폴링 간격을 정의해요. watch 옵션이 활성화되면 이 옵션은 무시됩니다. | 15s | No | | providers.nomad.watch | 이벤트별로 구성을 갱신하는 감시(watch) 모드를 활성화해요. | false | No | | providers.nomad.throttleDuration | 프로바이더가 Nomad의 서비스 이벤트를 처리하는 빈도를 정의해요. 이 옵션은 watch 옵션이 활성화된 경우에만 호환됩니다. | 0s | No | | providers.nomad.defaultRule | 모든 서비스의 기본 호스트 규칙. 자세한 내용은 여기를 참고하세요. | "Host({{ normalize .Name }})" | No | | providers.nomad.constraints | Traefik이 컨테이너 라벨에 대해 대조하여 해당 컨테이너에 라우트를 만들지 여부를 결정하는 표현식. 자세한 내용은 여기를 참고하세요. | "" | No | | providers.nomad.exposedByDefault | Nomad 서비스를 기본적으로 Traefik에 노출해요. false로 설정하면 traefik.enable=true 태그가 없는 서비스는 결과 라우팅 구성에서 무시됩니다. 자세한 내용은 여기를 참고하세요. | true | No | | providers.nomad.allowEmptyServices | Nomad 서비스가 0개 인스턴스로 스케일되어 있더라도 해당 서비스에 대해 정의된 서버 로드 밸런서를 만들도록 프로바이더에 지시해요. | false | No | | providers.nomad.prefix | Traefik 라벨을 정의하는 Nomad 서비스 태그의 접두어를 정의해요. | traefik | No | | providers.nomad.stale | Nomad 서비스 API 읽기에 stale 일관성을 사용하도록 Traefik에 지시해요. 자세한 내용은 여기를 참고하세요. | false | No | | providers.nomad.endpoint.address | Nomad 서버의 주소를 정의해요. | http://127.0.0.1:4646 | No | | providers.nomad.endpoint.region | 사용할 Nomad 지역을 정의해요. 제공되지 않으면 로컬 에이전트 지역이 사용됩니다. | "" | No | | providers.nomad.endpoint.token | Nomad ACL이 활성화된 경우 요청별 ACL 토큰을 정의해요. 자세한 내용은 여기를 참고하세요. | "" | No | | providers.nomad.endpoint.endpointWaitTime | watch가 차단할 수 있는 시간을 정의해요. 제공되지 않으면 에이전트 기본값이 사용됩니다. | "" | No | | providers.nomad.endpoint.tls | Nomad API와의 보안 연결에 사용되는 TLS 구성을 정의해요. | - | No | | providers.nomad.endpoint.tls.ca | Nomad API와의 보안 연결에 사용되는 인증 기관(CA)의 경로를 정의해요. 기본값은 시스템 번들(system bundle)이에요. | "" | No | | providers.nomad.endpoint.tls.cert | Nomad API와의 보안 연결에 사용되는 공개 인증서의 경로를 정의해요. 이 옵션을 사용하려면 key 옵션도 설정해야 해요. | '" | Yes | | providers.nomad.endpoint.tls.key | Nomad API와의 보안 연결에 사용되는 개인 키의 경로를 정의해요. 이 옵션을 사용하려면 cert 옵션도 설정해야 해요. | "" | Yes | | providers.nomad.endpoint.tls.insecureSkipVerify | TLS 연결을 수립할 때 인증서가 커버하는 호스트 이름과 무관하게, Nomad가 제시하는 어떤 인증서든 수락하도록 프로바이더에 지시해요. | false | No |

namespaces

namespaces 옵션은 Nomad 서비스가 발견될 네임스페이스를 정의해요. namespaces 옵션을 사용하면 발견된 객체 이름이 아래와 같이 접미사로 붙게 됩니다.

<resource-name>@nomad-<namespace>

경고 (Warning)

namespaces 옵션과 namespace 옵션 중 하나만 정의해야 해요.

File (YAML)

providers:
  nomad:
    namespaces:
      - "ns1"
      - "ns2"
    # ...

File (TOML)

[providers.nomad]
  namespaces = ["ns1", "ns2"]
  # ...

CLI

--providers.nomad.namespaces=ns1,ns2
# ...

stale

Nomad 서비스 API 읽기에 stale 일관성을 사용해요.

이렇게 하면 읽기가 매우 빠르고 확장 가능해지는 대신, stale(오래된) 값이 나올 가능성이 높아져요.

자세한 내용은 일관성에 대한 Nomad 문서를 참고하세요.

File (YAML)

providers:
  nomad:
    stale: true
    # ...

File (TOML)

[providers.nomad]
  stale = true
  # ...

CLI

--providers.nomad.stale=true
# ...

token

토큰은 Nomad ACL이 활성화된 경우 요청별 ACL 토큰을 제공하는 데 사용돼요. 이 토큰에 필요한 적절한 ACL 권한은 Nomad ACL 문서에 설명된 대로 'read-job'이에요.

File (YAML)

providers:
  nomad:
    endpoint:
      token: test
    # ...

File (TOML)

[providers.nomad]
  [providers.nomad.endpoint]
    token = "test"
    # ...

CLI

--providers.nomad.endpoint.token=test
# ...

defaultRule

모든 서비스의 기본 호스트 규칙이에요.

주어진 서비스에 대해 태그로 정의된 라우팅 규칙이 없다면, 이 defaultRule이 대신 그 규칙을 정의해요. defaultRule은 유효한 Go 템플릿으로 설정해야 하며, sprig 템플릿 함수를 포함할 수 있어요. 서비스 이름은 Name 식별자로 접근할 수 있고, 템플릿은 이 서비스에 정의된 모든 라벨(즉 prefix로 시작하는 태그)에 접근할 수 있어요.

이 옵션은 traefik.http.routers.{원하는-이름}.rule 태그로 인스턴스별로 오버라이드할 수 있어요.

File (YAML)

providers:
  nomad:
    defaultRule: "Host(`{{ .Name }}.{{ index .Labels \"customLabel\"}}`)"
    # ...

File (TOML)

[providers.nomad]
  defaultRule = "Host(`{{ .Name }}.{{ index .Labels \"customLabel\"}}`)"
  # ...

CLI

--providers.nomad.defaultRule='Host(`{{ .Name }}.{{ index .Labels "customLabel"}}`)'
# ...

기본 규칙과 Traefik 서비스

Traefik 컨테이너의 노출은 기본 규칙 메커니즘과 결합될 때, 자기 자신을 대상으로 하는 라우터를 만들어 루프에 빠지게 할 수 있어요. 이 경우 무한 루프를 방지하기 위해 Traefik은 같은 라우터에서 온 요청이면 거부하는 내부 미들웨어를 추가합니다.

constraints

constraints 옵션은 Traefik이 서비스 태그에 대해 대조하여 해당 서비스에 라우트를 만들지 여부를 결정하는 표현식으로 설정할 수 있어요. 서비스 태그 중 그 표현식과 일치하는 것이 없다면 그 서비스에 대한 라우트는 만들어지지 않아요. 표현식이 비어 있으면 발견된 모든 서비스가 포함됩니다.

표현식 문법은 아래 예시에서 보여주듯이 Tag(tag), TagRegex(tag) 함수와 일반적인 불리언 논리에 기반해요.

제약 조건 키 제한 사항 (Constraints key limitations)

traefik.*는 구성을 위한 예약된 라벨 네임스페이스이며 커스텀 제약 조건의 키로 사용할 수 없다는 점을 유의하세요.

제약 조건 표현식 예시 (Constraints Expression Examples)

# Includes only services having the tag `a.tag.name=foo`
constraints = "Tag(`a.tag.name=foo`)"
# Excludes services having any tag `a.tag.name=foo`
constraints = "!Tag(`a.tag.name=foo`)"
# With logical AND.
constraints = "Tag(`a.tag.name`) && Tag(`another.tag.name`)"
# With logical OR.
constraints = "Tag(`a.tag.name`) || Tag(`another.tag.name`)"
# With logical AND and OR, with precedence set by parentheses.
constraints = "Tag(`a.tag.name`) && (Tag(`another.tag.name`) || Tag(`yet.another.tag.name`))"
# Includes only services having a tag matching the `a\.tag\.t.+` regular expression.
constraints = "TagRegex(`a\.tag\.t.+`)"

File (YAML)

providers:
  nomad:
    constraints: "Tag(`a.tag.name`)"
    # ...

File (TOML)

[providers.nomad]
  constraints = "Tag(`a.tag.name`)"
  # ...

CLI

--providers.nomad.constraints="Tag(`a.tag.name`)"
# ...

자세한 내용은 서비스 디스커버리 범위 제한(Restrict the Scope of Service Discovery)을 참고하세요.

라우팅 구성 (Routing Configuration)

라우팅(routing) 문서의 전용 섹션을 참고하세요.

더 알아보기 (Learn more)