런타임 변수 보간

런타임 변수 보간 (Variable Interpolation)

Nomad 워크로드에서 노드 속성(node attributes)과 런타임 환경 변수를 해석하는 방법에 대한 참조 정보를 제공해요. Nomad job 사양에서 변수를 해석하는 문법을 배워보아요.

출처: 문서

본문

소개 (Introduction)

Nomad는 두 종류의 변수 해석을 지원해요. 노드 속성과 런타임 환경 변수예요. 노드 속성은 제약 조건(constraints), 작업 환경 변수, 일부 드라이버 필드에서 해석할 수 있어요. 런타임 환경 변수는 스케줄러가 특정 노드에 배치한 후에만 정의되므로 제약 조건에서 해석할 수 없어요.

Nomad는 두 종류의 변수 해석을 지원해요. 노드 속성과 런타임 환경 변수요. 노드 속성은 제약 조건, 작업 환경 변수, 그리고 일부 작업 드라이버 필드(예: Docker config의 labels 속성)에서 해석할 수 있어요.

참고

런타임 환경 변수는 스케줄러가 job을 배치한 후에만 정의되므로 job 제약 조건에서 사용할 수 없어요.

문법 (Syntax)

Nomad job 사양에서 변수를 해석하는 문법은 ${variable_name}이에요. template 블록은 env 함수를 사용해 환경에서 이 변수들을 가져오며, 대신 {{env "variable_name"}}을 사용해요. 아래에서 예제를 볼 수 있어요.

task "docs" {
  driver = "docker"

  # 드라이버는 노드 속성과 런타임 환경 변수 해석을 지원한다
  config {
    image = "my-app"

    # 런타임 변수를 해석해 바인딩할 주소와 로그를 쓸 위치를 주입한다.
    args = [
      "--bind", "${NOMAD_ADDR_RPC}",
      "--logs", "${NOMAD_ALLOC_DIR}/logs",
    ]

    port_map {
      RPC = 6379
    }
  }

  # 런타임 환경 변수는 작업이 노드에 배치된 후에만 정의되므로
  # 제약 조건은 노드 속성만 지원한다.
  constraint {
    attribute = "${attr.kernel.name}"
    value     = "linux"
  }

  template {
    destination = "template.txt"
    data = <<EOT
{{- /*
      환경 변수는 ${...} 문법이 아니라 env 함수를 통해 템플릿에서 사용할 수 있다.
*/ -}}
Running on {{env "attr.unique.hostname"}}.
EOT
  }

  # 환경 변수는 해석되며 런타임 변수와 노드 속성을 모두 포함할 수 있다.
  # 이 환경 변수들은 작업 안으로 전달된다.
  env {
    DC      = "Running on datacenter ${node.datacenter}"
    VERSION = "Version ${NOMAD_META_VERSION}"
  }

  # Meta 키도 해석 가능하다.
  meta {
    VERSION = "v0.3"
  }
}

노드 속성 (Node Attributes)

아래는 해석 가능한 노드 속성의 전체 목록이에요. 이 속성들은 제약 조건 그리고 작업과 드라이버 안에서 모두 해석돼요.

변수 설명 예제 값
${node.unique.id} 36자 고유 클라이언트 식별자 9afa5da1-8f39-25a2-48dc-ba31fd7c0023
${node.region} 클라이언트의 리전 global
${node.datacenter} 클라이언트의 데이터센터 dc1
${node.unique.name} 클라이언트 이름 nomad-client-10-1-2-4
${node.class} 클라이언트 클래스 linux-64bit
${node.pool} 클라이언트 노드 풀 prod
${attr.<property>} 클라이언트에서 property가 주는 속성 ${attr.cpu.arch} => amd64
${meta.<key>} 클라이언트에서 key가 주는 메타데이터 값 ${meta.foo} => bar

아래는 일반적인 노드 속성을 문서화한 표예요.

