잡 스펙의 `transparent_proxy` 블록
잡 스펙의 transparent_proxy 블록
transparent_proxy 블록은 Envoy 사이드카 프록시가 Consul 서비스 메시 투명 프록시로 동작하도록 구성해요. 이것은 Nomad에서 upstreams 블록을 구성할 필요성을 없애 Consul 서비스 메시 구성을 단순화해요. 대신 Envoy 프록시는 Consul 서비스 의도(service intentions)에서 완전히 구성을 결정해요.
출처: 문서
본문
| 배치 | job -> group -> service -> connect -> sidecar_service -> proxy -> **transparent_proxy** |
|---|
투명 프록시가 활성화되면 트래픽이 자동으로 Envoy 프록시를 통해 흐르게 돼요. 로컬 Consul 에이전트가 DNS를 제공하고 있으면 Nomad는 태스크의 네임서버도 Consul을 사용하도록 설정해요. 이렇게 하면 서비스를 조회하는 template 블록을 구성하는 대신 워크로드가 Consul의 가상 IP DNS 이름을 사용할 수 있어요.
투명 프록시 사용에는 몇 가지 중요한 제한이 있어요:
- 투명 프록시를 사용하는 태스크 그룹에는
connect블록을 하나만 가질 수 있어요. - 할당에
network.dns블록을 설정할 수 없어요(no_dns를 설정하지 않는 한, 아래 참고). - 할당이 배치되는 노드는 Transparent Proxy의 Service Mesh 통합 문서에 설명된 대로 구성되어 있어야 해요.
- 워크로드의 태스크는 Envoy 사이드카 프록시와 같은 Unix 사용자 ID(UID)를 사용할 수 없어요.
매개변수 (Parameters)
-
exclude_inbound_ports([]string: nil)- 인바운드 트래픽 리다이렉션에서 제외할 인바운드 포트 목록. 이 포트들의 트래픽은 Envoy 프록시를 우회할 수 있어요. 이 포트들은 네트워크 포트 레이블 또는 숫자 포트로 지정할 수 있어요. Nomad는 이 목록에 다음을 자동으로 추가해요:expose블록의local_path_port.expose=true가 설정된 서비스 체크의 포트.static값을 가진network.port의 포트.
-
exclude_outbound_cidrs([]string: nil)- 아웃바운드 트래픽 리다이렉션에서 제외해야 하는 CIDR 서브넷 목록. 이 서브넷으로의 트래픽은 Envoy 프록시를 우회할 수 있어요. 이것은exclude_outbound_ports와 독립적이라는 점에 유의하세요. 여기 나열된 CIDR 서브넷은 포트와 무관하게 제외돼요. -
exclude_outbound_ports([]int: nil)- 아웃바운드 트래픽 리다이렉션에서 제외해야 하는 포트 번호 목록. 이 서브넷으로의 트래픽은 Envoy 프록시를 우회할 수 있어요. 이것은exclude_outbound_cidrs와 독립적이라는 점에 유의하세요. 여기 나열된 포트는 CIDR과 무관하게 제외돼요. -
exclude_uids([]string: nil)- 아웃바운드 트래픽 리다이렉션에서 제외해야 하는 Unix 사용자 ID(UID) 목록. 설정하지 않으면 Envoy 프록시의 사용자만 iptables 규칙을 우회할 수 있게 허용돼요. -
no_dns(bool: false)- 기본적으로 Consul이 워크로드의 네임서버로 설정되고 IP 테이블 규칙이 DNS 쿼리를 Consul로 리다이렉트해요. 외부 DNS만 원하면no_dns=true를 설정하세요. DNS 네임서버에 대해 자체 CIDR 및 포트 제외를 추가해야 해요.no_dns=false일 때는network.dns를 설정할 수 없어요. -
outbound_port(int: 15001)- Envoy가 네트워크 네임스페이스 안에서 바인딩할 포트.consul-cni가 만든 iptables 규칙은 트래픽이 이 포트로 흐르도록 강제해요. Consul 프록시 구성에서outbound_listener_port를 구체적으로 설정한 경우에만 이 값을 설정해야 해요. 주어진 노드의 기본값은 클라이언트 메타데이터를 통해 변경할 수 있어요(아래 참고). -
uid(string "101")- Envoy 프록시가 사용하는 Unix 사용자 ID(UID). 다른 UID를 사용하는 Envoy 컨테이너 이미지의 커스텀 빌드가 있는 경우에만 이 값을 설정해야 해요. 주어진 노드의 기본값은 클라이언트 메타데이터를 통해 변경할 수 있어요(아래 참고). 워크로드의 태스크는 Envoy 사이드카 프록시와 같은 UID를 사용할 수 없다는 점에 유의하세요.
클라이언트 메타데이터 (Client metadata)
nomad node meta apply 명령으로 노드 메타데이터를 업데이트해 주어진 클라이언트 노드의 기본 outbound_port와 uid를 변경할 수 있어요. 업데이트할 수 있는 속성:
connect.transparent_proxy.default_uid: 이 노드의uid기본값을 설정.connect.transparent_proxy.default_outbound_port: 이 노드의outbound_port기본값을 설정.
예를 들어 uid 필드의 기본값을 120으로 설정하려면:
$ nomad node meta apply connect.transparent_proxy.default_uid=120
$ nomad node meta read -json | jq -r '.Dynamic | ."connect.transparent_proxy.default_uid"'
120
커스텀 Envoy 이미지를 사용하지 않는 한 일반적으로 이 값들을 설정할 필요는 없어요.
예시 (Examples)
최소 구성 (Minimal)
다음 예시는 최소한의 투명 프록시 스펙이에요. 투명 프록시에서는 upstreams 블록을 구성할 필요가 없다는 점에 유의하세요.
sidecar_service {
proxy {
transparent_proxy {
}
}
}
포트 9001에서 리슨하는 업스트림 태스크 그룹 count-api에 연결해야 하는 다운스트림 태스크 그룹 count-dashboard가 있다면, 다음 스펙으로 Consul 서비스 의도를 만들 수 있어요:
Kind = "service-intentions"
Name = "count-api"
Sources = [
{
Name = "count-dashboard"
Action = "allow"
}
]
그러면 다운스트림 서비스 count-dashboard는 http://count-api.virtual.consul에 요청해 count-api 서비스에 도달할 수 있어요.
외부 DNS (External DNS)
다음 예시는 외부 DNS가 사용되는 투명 프록시 스펙이에요. 이 구성에서 다른 할당의 주소를 찾으려면 template 블록을 사용해 Consul을 조회해야 해요.
sidecar_service {
proxy {
transparent_proxy {
excluded_outbound_ports = [53]
excluded_outbound_cidrs = ["208.67.222.222/32", "208.67.220.220/32"]
no_dns = true
}
}
}