런타임 변수 보간
런타임 변수 보간 (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}"
}
}
}
}
}
Job 관련 변수 (Job-related variables)
| 변수 | 설명 |
|---|---|
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 통합 문서 참고 |
네트워크 관련 변수 (Network-related Variables)
| 변수 | 설명 |
|---|---|
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-related Variables)
참고
이 변수들은 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)
- 런타임 환경 설정(runtime environment settings) 참조를 확인해 보세요.