VM에서 WAN 페더레이션

VM에서 WAN 페더레이션 (WAN Federation on VMs)

단일 WAN gossip 풀을 사용해 Consul 데이터센터를 페더레이션하는 방법을 설명하는 문서예요. VM 두 곳의 데이터센터 간 기본적인 페더레이션을 구성하는 명령을 다뤄요.

출처: 문서

본문

이 주제는 단일 WAN gossip 풀을 사용해 Consul 데이터센터를 페더레이션하는 방법을 다뤄요.

Consul Enterprise 버전 0.8.0은 고급 멀티 데이터센터 기능에 대한 지원을 추가했어요. 자세한 내용은 네트워크 영역(network areas)으로 여러 데이터센터 페더레이션 문서를 참고하세요.

WAN gossip 풀 (WAN gossip pool)

Consul의 핵심 기능 중 하나는 여러 데이터센터를 지원한다는 점이에요. Consul의 아키텍처는 데이터센터의 낮은 결합도를 촉진하도록 설계되어, 연결 문제나 어떤 데이터센터의 장애가 다른 데이터센터의 Consul 가용성에 영향을 주지 않아요. 즉 각 데이터센터는 독립적으로 실행되며, 각각 전용 서버 그룹과 사설 LAN gossip 풀을 가져요.

네트워크 요구 사항 (Network requirements)

WAN 페더레이션이 동작하려면 몇 가지 네트워킹 요구 사항이 충족되어야 해요.

  • 모든 서버 노드는 서로 통신할 수 있어야 해요. 그렇지 않으면 gossip 프로토콜과 RPC 전달이 동작하지 않아요.
  • 데이터센터 간 서비스 디스커버리를 사용해야 한다면 네트워크가 리전 간 IP 주소 사이에서 트래픽을 라우팅할 수 있어야 해요. 일반적으로 이는 모든 데이터센터가 VPN이나 기타 터널링 메커니즘으로 연결되어야 한다는 뜻이에요. Consul은 사용자를 대신해 VPN이나 NAT 트래버설을 처리하지 않아요. RPC 전달이 동작하려면 bind 주소가 원격 노드에서 접근 가능해야 해요.

두 데이터센터 설정 (Setup two datacenters)

시작하려면 배포 가이드를 따라 각 데이터센터를 시작해요. ACL이 활성화되었거나 Consul Enterprise를 사용한다면 두 데이터센터 모두 서버 구성에 primary_datacenter를 설정해야 해요.

부트스트래핑 후에는 dc1과 dc2 두 개의 데이터센터가 있어야 해요. 데이터센터 이름은 Consul에서 불투명(opaque)하다는 점을 참고하세요. 이는 인간 운영자가 Consul 데이터센터를 이해하는 데 도움이 되는 레이블일 뿐이에요.

알려진 WAN 노드를 쿼리하려면 어느 데이터센터에서든 -wan 매개변수와 함께 members 명령을 사용해요.

데이터센터 1

$ consul members -wan
Node                 Address          Status  Type    Build   Protocol  DC   Partition  Segment
consul-server-0.dc1  172.18.0.5:8302  alive   server  1.20.2  2         dc1  default    <all>

데이터센터 2

$ consul members -wan
Node                 Address          Status  Type    Build   Protocol  DC   Partition  Segment
consul-server-1.dc2  172.18.0.7:8302  alive   server  1.20.2  2         dc2  default    <all>

이 명령은 WAN gossip 풀의 모든 알려진 멤버 목록을 제공해요. 이 경우 서버가 아직 연결되지 않았으므로 각 데이터센터는 로컬 서버만 알고 있어요.

참고 팁

consul members -wan 명령은 서버 노드만 포함해요. 클라이언트 노드는 로컬 데이터센터 서버에 요청을 보내므로 WAN gossip에 참여하지 않아요. 로컬 서버는 필요에 따라 클라이언트 요청을 대상 데이터센터의 서버로 전달해요.

서버를 수동으로 조인 (Join the servers manually)

두 데이터센터를 페더레이션하려면 join 명령을 사용해요.

$ consul join -wan <server 1> <server 2> ...