속성 설명
${attr.cpu.arch} 클라이언트의 CPU 아키텍처(예: amd64, 386)
${attr.cpu.numcores} 클라이언트의 CPU 코어 수. OS나 구성 때문에 예약 가능한 코어 수와 다를 수 있음. cpu.reservablecores 참고.
${attr.cpu.reservablecores} 스케줄링에 사용할 수 있는 클라이언트의 CPU 코어 수. resources.cores가 설정된 작업을 배치할 때 스케줄러가 사용하는 코어 수.
${attr.cpu.totalcompute} cpu.frequency × cpu.numcores이지만 client.cpu_total_compute로 덮어쓸 수 있음
${attr.consul.datacenter} 클라이언트의 Consul 데이터센터(Consul이 발견된 경우)
${attr.driver.<property>} 속성 문서는 task 드라이버 참고
${attr.unique.hostname} 클라이언트의 호스트 이름
${attr.unique.network.ip-address} 클라이언트가 핑거프린트하고 작업 포트가 할당되는 IP 주소
${attr.kernel.arch} 클라이언트의 커널 아키텍처(예: x86_64, aarch64)
${attr.kernel.name} 클라이언트의 커널(예: linux, darwin)
${attr.kernel.version} 클라이언트 커널 버전(예: 3.19.0-25-generic, 15.0.0)
${attr.platform.aws.ami-id} 클라이언트의 AMI ID(AWS EC2인 경우)
${attr.platform.aws.instance-life-cycle} 클라이언트의 인스턴스 수명 주기(예: 스팟, 온디맨드)(AWS EC2인 경우)
${attr.platform.aws.instance-type} 클라이언트의 인스턴스 타입(AWS EC2인 경우)
${attr.platform.aws.placement.availability-zone} 클라이언트의 가용 영역(AWS EC2인 경우)
${attr.os.name} 클라이언트의 운영 체제(예: ubuntu, windows, darwin)
${attr.os.version} 클라이언트 OS 버전
${attr.os.build} 클라이언트 OS의 빌드 번호(예: 14393.5501)(Windows인 경우)

노드 속성의 전체 목록은 nomad node status -verbose [node]를 실행해서 얻을 수 있어요.

job 파일에서 노드 속성과 속성 값을 사용하는 몇 가지 예제는 다음과 같아요.

job "docs" {
  # 이 job을 64비트 클라이언트에서만 실행하도록 제한한다.
  constraint {
    attribute = "${attr.cpu.arch}"
    value     = "amd64"
  }

  # 이 job을 코어가 4개 이상인 클라이언트에서만 실행하도록 제한한다.
  # 참고: 작업에 CPU 리소스 요구 사항을 선언할 수도 있다.
  constraint {
    attribute = "${cpu.numcores}"
    operator  = ">="
    value     = "4"
  }

  # 이 job을 메모리 최적화 AWS EC2 인스턴스에서만 실행한다.
  constraint {
    attribute = "${attr.platform.aws.instance-type}"
    value     = "m4.xlarge"
  }
}

환경 변수 (Environment Variables)

다음은 작업이 실행되고 있는 환경을 설명하는 런타임 환경 변수예요. 이들은 작업이 특정 노드에 배치된 후에만 정의되므로 제약 조건에서 사용할 수 없어요.

환경 변수는 보간을 위해 대괄호(${...})로 감싸거나 템플릿 블록 안에서 env 함수({{env "..."}})로 접근해야 해요.

변수 이름의 점 (Dots in Variables)

Nomad는 이름의 점을 객체 표기로 해석해요. 이로 인해 연속된 점이 여러 개 있는 이름은 유효하지 않은 것으로 간주돼요. 예를 들어 invalid...name이라는 환경 변수는 표준 "${invalid...name}" 문법으로 보간할 수 없어요. 그렇게 하면 파서가 Extra characters after interpolation expression 오류를 반환해요. Nomad는 이름과 관계없이 인덱스 문법을 사용해 어떤 환경 변수든 접근할 수 있는 env 변수를 제공해요.

