네트워크 영역으로 여러 데이터센터 페더레이션
네트워크 영역으로 여러 데이터센터 페더레이션 (Federate multiple datacenters with network areas)
이 주제에서는 Consul Enterprise 네트워크 영역(network area) 기능을 사용하여 Consul 데이터센터를 페더레이션하는 방법을 다루고 있어요. Consul 커뮤니티 에디션 데이터센터를 페더레이션하는 방법은 WAN federation 문서를 참조하세요.
출처: 문서
본문
이 주제에서는 Consul Enterprise 네트워크 영역 기능을 사용하여 Consul 데이터센터를 페더레이션하는 방법을 다룹니다. Consul 커뮤니티 에디션 데이터센터를 페더레이션하는 방법은 WAN federation 문서를 참조하세요.
Enterprise Only
여기에 문서화된 네트워크 영역 기능은 Consul Enterprise가 필요합니다. Consul Enterprise를 구매했거나 사용해 보고 싶다면 how to access Consul Enterprise를 참조하세요.
네트워크 영역 소개 (Network areas introduction)
Consul의 핵심 기능 중 하나는 여러 데이터센터를 지원한다는 것입니다. Consul의 아키텍처는 데이터센터의 낮은 결합을 촉진하도록 설계되어, 연결 문제나 데이터센터 실패가 다른 데이터센터의 Consul 가용성에 영향을 미치지 않습니다. 즉 각 데이터센터는 독립적으로 실행되며 각각 전용 서버 그룹과 프라이빗 LAN gossip 풀을 갖습니다.
네트워크 영역은 한 쌍의 Consul 데이터센터 간의 관계를 지정합니다. 운영자는 관계의 양쪽에 상호 영역을 만들고 함께 조인하므로, 일부 피어 영역이 서로 연락할 수 없더라도 주어진 Consul 데이터센터가 여러 영역에 참여할 수 있습니다. 이를 통해 허브/스포크 또는 더 일반적인 트리 구조와 같은 Consul 데이터센터 간의 더 유연한 관계가 가능합니다.
팁 (Tip)
현재 Consul은 영역을 통해 바로 인접한 데이터센터로만 RPC 요청을 라우팅하지만, 향후 Consul 버전에서 라우팅 지원이 추가될 수 있습니다.
네트워크 영역 페더레이션 vs. WAN 페더레이션 (Network areas federation vs. WAN federation)
Consul의 WAN 페더레이션은 모든 데이터센터의 모든 Consul 서버가 서버 RPC(8300/tcp)와 Serf WAN(8302/tcp 및 8302/udp)을 통해 완전한 연결을 갖는 데 의존합니다. 이 설정을 보호하려면 TLS와 gossip 키링 관리가 필요합니다. 대규모 Consul 배포에서는 모든 Consul 서버 간의 완전한 연결을 지원하고 키링을 관리하는 것이 까다로워집니다.
네트워크 영역을 사용하면 Consul 데이터센터 간의 관계를 지정할 수 있습니다. 각 데이터센터에 네트워크 영역을 만들고 함께 조인할 수 있으므로, 일부 피어 영역이 서로 연락할 수 없더라도 주어진 Consul 데이터센터가 여러 영역에 참여할 수 있습니다. 이를 통해 허브/스포크 또는 더 일반적인 트리 구조와 같은 Consul 데이터센터 간의 더 유연한 관계가 가능합니다.
Consul은 서버 RPC(8300/tcp)를 통해 네트워크 영역 간에 트래픽을 라우팅하므로 TLS만으로 보호할 수 있습니다. 또한 네트워크 영역은 모든 데이터센터의 모든 서버 간 전체 연결이 필요하지 않고, 페더레이션되는 두 데이터센터의 서버 간에만 연결이 필요합니다.
아키텍처 레이아웃이 모든 데이터센터의 모든 Consul 서버 간 연결을 허용하지 않거나, 한 데이터센터의 데이터가 하나 또는 몇 개의 다른 데이터센터에서만 액세스 가능하면 되는 경우 네트워크 영역을 권장합니다.
Consul의 WAN 페더레이션 및 WAN gossip 풀과 함께 네트워크 영역을 사용할 수 있습니다. 이렇게 하면 두 페더레이션 솔루션 간에 원활하게 마이그레이션할 수 있습니다. WAN gossip 풀과 네트워크 영역을 통해 동시에 피어 데이터센터를 연결할 수 있습니다. 두 페더레이션 솔루션 중 하나에서 서버를 사용할 수 있으면 Consul은 RPC 요청을 전달합니다.
완화된 연결 제약으로 인해 일부 Consul 기능은 네트워크 영역과 완전히 호환되지 않을 수 있습니다. ACL replication을 설정하거나 CA 복제로 Consul 서비스 메시를 활성화하려면 WAN gossip 페더레이션을 사용하여 Consul의 모든 최신 기능을 활용하는 것을 권장합니다.
네트워크 요구 사항 (Network requirements)
네트워크 영역이 작동하려면 충족해야 할 몇 가지 네트워킹 요구 사항이 있습니다.
- 페더레이션되는 두 영역의 모든 서버 노드는 서버 RPC 포트(
8300/tcp)를 통해 서로 통신할 수 있어야 합니다. - 데이터센터 간에 서비스 검색을 사용하려면 네트워크가 지역 간 IP 주소 사이에서도 트래픽을 라우팅할 수 있어야 합니다.
일반적으로 모든 데이터센터가 VPN 또는 다른 터널링 메커니즘으로 연결되어야 함을 의미합니다. Consul은 VPN이나 NAT 통과를 처리하지 않습니다. RPC 전달이 작동하려면 바인드 주소가 원격 노드에서 액세스 가능해야 합니다.
고급 페더레이션 구성 (Configure advanced federation)
시작하려면 Deployment Guide를 따라 각 데이터센터를 시작하세요. 부트스트랩 후 두 개의 데이터센터(dc1과 dc2)가 있어야 합니다. 데이터센터 이름은 Consul에 불투명합니다. 이는 인간 운영자가 Consul 데이터센터에 대해 추론하는 데 도움이 되는 라벨일 뿐입니다.
각 데이터센터에 네트워크 영역을 만드세요.
CLI:
consul operator area create 명령을 사용하여 네트워크 영역을 만듭니다.
dc2를 피어 데이터센터로 나열하여 dc1 데이터센터에서 네트워크 영역을 만듭니다.
server.dc1
$ consul operator area create -peer-datacenter=dc2
Created area "1c8cd5e6-562c-e0de-e369-a13c6205ffe8" with peer datacenter "dc2"!
dc1을 피어 데이터센터로 나열하여 dc2 데이터센터에서 네트워크 영역을 만듭니다.
server.dc2
$ consul operator area create -peer-datacenter=dc1
Created area "5bcb95db-5ae8-5265-3dfa-b2cb3452b093" with peer datacenter "dc1"!
API:
/operator/area 엔드포인트를 사용하여 네트워크 영역을 만듭니다.
dc2를 피어 데이터센터로 사용하여 데이터센터 dc1의 서버에서 네트워크 영역을 만듭니다.
server.dc1
$ curl -i -s --request POST \
-H "Content-Type: application/json" \
--data '{ "PeerDatacenter": "dc2" }' \
http://localhost:8500/v1/operator/area
만들어진 영역의 ID가 출력됩니다.
{
"ID":"1c8cd5e6-562c-e0de-e369-a13c6205ffe8"
}
dc1을 피어 데이터센터로 사용하여 데이터센터 dc2의 서버에서 네트워크 영역을 만듭니다.
server.dc2
$ curl -i -s --request POST \
-H "Content-Type: application/json" \
--data '{ "PeerDatacenter": "dc1" }' \
http://localhost:8500/v1/operator/area
만들어진 영역의 ID가 출력됩니다.
{
"ID":"5bcb95db-5ae8-5265-3dfa-b2cb3452b093"
}
이제 영역 구성원을 조회할 수 있습니다.
CLI:
consul operator area members 명령을 사용하여 네트워크 영역에 있는 Consul 서버 노드를 표시합니다.
server.dc1
$ consul operator area members
Area Node Address Status Build Protocol DC RTT
1c8cd5e6-562c-e0de-e369-a13c6205ffe8 consul-server-0.dc1 172.18.0.5:8300 alive 1.20.5+ent 2 dc1 0s
서버가 네트워크 영역에 조인할 때까지 명령은 로컬 서버만 표시합니다.
API:
/operator/area/:uuid/members을 사용하여 네트워크 영역 구성원을 나열합니다.
server.dc1
$ curl -s http://127.0.0.1:8500/v1/operator/area/1c8cd5e6-562c-e0de-e369-a13c6205ffe8/members
서버가 네트워크 영역에 조인할 때까지 쿼리는 로컬 서버만 표시합니다.
[
{
"ID": "6e4910c1-0259-f737-1ae9-8807b2816d0b",
"Name": "consul-server-0.dc1",
"Addr": "172.18.0.5",
"Port": 8300,
"Datacenter": "dc1",
"Role": "server",
"Build": "1.20.5+ent",
"Protocol": 2,
"Status": "alive",
"RTT": 0
}
]
서버 조인 (Join servers)
Consul은 영역이 만들어진 데이터센터 내의 모든 서버가 LAN 정보를 사용하여 영역에 조인되도록 자동으로 보장합니다. 영역을 완료하려면 다른 데이터센터의 Consul 서버와 하나 이상 조인해야 합니다:
CLI:
consul operator area join 명령을 사용하여 dc2의 Consul 서버를 네트워크 영역에 조인합니다.
server.dc1
$ consul operator area join -peer-datacenter=dc2 172.18.0.3
Address Joined Error
172.18.0.3 true (none)
API:
/operator/area/:uuid/join 엔드포인트를 사용하여 기존 네트워크 영역에 조인합니다.
server.dc1
$ curl -s \
-H "Content-Type: application/json" \
--request PUT \
--data '[ "172.18.0.3" ]' \
http://127.0.0.1:8500/v1/operator/area/1c8cd5e6-562c-e0de-e369-a13c6205ffe8/join
조인으로 페더레이션된 서버 목록이 출력됩니다.
[
{
"Address": "172.18.0.3",
"Joined": true,
"Error": ""
}
]
조인 후 원격 Consul 서버는 이제 영역의 구성원으로 나열됩니다.
CLI:
consul operator area members 명령을 사용하여 네트워크 영역에 있는 Consul 서버 노드를 표시합니다.
server.dc1
$ consul operator area members
Area Node Address Status Build Protocol DC RTT
1c8cd5e6-562c-e0de-e369-a13c6205ffe8 consul-server-0.dc1 172.18.0.5:8300 alive 1.20.5+ent 2 dc1 0s
1c8cd5e6-562c-e0de-e369-a13c6205ffe8 consul-server-1.dc2 172.18.0.3:8300 alive 1.20.5+ent 2 dc2 2.964369ms
API:
/operator/area/:uuid/members을 사용하여 네트워크 영역 구성원을 나열합니다.
server.dc1
$ curl -s http://127.0.0.1:8500/v1/operator/area/1c8cd5e6-562c-e0de-e369-a13c6205ffe8/members
명령은 네트워크 영역에 있는 모든 서버를 출력합니다.
[
{
"ID": "6e4910c1-0259-f737-1ae9-8807b2816d0b",
"Name": "consul-server-0.dc1",
"Addr": "172.18.0.5",
"Port": 8300,
"Datacenter": "dc1",
"Role": "server",
"Build": "1.20.5+ent",
"Protocol": 2,
"Status": "alive",
"RTT": 0
},
{
"ID": "55e61b05-7648-d0d7-e868-6e56e878e371",
"Name": "consul-server-1.dc2",
"Addr": "172.18.0.3",
"Port": 8300,
"Datacenter": "dc2",
"Role": "server",
"Build": "1.20.5+ent",
"Protocol": 2,
"Status": "alive",
"RTT": 2595381
}
]
두 데이터센터가 페더레이션되면 UI에 알려진 데이터센터를 나열하는 드롭다운이 표시됩니다.
RPC 라우팅 (Route RPCs)
네트워크 영역이 활성화되면 양방향으로 RPC 명령을 라우팅할 수 있습니다. 다음 명령은 dc1에서 dc2에 KV 항목을 설정합니다.
CLI:
명령에 사용할 데이터센터를 지정하려면 -datacenter 옵션을 사용하세요.
server.dc1
$ consul kv put -datacenter=dc2 hello_from_dc1 world
Success! Data written to: hello_from_dc1
마찬가지로 매개변수를 사용하여 다른 데이터센터에서 데이터를 검색할 수 있습니다.
server.dc1
$ consul kv get -datacenter=dc2 hello_from_dc1
world
API:
API 호출에 사용할 데이터센터를 지정하려면 dc 쿼리 매개변수를 사용하세요.
server.dc1
$ curl --silent \
--request PUT \
--data 'world' \
http://127.0.0.1:8500/v1/kv/hello_from_dc1?dc=dc2
명령은 성공 시 true를 출력합니다. 마찬가지로 매개변수를 사용하여 다른 데이터센터에서 데이터를 검색할 수 있습니다.
server.dc1
$ curl --silent http://127.0.0.1:8500/v1/kv/hello_from_dc1?dc=dc2
응답이 base64 인코딩된 값을 반환하는 것을 확인하세요.
[
{
"LockIndex": 0,
"Key": "hello_from_dc1",
"Flags": 0,
"Value": "d29ybGQ=",
"Partition": "default",
"Namespace": "default",
"CreateIndex": 3817,
"ModifyIndex": 3817
}
]
DNS 조회 (DNS lookups)
DNS 인터페이스도 페더레이션을 지원합니다.
server.dc1
$ dig @127.0.0.1 -p 8600 consul.service.dc2.consul
; <<>> DiG 9.18.28-1~deb12u2-Debian <<>> @127.0.0.1 -p 8600 consul.service.dc2.consul
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 14610
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;consul.service.dc2.consul. IN A
;; ANSWER SECTION:
consul.service.dc2.consul. 0 IN A 172.18.0.3
;; Query time: 17 msec
;; SERVER: 127.0.0.1#8600(127.0.0.1) (UDP)
;; WHEN: Thu Apr 17 08:30:40 UTC 2025
;; MSG SIZE rcvd: 70
네트워크 영역 삭제 (Delete network areas)
Consul은 이전에 조인한 네트워크 영역을 떠나는 명령을 제공하지 않습니다. 두 데이터센터 간의 페더레이션을 제거하려면 두 데이터센터에서 네트워크 영역을 제거하는 것을 권장합니다.
CLI:
consul operator area delete 명령을 사용하여 네트워크 영역을 삭제합니다.
server.dc2
$ consul operator area delete -id=5bcb95db-5ae8-5265-3dfa-b2cb3452b093
Deleted area "5bcb95db-5ae8-5265-3dfa-b2cb3452b093"!
데이터센터 중 하나에서 네트워크 영역을 삭제하면 Consul이 페더레이션을 제거하고 서버가 다른 데이터센터에서 left로 표시됩니다.
server.dc1
$ consul operator area members
Area Node Address Status Build Protocol DC RTT
1c8cd5e6-562c-e0de-e369-a13c6205ffe8 consul-server-0.dc1 172.18.0.5:8300 alive 1.20.5+ent 2 dc1 0s
1c8cd5e6-562c-e0de-e369-a13c6205ffe8 consul-server-1.dc2 172.18.0.3:8300 left 1.20.5+ent 2 dc2 2.962233ms
API:
/operator/area/:uuid 엔드포인트를 사용하여 네트워크 영역을 제거합니다.
server.dc2
$ curl --silent \
--request DELETE \
http://127.0.0.1:8500/v1/operator/area/5bcb95db-5ae8-5265-3dfa-b2cb3452b093
데이터센터 중 하나에서 네트워크 영역을 삭제하면 Consul이 페더레이션을 제거하고 서버가 다른 데이터센터에서 left로 표시됩니다.
server.dc1
$ curl -s http://127.0.0.1:8500/v1/operator/area/1c8cd5e6-562c-e0de-e369-a13c6205ffe8/members
서버는 이제 다른 데이터센터에서 left로 표시됩니다.
[
{
"ID": "55e61b05-7648-d0d7-e868-6e56e878e371",
"Name": "consul-server-1.dc2",
"Addr": "172.18.0.3",
"Port": 8300,
"Datacenter": "dc2",
"Role": "server",
"Build": "1.20.5+ent",
"Protocol": 2,
"Status": "left",
"RTT": 2962233
},
{
"ID": "6e4910c1-0259-f737-1ae9-8807b2816d0b",
"Name": "consul-server-0.dc1",
"Addr": "172.18.0.5",
"Port": 8300,
"Datacenter": "dc1",
"Role": "server",
"Build": "1.20.5+ent",
"Protocol": 2,
"Status": "alive",
"RTT": 0
}
]
데이터 복제 (Data replication)
일반적으로 Consul은 서로 다른 Consul 데이터센터 간에 데이터를 복제하지 않습니다. 다른 데이터센터의 리소스에 대한 요청이 있으면 로컬 Consul 서버가 해당 리소스에 대해 원격 Consul 서버로 RPC 요청을 전달하고 결과를 반환합니다. 원격 데이터센터를 사용할 수 없으면 해당 리소스도 사용할 수 없습니다. 그러나 이는 로컬 데이터센터에는 영향을 미치지 않습니다.
제한된 데이터 하위 집합을 복제할 수 있는 몇 가지 특수 상황이 있습니다. 예를 들어 Consul의 기본 제공 ACL 복제 기능이나 consul-replicate 같은 외부 도구가 있습니다.