join 명령은 WAN gossip 풀의 서버에 조인을 시도하고 있음을 나타내기 위해 -wan 플래그와 함께 사용돼요. LAN gossip과 마찬가지로 기존 멤버 하나에만 조인하면 돼요. Consul은 gossip 프로토콜을 사용해 모든 알려진 멤버에 대한 정보를 교환할 거예요.

예시 (Example)

이 예시는 dc1의 consul-server-0과 dc2의 consul-server-1 두 서버 노드를 사용해요. dc1을 dc2에 연결하려면 첫 번째 서버에서 다음 명령을 실행해요.

$ consul join -wan consul-server-1
Successfully joined cluster by contacting 1 nodes.

조인 절차 동안 Consul은 각 서버 로그에 다음 줄을 기록해요.

데이터센터 1

##...
[INFO]  agent: (WAN) joining: wan_addresses=["consul-server-1"]
[DEBUG] agent.server.memberlist.wan: memberlist: Initiating push/pull sync with:  172.18.0.7:8302
[INFO]  agent.server.serf.wan: serf: EventMemberJoin: consul-server-1.dc2 172.18.0.7
[INFO]  agent: (WAN) joined: number_of_nodes=1
[DEBUG] agent.http: Request finished: method=PUT url=/v1/agent/join/consul-server-1?wan=1 from=127.0.0.1:59484 latency=1.282667ms
[DEBUG] agent: warning: request content-type is not supported: request-path=/v1/agent/join/consul-server-1?wan=1
[DEBUG] agent: warning: response content-type header not explicitly set.: request-path=/v1/agent/join/consul-server-1?wan=1
[INFO]  agent.server: Handled event for server in area: event=member-join server=consul-server-1.dc2 area=wan
[DEBUG] agent.server.serf.wan: serf: messageJoinType: consul-server-0.dc1
[DEBUG] agent.server.memberlist.wan: memberlist: Stream connection from=172.18.0.7:44500
[DEBUG] agent.server.serf.wan: serf: messageJoinType: consul-server-0.dc1
[DEBUG] agent.server.serf.wan: serf: messageJoinType: consul-server-0.dc1
[DEBUG] agent.server.serf.wan: serf: messageJoinType: consul-server-0.dc1
[DEBUG] agent.server.memberlist.wan: memberlist: Initiating push/pull sync with: consul-server-1.dc2 172.18.0.7:8302
##...

데이터센터 2

##...
[INFO]  agent.server.serf.wan: serf: EventMemberJoin: consul-server-0.dc1 172.18.0.5
[INFO]  agent.server: Handled event for server in area: event=member-join server=consul-server-0.dc1 area=wan
[DEBUG] agent.server.serf.wan: serf: messageJoinType: consul-server-0.dc1
[DEBUG] agent.server.memberlist.wan: memberlist: Initiating push/pull sync with: consul-server-0.dc1 172.18.0.5:8302
[DEBUG] agent.server.serf.wan: serf: messageJoinType: consul-server-0.dc1
##...

시작 시 서버 조인 (Join the servers at startup)

프로덕션 환경에서는 Consul의 구성 파일에 WAN 페더레이션을 설정할 것을 권장해요. 이렇게 하면 Consul이 시작 시 즉시 구성을 적용하고 재부팅을 거쳐도 지속돼요. Consul은 시작 시 WAN 조인할 다른 서버의 주소를 구성하기 위해 retry_join_wan 매개변수를 제공해요.

HCL

retry_join_wan = ["dc2-server-1", "dc2-server-2"]

JSON

{
  "retry_join_wan": ["dc2-server-1", "dc2-server-2"]
}

데이터센터 구성 확인 (Verify datacenter configuration)

조인이 완료되면 Consul은 WAN gossip 풀에 두 데이터센터의 서버를 표시할 거예요.

CLI

members 명령을 사용해 모든 서버 노드가 WAN으로 gossip하고 있는지 확인해요.