job "sample" {
  datacenters = ["dc1"]
  group "g1" {
    task "redis" {

      # 참고: 유효하지 않은 이름의 환경 변수를 설정하려면 `env`에 HCL2 맵 할당 문법을
      # 사용해야 한다. 그렇지 않으면 job 사양 파서가
      # `Argument or block definition required` 오류를 던진다
      env = {
        "invalid...name" = "value1"
        "valid.name"     = "value2"
      }

      driver = "docker"
      config {
        image  = "redis:7"
        labels {
          label1 = "${env[\"invalid...name\"]}"
          label2 = "${valid.name}"
        }
      }
    }
  }
}
변수 설명
NOMAD_ALLOC_DIR 공유 alloc/ 디렉터리 경로. 런타임 작업 디렉터리 문서 참고.
NOMAD_TASK_DIR 작업 local/ 디렉터리 경로. 런타임 작업 디렉터리 문서 참고.
NOMAD_SECRETS_DIR 작업의 secrets/ 디렉터리 경로. 런타임 작업 디렉터리 문서 참고.
NOMAD_MEMORY_LIMIT 작업의 메모리 한도(MB)
NOMAD_MEMORY_MAX_LIMIT 클라이언트에 여유 메모리 용량이 있을 때 작업이 사용할 수 있는 최대 메모리 한도(MB). 작업이 메모리 오버서브스크립션으로 구성되지 않았다면 생략됨.
NOMAD_CPU_LIMIT 작업의 CPU 한도(MHz)
NOMAD_CPU_CORES cpuset 리스트 표기로 작업에 예약된 특정 CPU 코어. 작업이 CPU 코어를 요청하지 않으면 생략됨. 예: 0-2,7,12-14
NOMAD_ALLOC_ID 작업의 할당 ID
NOMAD_SHORT_ALLOC_ID 작업 할당 ID의 처음 8자
NOMAD_ALLOC_NAME 작업의 할당 이름. job 이름, task group 이름, 할당 인덱스에서 파생됨.
NOMAD_ALLOC_INDEX 할당 인덱스. task group 인스턴스를 구분하는 데 유용함. 0부터 (count - 1)까지. 시스템 job과 sysbatch job의 경우 이 값은 항상 0임. 인덱스는 일반적으로 job의 특정 버전 내에서 고유하지만, 배포의 canary나 실패한 작업이 인덱스를 재사용할 수 있음. Nomad는 이 인덱스의 고유성을 보장할 수 없으므로, 상태 저장 리소스의 잠금 대신 사용하면 안 됨.
NOMAD_TASK_NAME 작업 이름
NOMAD_GROUP_NAME 그룹 이름
NOMAD_JOB_ID job의 ID. 명령줄 도구로 제출할 때는 job 이름과 같지만 API를 사용할 때는 다를 수 있음
NOMAD_JOB_NAME job 이름
NOMAD_JOB_PARENT_ID job에 부모가 있다면 그 부모 job의 ID
NOMAD_DC 할당이 실행 중인 데이터센터
NOMAD_PARENT_CGROUP 작업 cgroup을 담는 부모 cgroup(Linux 전용)
NOMAD_NAMESPACE 할당이 실행 중인 네임스페이스
NOMAD_REGION 할당이 실행 중인 리전
NOMAD_UNIX_ADDR task API의 unix 소켓과 함께 nomad CLI를 사용할 때 NOMAD_ADDR 값으로 사용할 값. "unix://${NOMAD_SECRETS_DIR}/api.sock"와 동등함
NOMAD_META_<key> 작업의 메타데이터에서 key로 주어진 메타데이터 값. [A-Za-z0-9_.]가 아닌 키의 모든 문자는 _로 변환됨. 참고: 이는 노드 메타데이터의 키인 ${meta.<key>}와 다름.
CONSUL_HTTP_TOKEN 작업의 Consul 토큰. Consul 통합 문서 참고.
CONSUL_TOKEN 작업의 Consul 토큰. Consul 통합 문서 참고. 이 변수는 더 이상 사용되지 않으며 호환성 목적으로만 존재함.
VAULT_TOKEN 작업의 Vault 토큰. Vault 통합 문서 참고
변수 설명
NOMAD_IP_<label> 주어진 포트 label에 대한 호스트 IP. network 블록 문서 참고.
NOMAD_PORT_<label> 주어진 포트 label에 대한 포트. 포트 맵이 사용될 때 드라이버 지정 포트, 그 외에는 호스트의 정적 또는 동적 포트 할당. 서비스는 이 포트에 바인딩해야 함. network 블록 문서 참고.
NOMAD_ADDR_<label> 주어진 포트 label에 대한 호스트 IP:Port 쌍.
NOMAD_ALLOC_INTERFACE_<label> bridged 또는 CNI 네트워킹을 사용할 때 주어진 포트 label에 대한 구성된 네트워크 네임스페이스 인터페이스.
NOMAD_ALLOC_IP_<label> bridged 또는 CNI 네트워킹을 사용할 때 주어진 포트 label에 대한 구성된 네트워크 네임스페이스 IP.
NOMAD_ALLOC_ADDR_<label> bridged 또는 CNI 네트워킹을 사용할 때 주어진 포트 label에 대한 구성된 네트워크 네임스페이스 IP:Port 쌍.
NOMAD_HOST_PORT_<label> 포트 label에 대한 호스트의 포트. network 블록 문서의 Mapped Ports 섹션 참고.
NOMAD_UPSTREAM_IP_<service> Consul 서비스 메시 업스트림으로 정의될 때 주어진 service에 대한 IP.
NOMAD_UPSTREAM_PORT_<service> Consul 서비스 메시 업스트림으로 정의될 때 주어진 service에 대한 포트.
NOMAD_UPSTREAM_ADDR_<service> Consul 서비스 메시 업스트림으로 정의될 때 주어진 service에 대한 호스트 IP:Port.
NOMAD_ENVOY_ADMIN_ADDR_<service> Consul 서비스 메시로 활성화된 서비스로 정의될 때 주어진 service의 envoy 사이드카 관리 포트에 대한 로컬 주소 127.0.0.2:Port. 호스트 네트워킹으로 구성되지 않았다면 Envoy는 그룹 네트워크 네임스페이스 안에서 실행됨.
NOMAD_ENVOY_READY_ADDR_<service> Consul 서비스 메시로 활성화된 서비스로 정의될 때 주어진 service의 envoy 사이드카 ready 포트에 대한 로컬 주소 127.0.0.1:Port. 호스트 네트워킹으로 구성되지 않았다면 Envoy는 그룹 네트워크 네임스페이스 안에서 실행됨.

