ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Docker] Docker overlay networking
    Docker 2024. 3. 8. 22:27

    Docker overlay networking - The Deep Dive

    2015년, 도커 회사는 Socket Plane이라는 스타트업 인수함.

    인수 이유: 컨테이너간 네트워크 연결을 개발자도 쉽게 할 수 있도록 기술 획득

     

    스웜 모드에서 도커 오버레이 네트워크 빌드하고 테스트하기

    1. 초기: 2개의 개별 호스트에서 노드 하나씩 있는 상태

     

    2. 스웜 생성

    # 스웜 및 매니저 역할 부여
    docker swarm init \
    --advertise-addr=172.31.1.5 \
    --listen-addr=172.31.1.5:2377
    
    # 워커 역할 부여
    docker swarm join \
    --token SWMTKN-1-0hz2ec...2vye \
    172.31.1.5:2377
    • node1에서 docker swarm init 해서 스웜 생성 -> node1을 매니저 노드로 만들고,
    • node2에서 docker swarm join 해서 해당 스웜 내의 워커 노드로 만든다.

    3. overlay network(unber-net) 생성

    docker network create -d overlay uber-net

     

    node2에서 docker network ls를 실행하면 네트워크 목록에 uber-net이 보이지 않는다.

    이유: overlay network 내에서 구동중인 워커 노드들에게만 보인다. -> node2는 아직 uber-net 위에서 돌아가고 있지 않기 때문에 uber-net이 안 보인다.

    • network gossip protocol의 범위를 좁힘으로써 확장성에 도움을 준다.
    • 가십 프로토콜: 마스터 노드 없이 각 노드는 주기적으로 랜덤하게 선택한 이웃 노드에게 정보를 전파한다. 이 정보는 이웃 노드에서 다시 랜덤하게 선택한 다른 이웃 노드에게 전달되고, 이 과정이 반복된다. 이러한 과정을 통해 네트워크 상의 모든 노드가 서로 정보를 주고받게 되며, 전체 시스템에 정보를 효과적으로 분산시킬 수 있다.

    가십 프로토콜 구조

    4. uber-net에 docker service 붙이기

    replicas 2개를 갖는 서비스 생성하면 자동으로 uber-net이 node2까지 확장된다.

    docker service create --name test \
    --network uber-net \
    --replicas 2 \
    ubuntu sleep infinity
    • 이름을 test로 하고 uber-net 네트워크를 위에서 2개의 replicas(컨테이너)로 이루어지고, 이미지는 ubuntu로 하는데 계속 작동하도록 sleep infinity 설정해서 서비스 생성

    스웜에 2개의 노드가 있고 서비스 레플리카가 2개이기 때문에 레플리카 각각은 각각의 노드에서 작동한다.

     

    서비스 작동 확인

    docker service ps test
    
    ID          NAME    IMAGE  NODE DESIRED STATE  CURRENT STATE
    77q...rkx  test.1  ubuntu node1 Running        Running
    97v...pa5  test.2  ubuntu node2 Running        Running

     

    스웜이 시작하면, uber-net 네트워크를 자동으로 node2까지 확장시킨다.

     

    5. 오버레이 네트워크 테스트

    uber-net의 subnet을 확인해보자

    docker network inspect uber-net
    
    결과
    [
    	{
    	"Name": "uber-net",
    	"Id": "c740ydi1lm89khn5kd52skrd9",
    	"Scope": "swarm",
    	"Driver": "overlay",
    	"EnableIPv6": false,
    	"IPAM": {
    	    "Driver": "default",
    	    "Options": null,
    	    "Config": [
            {
                "Subnet": "10.0.0.0/24",
              "Gateway": "10.0.0.1"
            }

     

    서비스 내 두 컨테이너의 subnet을 확인해보자

    $ docker container ls
    CONTAINER ID IMAGE          COMMAND           CREATED         STATUS
    396c8b142a85 ubuntu:latest  "sleep infinity"  2 hours ago Up  2 hrs $
    $ docker container inspect \
    --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 396c8b\ 142a85
    10.0.0.3

     

    결과

    • uber-net의 서브넷: 10.0.0.0/24
    • 두 컨테이너의 서브넷: 10.0.0.3/24, 10.0.0.4/24

     

    컨테이너간 ping 테스트 수행

    $ docker container exec -it 396c8b142a85 bash
    root@396c8b142a85:/#
    root@396c8b142a85:/#
    root@396c8b142a85:/# apt-get update
    <Snip>
    root@396c8b142a85:/#
    root@396c8b142a85:/#
    root@396c8b142a85:/# apt-get install iputils-ping Reading package lists... Done
    Building dependency tree
    Reading state information... Done
    <Snip>
    Setting up iputils-ping (3:20121221-5ubuntu2) ... Processing triggers for libc-bin (2.23-0ubuntu3) ... root@396c8b142a85:/#
    root@396c8b142a85:/#
    root@396c8b142a85:/# ping 10.0.0.4
    PING 10.0.0.4 (10.0.0.4) 56(84) bytes of data.
    64 bytes from 10.0.0.4: icmp_seq=1 ttl=64 time=1.06 ms
    64 bytes from 10.0.0.4: icmp_seq=2 ttl=64 time=1.07 ms
    64 bytes from 10.0.0.4: icmp_seq=3 ttl=64 time=1.03 ms
    64 bytes from 10.0.0.4: icmp_seq=4 ttl=64 time=1.26 ms
    ^C
    root@396c8b142a85:/#
    • 10.0.0.3 컨테이너에서 10.0.0.4 컨테이너로 ping을 날리는 모습
    • 컨테이너1에서 컨테이너2로 요청을 보내고 받을 수 있음을 확인

    양 컨테이너간 몇 홉 떨어져 있는지 구하기

    $ root@396c8b142a85:/# traceroute 10.0.0.4
    traceroute to 10.0.0.4 (10.0.0.4), 30 hops max, 60 byte packets
     1  test-svc.2.97v...a5.uber-net (10.0.0.4)  1.110ms  1.034ms  1.073ms
    • 1번 홉에 대한 정보: 1 test-svc.2.97v...a5.uber-net (10.0.0.4) 1.110ms 1.034ms 1.073ms
      • 호스트명, IP주소, 최소, 평균, 최대 응답시간

    어떻게 이게 작동하는지?

    • 도커 오버레이 네트워크는 가상 레이어2 오버레이 네트워크를 생성하기 위해 VXLAN 터널을 이용한다.

    VXLAN

    • 레이어3 인프라에 가상 레이어2 네트워크를 생성해주는 도구
      • 레이어3: 라우터(ex. 172.31.1.0/24, 192.168.1.0/24)
      • 가상 레이어2 에) 테스트용으로 생성했던 10.0.0.0/24 uber-net
    • 레이어3 구성원들이 VXLAN을 단순히 IP/UDP 패킷으로 보게끔 캡슐화
    • VXLAN 터널의 양 끝엔 VTEP이라는 엔드포인트가 있다.
    • VTEP: 캡슐화, 디캡슐화 역활
    • bridge(가상 스위치)
    • veth(가상 이더넷)

    c1 ping -> veth -> Br0(broadcasting) -> VTEP -> VXLAN tunnel -> VTEP -> BR0 -> veth -> C2

Designed by Tistory.