ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Etcd] --listen-peer-urls 설정 알아보기 (--initial-advertise-peer-urls)
    Etcd 2024. 6. 17. 05:59
    728x90
    반응형

    - 목차

     

    들어가며.

    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

     

     

     

    반응형
Designed by Tistory.