참고

Nomad는 NOMAD_ADDR_<task>_<label> 같은 환경 변수 이름을 생성할 때 포트 라벨이나 작업 이름에서 영숫자도 밑줄도 아닌 문자를 밑줄로 바꿔요.

참고

이 변수들은 Consul 서비스 메시 네이티브 작업에만 설정돼요.

변수 설명
CONSUL_HTTP_ADDR 로컬 Consul agent의 주소를 지정함. bridge 네트워킹 모드에서는 unix 도메인 소켓으로, 호스트 네트워킹 모드에서는 TCP 주소로 자동 설정됨.
CONSUL_HTTP_TOKEN Consul에 권한 부여하는 데 사용되는 Consul ACL 토큰을 지정함. Consul ACL이 활성화되면 서비스 인스턴스에 특정한 생성된 Consul 서비스 ID 토큰으로 자동 설정됨.
CONSUL_HTTP_SSL Consul과 통신할 때 HTTPS를 사용해야 하는지 지정함. Nomad가 TLS로 Consul과 통신하도록 구성되면 true로 자동 설정됨.
CONSUL_HTTP_SSL_VERIFY Consul과의 HTTPS 연결을 상호 검증해야 하는지 지정함. Nomad가 TLS 인증서를 검증하도록 구성되면 true로 자동 설정됨.
CONSUL_CACERT Consul 통신에 사용되는 CA 인증서 경로를 지정함. Nomad가 consul.share_ssl 옵션으로 구성되면 자동 설정됨.
CONSUL_CLIENT_CERT Consul 통신에 사용되는 Client 인증서 경로를 지정함. Nomad가 consul.share_ssl 옵션으로 구성되면 자동 설정됨.
CONSUL_CLIENT_KEY Consul 통신에 사용되는 Client Key 인증서 경로를 지정함. Nomad가 consul.share_ssl 옵션으로 구성되면 자동 설정됨.
CONSUL_TLS_SERVER_NAME Consul 통신의 SNI 호스트로 사용할 서버 이름을 지정함. Consul이 TLS를 사용하도록 구성되고 작업이 bridge 네트워킹 모드를 사용하는 그룹에 있으면 자동 설정됨.

더 알아보기 (Learn more)