-
[Docker] Docker overlay networkingDocker 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
'Docker' 카테고리의 다른 글
[Docker] Security in Docker (0) 2024.03.08 [Docker] Swarm mode (0) 2024.03.08 [Docker] 3. Containerizing - Dockerfile로 도커 이미지 만들기 (0) 2024.03.08 [Docker] 2. 도커 이미지(Docker Image) 3분 이해 (1) 2024.02.23 [Docker] 1. 도커Docker를 왜 만들었을까? - 도커 큰그림 그리기 (0) 2024.02.23