디스커버리 체인
디스커버리 체인 (Discovery Chain)
서비스 디스커버리 프로세스를 "디스커버리 체인(discovery chain)"으로 모델링한 저수준 API의 개념과 컴파일 결과를 설명하는 문서예요. 서비스 메시 프록시 통합을 개발하는 개발자에게 주로 유용해요.
출처: 문서
본문
참고 이 주제는 주로 외부 Consul 서비스 메시 프록시 통합을 개발하는 개발자를 대상으로 한 저수준 API의 일부예요.
서비스 디스커버리 프로세스는 라우팅(routing), 분할(splitting), 해석(resolution)의 세 가지 뚜렷한 단계를 통과하는 "디스커버리 체인"으로 모델링할 수 있어요. 각 단계는 일련의 구성 항목에 의해 제어돼요. 디스커버리 체인의 서로 다른 단계를 구성함으로써 사용자는 프록시 업스트림이 로드 밸런싱을 위해 궁극적으로 특정 인스턴스로 해석되는 방식을 제어할 수 있어요.
참고 디스커버리 체인은 현재 서비스 메시 프록시 업스트림을 발견하는 데만 사용돼요.
구성 (Configuration)
디스커버리 체인에 사용되는 구성 항목은 좁게 조정된 변경을 위해 읽고 수정하기 쉽도록 설계되었지만, 디스커버리 시점에는 다양한 구성 항목이 더 복잡한 방식으로 상호 작용해요. 예를 들어:
- 서비스 리다이렉트가 정의된
service-resolver가 생성되면 다른 구성 항목에서 원래 서비스에 대한 모든 참조가 리다이렉트 대상으로 대체돼요. - 기본 하위 집합(default subset)이 정의된
service-resolver가 생성되면 다른 구성 항목에서 하위 집합을 지정하지 않은 원래 서비스에 대한 모든 참조가 기본값으로 대체돼요. - 서비스 분할이 있고 대상 서비스가 자체
service-splitter를 가진service-splitter가 생성되면 전체 효과가 평평해지고(flattened) 궁극적으로 단일 집계 트래픽 분할만 프록시에 구성돼요. service-resolver리다이렉트 루프는 유효하지 않은 것으로 거부되어야 해요.service-router및service-splitter구성 항목은service-defaults또는proxy-defaults구성 항목을 통해 서비스에 L7 호환 프로토콜이 설정되어 있어야 해요. 위반은 유효하지 않은 것으로 거부되어야 해요.- 업스트림 구성
datacenter매개변수가 정의되면 원하는 데이터센터를 명시적으로 참조하지 않는 모든 구성 항목은 업스트림에 정의된 값을 사용해요.
컴파일 (Compilation)
구성 항목 모음을 유효한 디스커버리 체인으로 올바르게 해석하기 위해, 먼저 이를 서비스 메시 사이드카 프록시 구성 담당 계층이 더 직접 사용할 수 있는 형태로 컴파일해요.
디스커버리 체인 API를 사용해 컴파일러와 직접 상호 작용할 수 있어요.
컴파일 매개변수 (Compilation Parameters)
- 서비스 이름 (Service Name) - 이름으로 발견되는 서비스.
- 데이터센터 (Datacenter) - 컴파일의 기반으로 사용할 데이터센터.
- 재정의 (Overrides) - 컴파일 시 적용할 디스커버리 시점 수정. 이는 proxy 또는 upstream 구성에서 파생되어야 해요(둘 중 하나라도 설정된 경우).
컴파일 결과 (Compilation Results)
응답은 단일로 감싸진 CompiledDiscoveryChain 필드예요:
{
"Chain": {...<CompiledDiscoveryChain>...}
}
CompiledDiscoveryChain
체인은 노드(node)와 대상(target)의 디그래프(digraph)를 인코딩해요. 노드는 다양한 디스커버리 체인 단계의 컴파일된 표현이고, 대상은 health API를 사용해 관련 서비스 인스턴스 목록을 검색하는 방법에 대한 지침이에요.
StartNode에서 시작해 노드를 순회해야 해요. 노드는 Nodes 필드를 사용해 이름으로 해석할 수 있어요. 대상은 Targets 필드를 사용해 이름으로 해석할 수 있어요.
ServiceName(string)- 요청된 서비스.Partition(string)- 요청된 파티션.Namespace(string)- 요청된 네임스페이스.Datacenter(string)- 요청된 데이터센터.CustomizationHash(string: <optional>)- 디스커버리 체인의 컴파일에 영향을 준 모든 재정의의 고유 해시. 설정된 경우 이 값을 사용해 커스터마이즈된 것과 그렇지 않은 로드 밸런서 데이터플레인 객체를 구분하기 위해 생성된 객체에 접두사/접미사를 붙여야 해요.Default(bool: <optional>)- 이 디스커버리 체인이 어떤service-resolver,service-splitter,service-router구성 항목에도 기반하지 않는지 나타내요.Protocol(string)- 체인의 모든 것이 공유하는 전체 프로토콜.ServiceMeta(map<string|string>)-ServiceName이라는 서비스에 대한 기본service-defaults구성 항목의 메타데이터.StartNode(string)- 디스커버리 체인을 순회할 때 따라야 하는Nodes맵의 첫 번째 키.Nodes(map<string|DiscoveryGraphNode>)- 고유 이름으로 키가 지정된 체인에서 순회 가능한 모든 노드.StartNode로 시작해 이것을 걸을 수 있어요. 이름은 불투명(opaque) 값으로 취급해야 하며 단일 컴파일 내에서만 일관성이 보장돼요.Targets(map<string|DiscoveryTarget>)- 이 체인에 사용된 모든 대상의 목록. 이름은 불투명 값으로 취급해야 하며 단일 컴파일 내에서만 일관성이 보장돼요.
DiscoveryGraphNode
컴파일된 디스커버리 체인의 단일 노드.
Type(string)- 노드의 유형. 유효한 값은router,splitter,resolver예요.Name(string)- 노드의 고유 이름.Routes(array<DiscoveryRoute>)-Type:router에만 설정. 렌더링할 경로 목록.Definition(ServiceRoute)- 기본service-routerroute의 관련 부분.NextNode(string)-Nodes에서 체인의 다음 노드 이름.
Splits(array<DiscoverySplit>)-Type:splitter에만 설정. 트래픽 분할 목록.Resolver(DiscoveryResolver: <optional>)-Type:resolver에만 설정. 서비스 인스턴스를 해석하는 방법.Default(bool)- 이 노드에 대해service-resolver구성 항목이 정의되지 않았고 기본값이 합성된 경우 true로 설정.ConnectTimeout(duration)- 기본service-resolverConnectTimeout필드의 복사본. 정의되지 않으면 기본값5s가 반환돼요.Target(string)-Targets에서 찾을 사용 대상의 이름.Failover(DiscoveryFailover: <optional>)- 이 요청에 사용할 기본service-resolverFailover정의의 컴파일된 형태.LoadBalancer(LoadBalancer: <optional>)- 기본service-resolverLoadBalancer필드의 복사본.service-splitter가 서로 다른LoadBalancer구성을 가진 서비스 간에 분할하면 첫 번째 해시 기반 로드 밸런싱 정책이 복사돼요.
DiscoveryTarget
ID(string)- 이 대상의 고유 이름.Service(string)- 서비스 인스턴스 목록을 해석할 때 쿼리할 서비스.ServiceSubset(string: <optional>)- 해석할 서비스의 subset.Partition(string)- 서비스 인스턴스 목록을 해석할 때 사용할 파티션.Namespace(string)- 서비스 인스턴스 목록을 해석할 때 사용할 네임스페이스.Datacenter(string)- 서비스 인스턴스 목록을 해석할 때 사용할 데이터센터.Subset(ServiceResolverSubset)- 이 대상에 대한 기본service-resolverSubsets정의의 복사본.Filter(string: "")- 요청된 서비스의 인스턴스를 선택하는 데 사용할 필터 표현식. 비어 있으면 모든 정상 인스턴스가 반환돼요.OnlyPassing(bool: false)- 리졸버의 헬스 체크 해석 동작을 지정해요. false로 설정하면 passing 및 warning 상태의 체크가 있는 인스턴스가 정상으로 간주돼요. true로 설정하면 passing 상태의 체크가 있는 인스턴스만 정상으로 간주돼요.
MeshGateway(MeshGatewayConfig)- 이 대상의 서비스 인스턴스에 연결할 때 사용할 메시 게이트웨이 구성.Mode(string: "")-none,local,remote중 하나.
External(bool: false)- 이 대상이 이 Consul 클러스터 외부에 있으면 true.ConnectTimeout(duration)- 기본service-resolverConnectTimeout필드의 복사본. 정의되지 않으면 기본값5s가 반환돼요.SNI(string)- TLS로 이 엔드포인트 집합에 연결할 때 SNI 값으로 사용해야 하는 값.Name(string)- 로드 밸런서 객체를 생성할 때 사용할 이 대상의 고유 이름. 이 구조는 SNI와 비슷하지만ExternalSNI같은 SNI 커스터마이징의 영향을 받지 않아요.