클러스터 피어링 연결 설정
클러스터 피어링 연결 설정 (Establish Cluster Peering on VMs)
이 문서는 서로 다른 데이터센터에 배포된 서비스 간 클러스터 피어링(cluster peering) 연결을 설정하는 과정을 설명해요. 피어링 토큰 생성부터 연결 수립, 서비스 내보내기, 의도 설정까지 네 단계를 CLI·HTTP API·UI로 다루게요.
출처: 문서
본문
이 페이지는 서로 다른 데이터센터에 배포된 서비스 간 클러스터 피어링 연결을 설정하는 과정을 자세히 설명합니다. Consul의 클러스터 피어링 기능은 CLI, HTTP API, 또는 UI로 사용할 수 있습니다. 클러스터 피어링 연결을 설정하는 전체 과정은 다음 단계로 구성됩니다:
- 한 클러스터에서 피어링 토큰을 생성합니다.
- 피어링 토큰을 사용해 두 번째 클러스터와 피어링을 설정합니다.
- 클러스터 간 서비스를 내보냅니다(export).
- 피어를 위한 서비스를 승인하는 의도(intentions)를 만듭니다.
네 단계가 모두 완료될 때까지 서비스 간 클러스터 피어링을 설정할 수 없습니다. 클러스터 피어링 연결을 설정하면서 동시에 sameness 그룹을 만들려면 sameness 그룹 생성의 안내를 참조하세요.
Kubernetes에 대한 안내는 Kubernetes에서 클러스터 피어링 연결 설정을 참조하세요.
요구 사항 (Requirements)
클러스터 피어링을 사용하려면 다음 요구 사항을 충족해야 합니다:
- Consul v1.14.1 이상
- 별도 데이터센터의 어드민 파티션에 호스팅된 서비스
같은 데이터센터의 어드민 파티션에 서비스를 제공해야 한다면 클러스터 피어링을 사용하지 마세요. 대신 exported-services 구성 항목을 사용해 단일 데이터센터의 다른 어드민 파티션에 서비스 업스트림을 제공하세요.
메시 게이트웨이 요구 사항 (Mesh gateway requirements)
Consul의 기본 구성은 클러스터 간 클러스터 피어링 연결을 직접 지원합니다. 프로덕션 환경에서는 클러스터 피어링 연결이 있는 파티션 사이의 서비스 메시 트래픽을 안전하게 라우팅하기 위해 메시 게이트웨이 사용을 권장합니다.
메시 게이트웨이를 통한 클러스터 피어링을 활성화하고 메시 게이트웨이가 클러스터 피어링을 지원하도록 구성하려면 메시 게이트웨이 사양을 참조하세요.
피어링 토큰 생성 (Create a peering token)
클러스터 피어링 과정을 시작하려면 클러스터 중 하나에서 피어링 토큰을 생성합니다. 다른 클러스터가 이 토큰을 사용해 피어링 연결을 설정합니다.
피어링 토큰을 생성할 때마다 시크릿을 설정하기 위한 단회용 시크릿이 토큰에 포함됩니다. 피어링 토큰을 다시 생성하면 이전에 생성된 시크릿이 무효화되므로, 가장 최근에 만든 토큰을 사용해 피어링 연결을 설정해야 합니다.
Consul CLI
HTTP API
Consul UI
-
cluster-01에서consul peering generate-token명령으로 피어링 토큰 요청을 발행합니다.$ consul peering generate-token -name cluster-02CLI는 토큰 세부 정보가 포함된 base64 인코딩 문자열인 피어링 토큰을 출력합니다.
-
이 값을 파일이나 클립보드에 저장해 다음 단계에서
cluster-02에서 사용합니다. -
cluster-01에서/peering/token엔드포인트로 피어링 토큰 요청을 발행합니다.$ curl --request POST --data '{"Peer":"cluster-02"}' --url http://localhost:8500/v1/peering/tokenCLI는 토큰 세부 정보가 포함된 base64 인코딩 문자열인 피어링 토큰을 출력합니다.
-
첫 번째 클러스터의 이름과 피어링 토큰이 포함된 JSON 파일을 만듭니다.
peering_token.json:{ "Peer": "cluster-01", "PeeringToken": "eyJhbG...yjb8" }
클러스터 피어링 과정을 시작하려면 클러스터 중 하나에서 피어링 토큰을 생성합니다. 다른 클러스터가 이 토큰을 사용해 피어링 연결을 설정합니다.
피어링 토큰을 생성할 때마다 시크릿을 설정하기 위한 단회용 시크릿이 토큰에 포함됩니다. 피어링 토큰을 다시 생성하면 이전에 생성된 시크릿이 무효화되므로, 가장 최근에 만든 토큰을 사용해 피어링 연결을 설정해야 합니다.
cluster-01과 연결된 데이터센터의 Consul UI에서 Peers를 클릭합니다.- Add peer connection을 클릭합니다.
- Generate token 탭의 Name of peer 필드에
cluster-02를 입력합니다. - Generate token 버튼을 클릭합니다.
- 계속하기 전에 토큰을 복사합니다. 이 화면을 떠나면 토큰을 다시 볼 수 없습니다. 토큰을 잃어버리면 새 토큰을 생성해야 합니다.
클러스터 간 연결 수립 (Establish a connection between clusters)
다음으로 피어링 토큰을 사용해 클러스터 간 보안 연결을 설정합니다.
Consul CLI
HTTP API
Consul UI
-
"cluster-02"에 배포된 클라이언트 에이전트 중 하나에서
consul peering establish명령을 실행하고 이전 단계에서 생성한 토큰을 지정합니다.$ consul peering establish -name cluster-01 -peering-token token-from-generate "Successfully established peering connection with cluster-01"서버 에이전트를 클러스터 피어링으로 연결하면 기본 파티션들을 피어링합니다. 서버 에이전트를 통해 다른 파티션의 피어링 연결을 설정하려면
establish명령에-partition플래그를 추가하고 피어링할 파티션을 지정해야 합니다. 추가 구성 정보는consul peering establish명령을 참조하세요.피어링 토큰당
peering establish명령을 한 번 실행할 수 있습니다. 피어링 토큰은 연결을 설정하는 데 사용된 후에는 재사용할 수 없습니다. 연결을 다시 설정해야 한다면 새 피어링 토큰을 생성해야 합니다. -
"cluster-02"의 클라이언트 에이전트 중 하나에서
peering_token.json과/peering/establish엔드포인트를 사용해 피어링 연결을 설정합니다. 이 엔드포인트는 오류가 없으면 출력을 생성하지 않습니다.$ curl --request POST --data @peering_token.json http://127.0.0.1:8500/v1/peering/establish서버 에이전트를 클러스터 피어링으로 연결하면 기본 동작은
default파티션으로 피어링하는 것입니다. 서버 에이전트를 통해 다른 파티션의 피어링 연결을 설정하려면peering_token.json에Partition필드를 추가하고 피어링할 파티션을 지정해야 합니다. 추가 구성 정보는 클러스터 피어링 - HTTP API를 참조하세요.피어링 토큰당
peering/establish엔드포인트를 한 번 dial할 수 있습니다. 피어링 토큰은 연결을 설정하는 데 사용된 후에는 재사용할 수 없습니다. 연결을 다시 설정해야 한다면 새 피어링 토큰을 생성해야 합니다. -
cluster 02와 연결된 데이터센터의 Consul UI에서 Peers를 클릭한 다음 Add peer connection을 클릭합니다. -
Establish peering을 클릭합니다.
-
Name of peer 필드에
cluster-01을 입력합니다. 그런 다음 Token 필드에 피어링 토큰을 붙여넣습니다. -
Add peer를 클릭합니다.
클러스터 간 서비스 내보내기 (Export services between clusters)
클러스터 간 연결을 설정한 후에는 다른 클러스터에서 사용할 수 있는 서비스를 정의하는 exported-services 구성 항목을 만들어야 합니다. Consul은 이 구성 항목을 사용해 서비스 정보를 광고하고 클러스터 간 서비스 메시 연결을 지원합니다.
exported-services 구성 항목은 서비스를 다른 어드민 파티션에 제공합니다. 로컬 또는 원격 어드민 파티션을 모두 대상으로 할 수 있습니다. 클러스터 피어는 항상 서비스를 원격 파티션으로 내보냅니다. 자세한 내용은 내보내진 서비스 소비자를 참조하세요.
이 단계를 완료하려면 Consul CLI를 사용해야 합니다. HTTP API와 Consul UI는 exported-services 구성 항목을 지원하지 않습니다.
Consul CLI
-
구성 항목을 만들고
Kind를"exported-services"로 지정합니다.peering-config.hcl:Kind = "exported-services" Name = "default" Services = [ { ## The name and namespace of the service to export. Name = "service-name" Namespace = "default" ## The list of peer clusters to export the service to. Consumers = [ { ## The peer name to reference in config is the one set ## during the peering process. Peer = "cluster-02" } ] } ] -
구성 항목을 클러스터에 추가합니다.
$ consul config write peering-config.hcl
계속하기 전에 클러스터가 동기화되어 서비스를 피어에 제공할 때까지 기다리세요. 피어링된 클러스터의 상태를 확인하려면 클러스터 피어링 연결 읽기를 참조하세요.
피어를 위한 서비스 승인 (Authorize services for peers)
피어링된 클러스터에서 서비스를 호출하려면 먼저 해당 클러스터가 특정 서비스를 사용하도록 승인하는 서비스 의도를 설정해야 합니다. Consul은 승인되지 않은 클러스터로의 서비스 내보내기를 방지합니다.
이 단계를 완료하려면 HTTP API 또는 Consul CLI를 사용해야 합니다. Consul UI는 로컬 클러스터에 대한 의도만 지원합니다.
Consul CLI
HTTP API
-
구성 항목을 만들고
Kind를"service-intentions"로 지정합니다. "cluster-01"의 서비스에 접근할 수 있는 "cluster-02"의 서비스를 선언합니다. 다음 예제에서 서비스 의도 구성 항목은 원격 피어cluster-02에 호스팅된frontend-service가backend-service와 통신하도록 승인합니다:peering-intentions.hcl:Kind = "service-intentions" Name = "backend-service" Sources = [ { Name = "frontend-service" Peer = "cluster-02" Action = "allow" } ]Peer에 피어 이름이 지정되지 않으면 Consul은 서비스가 로컬 클러스터에 있다고 가정합니다. -
구성 항목을 클러스터에 추가합니다.
$ consul config write peering-intentions.hcl -
구성 항목을 만들고
Kind를"service-intentions"로 지정합니다. "cluster-01"의 서비스에 접근할 수 있는 "cluster-02"의 서비스를 선언합니다. 다음 예제에서 서비스 의도 구성 항목은 원격 피어cluster-02에 호스팅된frontend-service가backend-service와 통신하도록 승인합니다:peering-intentions.hcl:Kind = "service-intentions" Name = "backend-service" Sources = [ { Name = "frontend-service" Peer = "cluster-02" Action = "allow" } ]Peer에 피어 이름이 지정되지 않으면 Consul은 서비스가 로컬 클러스터에 있다고 가정합니다. -
구성 항목을 클러스터에 추가합니다.
$ curl --request PUT --data @peering-intentions.hcl http://127.0.0.1:8500/v1/config
ACL로 서비스 읽기 승인 (Authorize service reads with ACLs)
Consul 클러스터에 ACL이 활성화되어 있다면 내보내진 서비스를 업스트림으로 접근하는 사이드카 프록시는 읽기 접근 권한을 부여하는 ACL 토큰을 가지고 있어야 합니다.
가져온(imported) 모든 서비스에 대한 읽기 접근은 ACL 토큰과 연결된 다음 규칙 중 하나로 부여됩니다:
- 사이드카의 파티션에 있는 모든 서비스에 대한
service:write권한 - 사이드카의 네임스페이스와 파티션에 있는 모든 서비스·노드에 대한
service:read및node:read권한
Consul Enterprise의 경우 이 권한은 서비스 파티션의 모든 가져온 서비스에 적용됩니다. 서비스 아이덴티티를 사용하면 이 권한이 충족됩니다.
예제 규칙은 exported-services 구성 항목 문서의 서비스 읽기를 참조하세요.
ACL 구성·사용에 대한 추가 정보는 ACL 시스템 개요를 참조하세요.