$ consul members -wan
Node                 Address          Status  Type    Build   Protocol  DC   Partition  Segment
consul-server-0.dc1  172.18.0.5:8302  alive   server  1.20.2  2         dc1  default    <all>
consul-server-1.dc2  172.18.0.7:8302  alive   server  1.20.2  2         dc2  default    <all>

API

HTTP 카탈로그 API를 사용해 알려진 모든 데이터센터 목록을 가져와요.

$ curl http://localhost:8500/v1/catalog/datacenters

이 예시에서 Consul이 아는 두 데이터센터는 dc1과 dc2예요.

[
  "dc2",
  "dc1"
]

dc 선택자를 사용해 다른 데이터센터의 서버에 대한 정보를 가져올 수 있어요.

$ curl http://localhost:8500/v1/catalog/nodes?dc=dc2

그러면 dc2 데이터센터의 모든 알려진 노드가 반환돼요.

[
  {
    "ID": "a3727eaa-da9d-8dda-07ff-97b7b451415d",
    "Node": "consul-server-1",
    "Address": "172.18.0.7",
    "Datacenter": "dc2",
    "TaggedAddresses": {
      "lan": "172.18.0.7",
      "lan_ipv4": "172.18.0.7",
      "wan": "172.18.0.7",
      "wan_ipv4": "172.18.0.7"
    },
    "Meta": {
      "consul-network-segment": "",
      "consul-version": "1.20.2"
    },
    "CreateIndex": 13,
    "ModifyIndex": 15
  }
]

UI

페더레이션된 데이터센터는 UI에 드롭다운을 표시해 서비스와 노드를 표시할 데이터센터를 선택할 수 있게 해요.

WAN 페더레이션 문제 해결 (Troubleshooting WAN federation)

serf_wan, advertise_addr_wan, translate_wan_addrs를 구성하면 consul members -wan이 원격 노드를 나열하지만 RPC 작업이 다음 오류 중 하나로 실패하는 상황이 발생할 수 있어요:

이 오류의 가장 가능성 높은 원인은 bind_addr가 사설 주소로 설정되어 RPC 서버가 WAN을 통해 연결을 수락하지 못하는 것이에요. bind_addr를 공용 주소(또는 WAN을 통해 라우팅할 수 있는 주소)로 설정하면 이 문제가 해결돼요. RPC 서버를 공용 포트에 노출하는 것은 방화벽 규칙이 수립된 후에만 수행해야 한다는 점을 유의하세요.

translate_wan_addrs 구성은 기본적인 주소 재작성 기능을 제공해요.

데이터 복제 (Data replication)

일반적으로 서로 다른 Consul 데이터센터 간에는 데이터가 복제되지 않아요. 다른 데이터센터의 리소스에 대한 요청이 발생하면 로컬 Consul 서버는 해당 리소스에 대한 RPC 요청을 원격 Consul 서버로 전달하고 결과를 반환해요. 원격 데이터센터를 사용할 수 없다면 해당 리소스도 사용할 수 없게 돼요. 하지만 이는 로컬 데이터센터에 다른 방식으로는 영향을 주지 않아요.

제한된 데이터 하위 집합이 복제될 수 있는 특수 상황이 몇 가지 있는데, 예를 들어 Consul의 내장 ACL 복제 기능이나 consul-replicate 같은 외부 도구가 그렇지요.

다음 단계 (Next steps)

이 주제는 두 VM 데이터센터 간에 WAN gossip을 설정해 기본적인 페더레이션을 만드는 데 필요한 명령을 제공해요.

ACL로 Consul 데이터센터를 보호하려면 WAN 페더레이션 데이터센터에서 ACL 활성화를 참고하세요.

두 Kubernetes 클러스터 간에 페더레이션을 설정하는 방법은 메시 게이트웨이를 통한 여러 Kubernetes 클러스터 간 WAN 페더레이션을 참고하세요.

Consul은 다른 플랫폼에서 실행되는 데이터센터를 페더레이션할 수 있어요. Kubernetes 클러스터를 VM 기반 Consul 데이터센터와 페더레이션하는 방법은 메시 게이트웨이를 통한 VM과 Kubernetes 간 WAN 페더레이션을 참고하세요.

더 알아보기 (Learn more)