터미네이팅 게이트웨이
터미네이팅 게이트웨이 (Terminating Gateways)
이 페이지는 Consul 서비스 메시의 서비스가 메시 밖의 서비스 및 대상에 연결할 수 있게 하는 터미네이팅 게이트웨이에 대해 설명해요. 이 게이트웨이는 서비스 메시 mTLS 연결을 종료하고 의도를 적용하며 요청을 적절한 대상으로 전달해요.
출처: 문서
본문
1.8.0+: 이 기능은 Consul 버전 1.8.0 이상에서 사용할 수 있어요.
터미네이팅 게이트웨이는 조직 내 네트워크에서 Consul 서비스 메시의 서비스가 메시 밖의 서비스 및 대상(destinations)에 연결할 수 있게 해요. 이 게이트웨이는 효과적으로 둘 이상의 서비스를 나타낼 수 있는 서비스 메시 프록시로 동작해요. 서비스 메시 mTLS 연결을 종료하고 의도를 적용하며 요청을 적절한 대상으로 전달해요.
추가 사용 사례와 사용 패턴은 터미네이팅 게이트웨이 이해하기 튜토리얼을 검토해요.
알려진 제한: 터미네이팅 게이트웨이는 현재 L7 구성으로 서비스 하위 집합을 대상으로 지정하는 것을 지원하지 않아요. 서비스의 모든 인스턴스로 라우팅하며 인스턴스별 필터링 기능이 없어요.
보안 고려 사항 (Security Considerations)
터미네이팅 게이트웨이는 WAN이나 공개 인터넷에 노출하지 않는 것을 권장해요. 터미네이팅 게이트웨이는 그들을 향한 Consul 서비스 메시 트래픽을 복호화하는 인증서를 보유하고 연결된 서비스에 연결하기 위한 자격 증명으로 구성될 수 있기 때문이에요. WAN 또는 공개 인터넷을 통한 연결은 메시 게이트웨이를 통해 흘러가야 해요. 메시 게이트웨이는 트래픽을 복호화하거나 서비스에 직접 연결할 수 없기 때문이에요.
CA 파일에는 경로를 지정하면 터미네이팅 게이트웨이에서의 연결이 단방향 TLS 인증을 사용해 암호화돼요. 클라이언트 인증서와 개인 키에 대한 경로도 지정하면 터미네이팅 게이트웨이에서의 연결이 상호 TLS 인증을 사용해 암호화돼요.
이 중 어떤 것도 제공하지 않으면 Consul은 게이트웨이로의 연결 만 암호화하며 게이트웨이에서 대상 서비스로의 연결은 암호화하지 않아요.
연결된 서비스의 인증서가 교체되면 디스크에서 새 인증서를 가져오기 위해 게이트웨이를 재시작해야 해요. 다운타임을 피하려면 인증서를 리로드하도록 롤링 재시작을 수행해요. 동일한 이름으로 여러 터미네이팅 게이트웨이 인스턴스를 등록하면 추가 장애 허용 기능과 롤링 재시작을 수행할 수 있는 능력이 제공돼요.
Kubernetes 전용: Kubernetes에서는 터미네이팅 게이트웨이 구성 항목에 파일 경로 필드(caFile, certFile, keyFile)와 함께 secretRef 필드를 지정해 Envoy의 Secret Discovery Service(SDS)를 통한 TLS를 활성화할 수 있어요. SDS가 활성화되면 참조된 Kubernetes secret의 인증서 업데이트가 게이트웨이 재시작 없이 Envoy에 동적으로 전달돼요.
참고 (Note): 인증서와 키가 구성되면 터미네이팅 게이트웨이는 HTTP 연결을 TLS로 업그레이드해요. 클라이언트 애플리케이션은 HTTPS가 필요한 서버에 연결할 때도 일반 HTTP 요청을 발행할 수 있어요.
사전 요구 사항 (Prerequisites)
각 터미네이팅 게이트웨이는 다음이 필요해요:
- 구성을 관리할 로컬 Consul 클라이언트 에이전트.
- 로컬 Consul 데이터센터 내 서비스에 대한 일반 네트워크 연결.
- 게이트웨이 서비스 목록의 일부인 메시 밖의 서비스 및 대상에 대한 일반 네트워크 연결.
터미네이팅 게이트웨이는 또한 Consul 데이터센터가 올바르게 구성되어 있어야 해요:
- Consul 버전 1.8.0 이상을 사용해야 해요.
- 데이터센터의 Consul 서버에서 Consul 서비스 메시가 활성화되어야 해요.
- 모든 클라이언트 에이전트에서 gRPC가 활성화되어야 해요.
현재 Consul에서 터미네이팅 게이트웨이 기능을 가진 유일한 프록시는 Envoy예요.
- 터미네이팅 게이트웨이 프록시는 게이트웨이 등록을 기반으로 Consul이 자동으로 생성한 구성을 받아요. 현재 Consul은 터미네이팅 게이트웨이 등록 정보를 Envoy 구성으로만 변환할 수 있으므로 터미네이팅 게이트웨이로 동작하는 프록시는 Envoy여야 해요.
터미네이팅 게이트웨이를 배포해도 게이트웨이를 통해 업스트림 트래픽을 보내는 서비스 메시 프록시는 영향을 받지 않아요. 비 Envoy 프록시를 서비스 메시 프록시로 사용한다면 /health/connect 엔드포인트로 업스트림을 발견하는 한 터미네이팅 게이트웨이에 연결된 서비스로 향하는 트래픽에 계속 작동해요.
터미네이팅 게이트웨이 실행 및 사용 (Running and Using a Terminating Gateway)
Consul 서비스 메시의 서비스가 메시 밖의 서비스로 연결을 활성화하는 완전한 예시는 터미네이팅 게이트웨이 튜토리얼을 검토해요.
터미네이팅 게이트웨이 구성 (Terminating Gateway Configuration)
터미네이팅 게이트웨이는 두 가지 예외를 제외하면 다른 서비스처럼 서비스 정의에서 구성되고 Consul에 등록돼요. 첫 번째는 kind가 "terminating-gateway"여야 한다는 것이에요. 둘째, 터미네이팅 게이트웨이 서비스 정의는 실제 프록시 소프트웨어에 유용한 불투명 구성 매개변수를 정의하기 위해 서비스 메시 프록시 서비스와 마찬가지로 Proxy.Config 항목을 포함할 수 있어요. Envoy에는 일부 지원되는 게이트웨이 옵션과 escape-hatch 재정의가 있어요.
참고 (Note): ACL이 활성화되면 터미네이팅 게이트웨이는 구성 항목에 있는 모든 서비스의 노드에 대한 node:read를 부여하는 토큰으로 등록되어야 해요. 토큰은 또한 터미네이팅 게이트웨이의 서비스 이름 및 터미네이팅 게이트웨이 구성 항목에 있는 모든 서비스의 이름에 대한 service:write를 부여해야 해요. 이러한 권한은 게이트웨이가 연결된 서비스를 대신해 mTLS 연결을 종료하고 트래픽을 최종 대상으로 라우팅할 수 있게 해요. 게이트웨이 노드의 Consul 클라이언트 에이전트가 기본 gRPC 포트 8502를 사용하도록 구성되지 않은 경우 게이트웨이 토큰은 에이전트의 gRPC 포트를 발견하기 위해 해당 노드 이름에 대한 agent:read도 제공해야 해요. gRPC는 Envoy 프록시에 Envoy의 xDS API를 노출하는 데 사용돼요.
서비스와 대상을 terminating-gateway 구성 항목으로 터미네이팅 게이트웨이에 연결할 수 있어요. 이 구성 항목은 CLI 또는 API로 적용할 수 있어요.
Consul 서비스 카탈로그에서 같은 이름의 게이트웨이는 단일 구성 항목으로 구성돼요. 즉 같은 이름으로 등록된 추가 게이트웨이 인스턴스는 기존 구성 항목을 기반으로 라우팅을 결정해요. 특정 서비스 집합으로 라우팅하는 게이트웨이의 복제본을 추가하려면 추가 호스트에서 envoy 하위 명령을 실행하고 service 플래그로 동일한 게이트웨이 이름을 지정해야 해요.
구성 항목은 전역 범위예요. 게이트웨이 이름에 대한 구성 항목은 모든 페더레이션된 Consul 데이터센터에 적용돼요. 서로 다른 Consul 데이터센터의 터미네이팅 게이트웨이가 해당 데이터센터 내에서 서로 다른 서비스 집합으로 라우팅해야 한다면 터미네이팅 게이트웨이 반드시 서로 다른 이름으로 등록해야 해요.
터미네이팅 게이트웨이가 프록시할 서비스는 메시 밖의 서비스라도 Consul에 등록되어야 해요. 또한 터미네이팅 게이트웨이와 동일한 Consul 데이터센터에 등록되어야 해요. 그렇지 않으면 터미네이팅 게이트웨이가 서비스의 주소를 발견할 수 없어요. 이러한 서비스는 로컬 Consul 에이전트로 등록할 수 있어요. 에이전트가 없으면 다른 호스트의 클라이언트 또는 서버 에이전트로 등록 요청을 보내 카탈로그에 직접 등록할 수 있어요.
Consul 카탈로그에 등록된 모든 서비스는 해당 노드가 Consul 클라이언트 에이전트로 관리되지 않더라도 노드와 연결되어야 해요. 주소가 같은 모든 에이전트 없는 서비스는 같은 노드 이름과 주소로 등록할 수 있어요. 그러나 카탈로그에 직접 등록된 외부 서비스의 노드 이름이 어떤 Consul 클라이언트 에이전트 노드의 노드 이름과 일치하지 않도록 해요. 노드 이름이 Consul 클라이언트 에이전트의 노드 이름과 겹치면 Consul의 anti-entropy 동기화가 /catalog/register HTTP API 엔드포인트로 등록된 서비스를 삭제해요.
Service-defaults 대상(destinations)을 사용하면 메시 외부에 있고 transparent 모드에서 터미네이팅 게이트웨이를 통해 라우팅 가능한 엔드포인트를 정의할 수 있어요. 각 대상에 대해 service-defaults 구성 항목을 정의한 후 service-default 이름을 터미네이팅 게이트웨이 서비스 목록의 일부로 사용할 수 있어요. 서비스와 대상 service-defaults가 같은 이름이면 터미네이팅 게이트웨이는 서비스를 사용해요.
외부 서비스 등록에 대한 완전한 예시는 외부 서비스 튜토리얼을 검토해요.