관리 파티션 간 메시 게이트웨이
관리 파티션 간 메시 게이트웨이
메시 게이트웨이는 서로 다른 Consul 관리 파티션 간에 서비스 메시 트래픽을 라우팅할 수 있게 해줘요. 파티션은 모든 파티션의 모든 서비스 간의 일반적인 상호 연결이 어려운 다른 클라우드나 런타임 환경에 있을 수 있어요. 이 기능은 Consul Enterprise 1.11.0+가 필요해요.
출처: 문서
본문
Consul Enterprise 1.11.0+: 관리 파티션은 Consul Enterprise 버전 1.11.0 이상에서 지원됩니다.
메시 게이트웨이는 서로 다른 Consul 관리 파티션 간에 서비스 메시 트래픽을 라우팅할 수 있게 해줍니다. 파티션은 모든 파티션의 모든 서비스 간의 일반적인 상호 연결이 실행 가능하지 않은 다른 클라우드나 런타임 환경에 있을 수 있습니다.
메시 게이트웨이는 서비스 메시 세션에서 서버 이름 표시(SNI) 헤더를 스니핑하고 추출하여 요청된 서버 이름을 기반으로 연결을 적절한 대상으로 라우팅하는 방식으로 작동합니다. 게이트웨이는 mTLS 세션 내의 데이터를 해독하지 않습니다.
사전 요구 사항 (Prerequisites)
Consul 환경이 다음 요구 사항을 충족하는지 확인하세요.
Consul
- Consul Enterprise 버전 1.11.0 이상.
- 구성을 관리하려면 로컬 Consul 에이전트가 필요합니다.
- 모든 파티션에서 Consul 서비스 메시가 활성화되어 있어야 합니다. 자세한 내용은
connectdocumentation을 참조하세요. - 각 파티션은 고유한 이름을 가져야 합니다. 자세한 내용은 admin partitions documentation을 참조하세요.
- 게이트웨이를 전역 활성화하려면 중앙 집중식 구성을 활성화해야 합니다.
프록시 (Proxy)
Envoy는 Consul에서 메시 게이트웨이 기능을 가진 유일한 프록시입니다.
메시 게이트웨이 프록시는 프록시의 등록을 기반으로 Consul이 자동으로 생성하는 구성으로 구성을 받습니다. Consul은 메시 게이트웨이 등록 정보만 Envoy 구성으로 변환할 수 있습니다.
게이트웨이를 통해 업스트림 서비스로 트래픽을 보내는 사이드카 프록시는 해당 게이트웨이의 위치를 알아야 합니다. 이들은 사이드카 프록시 등록을 기반으로 게이트웨이를 발견합니다. Consul은 게이트웨이 등록 정보만 Envoy 구성으로 변환할 수 있습니다.
게이트웨이를 통해 업스트림 트래픽을 보내지 않는 사이드카 프록시는 게이트웨이를 배포해도 영향을 받지 않습니다. Consul의 내장 프록시를 서비스 메시 사이드카로 사용 중이라면 데이터센터 내 트래픽에 대해 계속 작동하며, 트래픽이 게이트웨이를 통과했더라도 수신 트래픽을 계속 받습니다.
구성 (Configuration)
다음 설정을 구성하여 메시 게이트웨이를 Consul의 서비스로 등록하세요.
- 게이트웨이를 Consul에 등록하려면
kind필드에mesh-gateway를 지정하세요. proxy.upstreams매개변수를 구성하여 트래픽을 올바른 서비스, 네임스페이스, 파티션으로 라우팅하세요. 자세한 내용은upstreamsdocumentation을 참조하세요.proxy.upstreams.destination_name서비스는 항상 필요합니다. 교차 파티션 트래픽을 활성화하려면proxy.upstreams.destination_partition을 구성해야 합니다.proxy.upstreams.destination_namespace구성은 대상 서비스가 다른 네임스페이스에 있는 경우에만 필요합니다.- Consul이 관리 파티션에 포함된 서비스를 하나 이상의 추가 파티션으로 내보낼 수 있게 하려면
exported-services구성 항목을 구성하세요. 자세한 내용은 Exported Services documentation을 참조하세요. - 프록시, 즉 Envoy와 호환되는 불투명 매개변수를 사용해
Proxy.Config설정을 정의하세요. Envoy의 경우 추가 구성 정보는 Gateway Options 및 Escape-hatch Overrides 문서를 참조하세요. - ACL이 활성화된 경우, 게이트웨이의 서비스 이름에 대한
service:write와 데이터센터 또는 파티션의 모든 서비스에 대한service:read를 부여하는 토큰을 게이트웨이의 서비스 정의에 추가해야 합니다. 이러한 권한은 토큰이 다른 Consul 서비스 메시 서비스의 통신을 라우팅할 수 있게 승인하지만, 그 통신을 해독하는 것은 허용하지 않습니다.
모드 (Modes)
서비스 메시 프록시와 연결된 각 업스트림은 메시 게이트웨이를 통해 라우팅되도록 구성할 수 있습니다. 네트워크에 따라 프록시와 게이트웨이의 연결은 다음 모드 중 하나로 작동할 수 있습니다.
none- (기본값) 게이트웨이를 사용하지 않으며 서비스 메시 connect 프록시가 아웃바운드 연결을 대상 서비스에 직접 만듭니다.local- 서비스 메시 connect 프록시가 같은 데이터센터에서 실행되는 게이트웨이에 아웃바운드 연결을 만듭니다. 아웃바운드 연결의 게이트웨이는 데이터가 대상 파티션의 게이트웨이로 전달되도록 보장합니다.remote- 서비스 메시 connect 프록시가 대상 데이터센터에서 실행되는 게이트웨이에 아웃바운드 연결을 만듭니다. 게이트웨이가 데이터를 최종 대상 서비스로 전달합니다.
Service Mesh Proxy Configuration
서비스 메시 프록시를 구성하려면 프록시를 선호하는 mode로 설정하세요. 모드를 전역으로 지정하거나 하위 구성 내에서 지정하여 더 낮은 수준에서 프록시 동작을 제어할 수 있습니다. 게이트웨이 모드가 여러 위치에 구성된 경우 Consul이 인식하는 우선순위는 다음과 같습니다.
- 업스트림 정의 (가장 높은 우선순위)
- 서비스 인스턴스 정의
- 중앙 집중식
service-defaults구성 항목 - 중앙 집중식
proxy-defaults구성 항목
예시 구성 (Example Configurations)
다음 예시 구성은 일반적인 시나리오 중 일부를 이해하는 데 도움이 됩니다.
게이트웨이 전역 활성화
다음 proxy-defaults 구성은 모든 메시 서비스에 대해 local 모드의 게이트웨이를 활성화합니다.
예시: 게이트웨이 전역 활성화
Kind = "proxy-defaults"
Name = "global"
MeshGateway {
Mode = "local"
}
서비스별 게이트웨이 활성화
다음 service-defaults 구성은 이름이 web인 모든 메시 서비스에 대해 게이트웨이를 활성화합니다.
예시: 서비스별 게이트웨이 활성화
Kind = "service-defaults"
Name = "web"
MeshGateway {
Mode = "local"
}
서비스 인스턴스에 대한 게이트웨이 활성화
다음 프록시 서비스 구성은 finance 파티션의 web 서비스 인스턴스에 대해 게이트웨이를 활성화합니다.
예시: 서비스 인스턴스에 대한 게이트웨이 활성화
service {
name = "web-sidecar-proxy"
kind = "connect-proxy"
port = 8181
proxy {
destination_service_name = "web"
mesh_gateway {
mode = "local"
}
upstreams = [
{
destination_partition = "finance"
destination_namespace = "default"
destination_type = "service"
destination_name = "billing"
local_bind_port = 9090
}
]
}
}
프록시 업스트림에 대한 게이트웨이 활성화
다음 서비스 정의는 세 개의 서로 다른 파티션에 대해 local 모드의 게이트웨이를 활성화합니다. 각 서비스는 같은 네임스페이스에 존재하지만 관리 파티션으로 분리되어 있습니다.
예시: 프록시 업스트림에 대한 게이트웨이 활성화
service {
name = "web-sidecar-proxy"
kind = "connect-proxy"
port = 8181
proxy {
destination_service_name = "web"
upstreams = [
{
destination_name = "api"
destination_namespace = "dev"
destination_partition = "api"
local_bind_port = 10000
mesh_gateway {
mode = "local"
}
},
{
destination_name = "db"
destination_namespace = "dev"
destination_partition = "db"
local_bind_port = 10001
mesh_gateway {
mode = "local"
}
},
{
destination_name = "logging"
destination_namespace = "dev"
destination_partition = "logging"
local_bind_port = 10002
mesh_gateway {
mode = "local"
}
},
]
}
}