-
[Etcd] --listen-peer-urls 설정 알아보기 (--initial-advertise-peer-urls)Etcd 2024. 6. 17. 05:59728x90반응형
- 목차
들어가며.
Etcd 는 최소 3개의 Etcd Server 들로 하나의 클러스터를 구성합니다.
일반적으로 Etcd 는 중앙 저장소로써 Distributed Application 들의 적절한 실행을 위해서 Key-Value 타입의 데이터들을 저장합니다.
이러한 Distributed Application 들이 필요로하는 데이터를 안정적으로 관리하기 위해서 최소 3개 이상의 Etcd Server 들이 하나의 Cluster 를 구성하죠.
Etcd Server 들이 하나의 Cluster 를 구성하기 위해서 Peer to Peer 네트워크 통신을 수행합니다.
그리고 이러한 네트워크 통신 과정에서 데이터를 안정적으로 복제하고 ( Replication ), 서로의 생존 여부를 확인합니다. ( High Availablity )
Etcd Server 는 이러한 Peer to Peer 통신을 위해서 자신이 Listening 하는 Port 정보와 자신의 Host 정보를 설정해야합니다.
일반적으로 Port 를 2380 를 사용합니다.
--listen-peer-urls 의 목적.
Etcd Server 들은 하나의 온전한 Cluster 를 구성하기 위해서 Peer to Peer 통신을 수행합니다.
그리고 개별 Etcd Server 는 Peer to Peer 통신을 위한 Host 와 Port 를 설정해야합니다.
사실상 Host 정보는 고정값이고 ( ex. 192.168.0.5 ) Port 또한 2380 를 관습적으로 사용합니다.
이러한 Host 와 Port 를 설정하는 Flag 가 --listen-peer-urls 입니다.
간단한 사용 예제를 살펴보겠습니다.
사용 예제는 Docker 와 관련된 Network & Container 명령어들로 구성됩니다.
먼저 Docker Network 를 생성합니다.
docker network create --subnet=192.168.1.0/24 etcd
1번째 Etcd Server 를 실행합니다.
Docker Container Run 명령어의 --ip Flag 를 통해서 Docker Container 가 사용할 IP 를 명시합니다.
etcd1 도커 컨테이너는 192.168.1.100 IP 를 사용하도록 설정하였습니다.
docker run --platform linux/amd64 -d --network etcd \ --name etcd1 --hostname etcd1 \ --ip 192.168.1.100 \ -p 12380:2380 \ -p 12379:2379 \ quay.io/coreos/etcd:v3.5.17 \ /usr/local/bin/etcd \ --data-dir=/var/etcd \ --listen-client-urls=http://192.168.1.100:2379 \ --advertise-client-urls="http://host.docker.internal:12379" \ --listen-peer-urls=http://192.168.1.100:2380 \ --initial-advertise-peer-urls=http://192.168.1.100:2380 \ --initial-cluster="node1=http://192.168.1.100:2380,node2=http://192.168.1.101:2380" \ --initial-cluster-state=new \ --initial-cluster-token=etcd \ --name=node1
아래의 명령어는 etcd2 도커 컨테이너를 실행하는 명령어입니다.
etcd2 는 192.168.1.101 IP 를 사용합니다.
docker run --platform linux/amd64 -d --network etcd \ --name etcd2 --hostname etcd2 \ --ip 192.168.1.101 \ -p 22380:2380 \ -p 22379:2379 \ quay.io/coreos/etcd:v3.5.17 \ /usr/local/bin/etcd \ --data-dir=/var/etcd \ --listen-client-urls=http://192.168.1.101:2379 \ --advertise-client-urls="http://host.docker.internal:22379" \ --listen-peer-urls=http://192.168.1.101:2380 \ --initial-advertise-peer-urls=http://192.168.1.101:2380 \ --initial-cluster="node1=http://192.168.1.100:2380,node2=http://192.168.1.101:2380" \ --initial-cluster-state=new \ --initial-cluster-token=etcd \ --name=node2
위 2개의 Etcd Docker Container 들이 실행된 이후의 Docker Desktop 상태는 아래와 같습니다.
그리고 아래의 etcdctl 명령어를 통해서 실행 중인 Etcd Cluster 의 상태를 확인할 수 있습니다.
"etcdctl member list" 명령어가 Etcd Cluster 의 멤버들을 확인하는 명령어입니다.
docker run --platform linux/amd64 --rm quay.io/coreos/etcd:v3.5.17 \ etcdctl \ --endpoints=http://host.docker.internal:12379 member list -w json
"etcdctl member list" 명령어의 결과로써 아래의 JSON 결과를 확인할 수 있습니다.
member list 의 JSON 결과는 header 와 members 로 구성됩니다.
먼저 members 결과를 확인해보면,
node1 과 node2 에 해당하는 2개의 Etcd Member 를 확인할 수 있습니다.
이는 각 Etcd Server 의 이름에 해당하며, 이름은 --name Flag 를 통해서 설정이 가능합니다.
그리고 header.member_id 에 명시되어 있는 id 가 바로 Leader Etcd Node 의 ID 에 해당합니다.
{ "header": { "cluster_id": 2050108626743660000, "member_id": 6211932558799033000, "raft_term": 2 }, "members": [ { "ID": 1555784034791402200, "name": "node2", "peerURLs": [ "http://192.168.1.101:2380" ], "clientURLs": [ "http://host.docker.internal:22379" ] }, { "ID": 6211932558799033000, "name": "node1", "peerURLs": [ "http://192.168.1.100:2380" ], "clientURLs": [ "http://host.docker.internal:12379" ] } ] }
--initial-advertise-peer-urls.
"--listen-peer-urls" 은 "--initial-advertise-peer-urls" 와 한 쌍으로 구성됩니다.
위에 작성된 저의 예시에서는 "--listen-peer-urls" 와 "--initial-advertise-peer-urls" 의 값이 서로 동일합니다.
그 이유는 2개의 Etcd Node 들이 서로 같은 네트워크에 존재하기 때문입니다.
그래서 Private IP 를 사용하던 Public IP 를 사용하던 큰 의미가 없습니다.
"--initial-advertise-peer-urls" 는 2개의 Etcd Node 들으 서로 다른 네트워크 Subnet 에 위치할 때에 그 필요성이 발생합니다.
서로 다른 Network 의 Etcd 의 설정.
만약에 2개의 Etcd 가 동일한 Network 상에 존재한다고 가정하겠습니다.
다른 표현으로 동일한 라우터 내부에서 서로 다른 Private IP 를 가집니다.
이 때에는 서로 Private IP 로 접근이 가능하며 Private IP 를 "--listen-peer-urls" 로 설정하면 됩니다.
반면 서로 다른 Subnet 에 존재하는 경우에는 "--listen-peer-urls" 와 "--initial-advertise-peer-urls" 의 설정이 달라집니다.
이러한 상황을 이미지로 표현하면 아래와 유사하구요.
--initial-advertise-peer-urls 설정에 Public IP 를 설정하여 서로 접근할 수 있게 됩니다.
일종의 NAT ( Network Address Translation ) 과 같이 네트워크 외부에서 접근 가능한 Host 와 Port 를 Advertise Peer Urls 로 설정해야합니다.
서로 다른 네트워크의 Etcd 를 Peer to Peer 연결하기 위한 예시는 아래와 같습니다.
Docker Network 를 통해서 NAT 를 구현하는게 생각보다 어려워서 아래와 같이 host.docker.internal 을 사용하였습니다.
즉, 2개의 Subnet 이 서로 통신하기 위해서 Host Machine 을 거쳐 네트워크 트래픽을 교환합니다.
docker network create --subnet=192.168.1.0/24 etcd1 docker network create --subnet=192.168.2.0/24 etcd2 docker run --platform linux/amd64 -d --network etcd1 \ --name etcd1 --hostname etcd1 \ --ip 192.168.1.100 \ -p 12380:2380 \ -p 12379:2379 \ quay.io/coreos/etcd:v3.5.17 \ /usr/local/bin/etcd \ --data-dir=/var/etcd \ --listen-client-urls=http://192.168.1.100:2379 \ --advertise-client-urls="http://host.docker.internal:12379" \ --listen-peer-urls=http://192.168.1.100:2380 \ --initial-advertise-peer-urls=http://host.docker.internal:12380 \ --initial-cluster="node1=http://host.docker.internal:12380,node2=http://host.docker.internal:22380" \ --initial-cluster-state=new \ --initial-cluster-token=etcd \ --name=node1 docker run --platform linux/amd64 -d --network etcd2 \ --name etcd2 --hostname etcd2 \ --ip 192.168.2.100 \ -p 22380:2380 \ -p 22379:2379 \ quay.io/coreos/etcd:v3.5.17 \ /usr/local/bin/etcd \ --data-dir=/var/etcd \ --listen-client-urls=http://192.168.2.100:2379 \ --advertise-client-urls="http://host.docker.internal:22379" \ --listen-peer-urls=http://192.168.2.100:2380 \ --initial-advertise-peer-urls=http://host.docker.internal:22380 \ --initial-cluster="node1=http://host.docker.internal:12380,node2=http://host.docker.internal:22380" \ --initial-cluster-state=new \ --initial-cluster-token=etcd \ --name=node2
정상 실행 여부는 아래의 명령어를 통해서 확인 가능합니다.
docker run --platform linux/amd64 --rm quay.io/coreos/etcd:v3.5.17 \ etcdctl \ --endpoints=http://host.docker.internal:12379 member list -w json
번외 1) peer urls 값으로 IP 가 아닌 Domain 사용해보기.
Etcd Cluster 의 각 Peer 들이 서로 통신을 하기 위해서 x.x.x.x 형식의 IP 가 아닌 Domain 을 활용할 수 있습니다.
아래의 예시가 Domain 을 통한 통신의 예시인데요.
2개의 Etcd Node 가 각각 etcd1 과 etcd2 도메인을 가지도록 설정하였습니다.
그리고 --listen-peer-urls 의 값을 0.0.0.0:2380 로 설정하였습니다.
0.0.0.0 의 의미는 특정 IP 에 국한된 TCP Socket 을 설정하지 않는 의미인데요.
( 이 부분은 TCP Socket Bind System Call 에서 Host 를 명시하거나 명시하지 않는 기능과 관련이 있습니다. )
아무튼 0.0.0.0 으로 --listen-peer-urls 을 설정하게 되면 2380 포트로 유입되는 모든 네트워크 트래픽의 IP 를 허용함을 의미하며,
IP Whitelisting 의 느낌으로 이해하셔도 됩니다.
그리고 --initial-advertise-peer-urls 에 Etcd 의 Domain 을 설정합니다.
docker network create etcd docker run --platform linux/amd64 -d --network etcd \ --name etcd1 --hostname etcd1 \ -p 12380:2380 \ -p 12379:2379 \ quay.io/coreos/etcd:v3.5.17 \ /usr/local/bin/etcd \ --data-dir=/var/etcd \ --listen-client-urls=http://0.0.0.0:2379 \ --advertise-client-urls="http://host.docker.internal:12379" \ --listen-peer-urls=http://0.0.0.0:2380 \ --initial-advertise-peer-urls=http://etcd1:2380 \ --initial-cluster="node1=http://etcd1:2380,node2=http://etcd2:2380" \ --initial-cluster-state=new \ --initial-cluster-token=etcd \ --name=node1 docker run --platform linux/amd64 -d --network etcd \ --name etcd2 --hostname etcd2 \ -p 22380:2380 \ -p 22379:2379 \ quay.io/coreos/etcd:v3.5.17 \ /usr/local/bin/etcd \ --data-dir=/var/etcd \ --listen-client-urls=http://0.0.0.0:2379 \ --advertise-client-urls="http://host.docker.internal:22379" \ --listen-peer-urls=http://0.0.0.0:2380 \ --initial-advertise-peer-urls=http://etcd2:2380 \ --initial-cluster="node1=http://etcd1:2380,node2=http://etcd2:2380" \ --initial-cluster-state=new \ --initial-cluster-token=etcd \ --name=node2
정상 실행 여부는 아래의 명령어를 통해서 확인 가능합니다.
docker run --platform linux/amd64 --rm quay.io/coreos/etcd:v3.5.17 \ etcdctl \ --endpoints=http://host.docker.internal:12379 member list -w json
반응형'Etcd' 카테고리의 다른 글
[Etcd] Watch 기능 알아보기 ( HTTP2, WatchCreateRequest ) (0) 2024.06.17 [Etcd] WAL Log (Write Ahead Log) 알아보기 (0) 2024.06.17 [Etcd] --initial-cluster 설정 알아보기 (0) 2024.06.16