작업 명세의 expose 블록
작업 명세의 expose 블록 (expose block in the job specification)
| 배치 | job -> group -> service -> connect -> sidecar_service -> proxy -> **expose** |
|---|---|
expose 블록은 Consul 서비스 메시를 위해 Nomad가 관리하는 기본 Envoy 사이드카 프록시에 대한 추가 리스너를 구성할 수 있게 해줘요. 이러한 리스너는 Connect TLS 및 네트워크 네임스페이스 격리의 우회(bypass)를 만들어, Connect가 활성화되지 않은 서비스가 사이드카 프록시를 통해 특정 HTTP 경로에 요청할 수 있게 해요.
expose 구성은 proxy 블록의 컨텍스트 내에서 유효해요. Envoy의 Expose Path 구성에 대한 추가 정보는 Consul의 Expose Paths 구성 참조에서 찾을 수 있어요.
서비스 check 구성은 그 expose 매개변수를 사용해 HTTP와 gRPC 체크에 대한 expose path 구성을 자동으로 생성할 수 있어요.
job "expose-check-example" {
datacenters = ["dc1"]
group "api" {
network {
mode = "bridge"
}
service {
name = "count-api"
port = "9001"
connect {
sidecar_service {}
}
check {
expose = true
name = "api-health"
type = "http"
path = "/health"
interval = "10s"
timeout = "3s"
}
}
task "web" {
driver = "docker"
config {
image = "hashicorpdev/counter-api:v3"
}
}
}
}
Consul 서비스 체크 외의 용도라면 proxy 블록에서 expose 구성을 사용해요. 아래 예제는 위 예제와 유사하게 /health 엔드포인트를 노출하지만 완전히 유연한 expose 구성을 사용해 효과적으로 보여줘요.
job "expose-example" {
datacenters = ["dc1"]
group "api" {
network {
mode = "bridge"
port "api_expose_healthcheck" {
to = -1
}
}
service {
name = "count-api"
port = "9001"
connect {
sidecar_service {
proxy {
expose {
path {
path = "/health"
protocol = "http"
local_path_port = 9001
listener_port = "api_expose_healthcheck"
}
}
}
}
}
check {
name = "api-health"
type = "http"
path = "/health"
port = "api_expose_healthcheck"
interval = "10s"
timeout = "3s"
}
}
task "web" {
driver = "docker"
config {
image = "hashicorpdev/counter-api:v3"
}
# e.g. reference ${NOMAD_PORT_api_expose_healthcheck} for other uses
}
}
}
출처: 문서
본문
매개변수 (Parameters)
path([Path](https://developer.hashicorp.com/nomad/docs/job-specification/expose#path-parameters): nil)— Envoy를 통해 노출할 Envoy expose path 구성 목록.
path 매개변수 (path parameters)
-
path(string: required)— 노출할 HTTP 또는 gRPC 경로. 경로는 슬래시로 시작해야 해요. -
protocol(string: required)— 리스너의 프로토콜을 설정해요.http또는http2여야 해요. gRPC에는http2를 사용해요. -
local_path_port(int: required)— 서비스가 구성된path에 대한 연결을 위해 수신 대기하는 포트. 일반적으로service.port값과 같지만, 예를 들어 노출된 경로가 태스크 그룹의 다른 태스크로 해석되도록 의도된 경우 다를 수 있어요. -
listener_port([Port](https://developer.hashicorp.com/nomad/docs/job-specification/network#port-parameters): required)— 노출된 리스너에 사용할 포트의 이름. 포트는 태스크의 네트워크 네임스페이스 안으로 매핑되도록 구성되어야 해요.
예제 (Examples)
다음 예제는 Connect 지원 count-dashboard 서비스의 /metrics 엔드포인트를 HTTP 프로토콜로 노출해요. count-dashboard는 네임스페이스 안에서 포트 9001을 수신 대기할 것으로 예상되며, 외부 서비스는 할당된 metrics Port에서 노드의 네트워크 인터페이스에 연결해 /metrics 엔드포인트에 도달할 수 있어요.
service {
name = "count-dashboard"
port = "9001"
connect {
sidecar_service {
proxy {
expose {
path {
path = "/metrics"
protocol = "http"
local_path_port = 9001
listener_port = "metrics"
}
}
}
}
}
}
다음 예제는 http2 프로토콜(gRPC에 일반적)로 /metrics 엔드포인트를, 그리고 HTTP로 /v2/health 엔드포인트를 노출해요.
proxy {
expose {
path {
path = "/metrics"
protocol = "http2"
local_path_port = 9001
listener_port = "expose"
}
path {
path = "/v2/health"
protocol = "http"
local_path_port = 9001
listener_port = "expose"
}
}
}
서비스 체크 노출하기 (Exposing service checks)
expose의 일반적인 사용 사례는 Consul 서비스 체크 정의에 사용되는 엔드포인트를 노출하는 것이에요. 이러한 경우 서비스 체크 블록의 expose 매개변수를 사용해 expose path 구성을 자동으로 생성할 수 있어요. 제공되지 않으면 동적 포트가 자동으로 생성되므로 체크에 사용할 포트 구성은 선택 사항이에요.
check {
expose = true
type = "http"
name = "dashboard-health"
path = "/health"
interval = "10s"
timeout = "3s"
}