일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- api gateway
- null 병합 연산자
- CloudFormation
- cognito
- Proxy Resource
- Site-to-Site VPN
- Await
- grafana
- JavaScript
- vgw
- elasticsearch
- 자바스크립트
- On-Premise
- DynamoDB
- Custom Resource
- AWS
- docker
- Kubernetes
- prometheus
- VPC
- Endpoints
- transit gateway
- Service
- 옵셔널 체이닝
- 구조분해 할당
- docker swarm
- optional chaining
- 비구조화 할당
- 온프레미스
- 단축 평가
- Today
- Total
만자의 개발일지
[Docker] Docker Swarm Network의 종류 본문
도커 스웜 네트워크
스웜 모드는 여러 개의 노드에 같은 컨테이너를 분산해서 할당하기 때문에 각 노드를 하나로 묶어줄 네트워크가 필요합니다.
뿐만 아니라 서비스를 외부에서 접근한다 했을 때 어느 노드로 접근하더라도 해당 서비스의 컨테이너에 접근할 수 있게 라우팅 기능이 필요합니다.
이러한 네트워크 기능은 스웜 모드가 지원하는 네트워크를 통해 사용할 수 있습니다.
네트워크 목록 확인
먼저 docker network ls 명령어를 통해 네트워크의 목록을 확인해 줍니다.
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
ff375eddfda6 bridge bridge local
09bdaeed02a3 docker_gwbridge bridge local
5cba1cb002ce host host local
dqjjhx24frzq ingress overlay swarm
8cc024d7d9e7 none null local
다양한 종류의 드라이버를 사용하는 네트워크 목록을 볼 수 있습니다.
이 중에서 스웜 모드에 의해 생성된 네트워크는 docker_gwbridge 네트워크와, ingress 네트워크 입니다.
각각이 무엇이고, 어떻게 동작하는지 알아보도록 하겠습니다.
Ingress 네트워크
Ingress 네트워크는 스웜 클러스터를 생성하면 자동으로 생성되는 네트워크로서, 스웜 모드를 사용할 때만 유효합니다.
위에서 네트워크의 목록을 확인했을 때 Ingress 네트워크의 SCOPE가 swarm으로 설정되 있는 것을 보실 수 있습니다.
스웜 클러스터에 노드가 추가되면 해당 노드는 자동으로 해당 클러스터의 Ingress 네트워크에 등록됩니다.
Ingress 네트워크는 각 노드에 내장되어있는 로드 밸런서를 통해 서비스내의 컨테이너들 간에 라운드 로빈(round-robin) 방식으로 로드 밸런싱을 수행합니다.
이 로드 밸런서에는 routing mesh라는 기능이 있는데 이는 노드에 실행중인 서비스가 없더라도 Ingress 네트워크에서 실행되고 있는 모든 서비스에 대한 포트를 오픈하여 각 노드의 로드 밸런서를 모든 컨테이너와 연결시켜주는 기능입니다.
보시다시피 node3에는 컨테이너가 없지만 node3의 로드 밸런서가 다른 모든 노드의 컨테이너와 연결돼 있는 것을 보실 수 있습니다.
보통 서비스를 생성할 때 연결할 포트를 지정해 주는데, 이는 실제로 컨테이너가 해당 호스트의 포트와 연결되는 것이 아니라 해당 호스트의 포트에 들어온 요청을 서비스내의 컨테이너 중 1개로 리다이렉트 해주는 것입니다.
아래 예제를 통해 더 자세하게 알아보도록 합시다.
클러스터내에 3개의 노드가 존재하고 있고, 서비스가 하나의 노드(core-01)에서만 컨테이너가 실행되고 있습니다.
나머지 두 노드에 컨테이너가 실행되고 있지 않아도, 두 노드에 요청이 들어오면 Ingress 네트워크가 알아서 컨테이너가 실행되고 있는 노드로 요청을 리다이렉트 합니다.
반대로 서비스를 스케일 아웃(scale-out)하여 하나의 서비스에 여러 개의 컨테이너가 실행되고 있는 경우에는 어떻게 될까요?
3개의 노드에 5개의 컨테이너가 실행되고 있다고 가정해 봅시다.
2개의 노드에는 2개의 컨테이너가 실행되고 있고 나머지 한개의 노드에는 하나의 컨테이너만 실행되고 있습니다.
불균형을 이루고있는거 같이 보이지만 실은 전혀 신경 쓸 필요가 없습니다.
어차피 각각은 독립된 컨테이너이고 Ingress 네트워크가 알아서 각각의 컨테이너로 요청을 부하 분산처리하기 때문에 몇 개의 노드에 몇 개의 컨테이너가 실행되고 있는지는 별로 중요하지 않습니다.
이러한 동작 방식 덕분에 어느 노드에 컨테이너가 실행되고 있는지 알 필요가 없어 외부에서 쉽게 접근할 수 있습니다.
다만 트래픽이나 리소스 사용량을 고려해야 하는 경우 라운드 로빈 방식의 로드 밸런싱은 적합하지 않을 수 있기에 다른 방안을 고안해야 합니다.
Overlay 네트워크
Overlay 네트워크는 네트워크 안에 있는 여러 개의 도커 데몬(도커 호스트 혹은 노드)간의 통신을 관리하는 가상의 네트워크입니다.
컨테이너는 Overlay 네트워크의 서브넷에 해당하는 IP 대역을 할당받고 이 IP를 통해 서로 내부적으로 통신하게 됩니다.
이러한 동작 방식 때문에 Overlay 네트워크에 속해있는 모든 컨테이너들은 서로 다른 도커 호스트에 있는 컨테이너와 마치 같은 서버에 있는 것처럼 통신할 수 있는 것입니다.
아래 명령어를 통해 실제로 컨테이너가 서브넷에 해당하는 IP대역을 할당받고 있는 것을 확인하실 수 있습니다.
$ docker network inspect <network-id> | jq '.[].IPAM, .[].Containers'
{
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "10.0.0.0/24",
"Gateway": "10.0.0.1"
}
]
}
{
"0b98d6b3b6258957640e9c16e9c1549e72f99c64b5f0b963b53fbabcde12345": {
"Name": "apache.3.lmrfd2t5dzb80lvulbytpnms2",
"EndpointID": "25fa691ceffa5d6b6efd0cdc756d3648fd7800f07cc4707508d61dabcde12345",
"MacAddress": "02:42:00:00:00:08",
"IPv4Address": "10.0.0.8/24",
"IPv6Address": ""
},
"ingress-sbox": {
"Name": "ingress-endpoint",
"EndpointID": "a92463ed664f8490d0329643f655c4e0f8bf9ce27f6b49350e0598abcde12345",
"MacAddress": "02:42:00:00:00:02",
"IPv4Address": "10.0.0.2/24",
"IPv6Address": ""
}
}
Overlay 네트워크는 Overlay 네트워크 드라이버를 사용해 여러 도커 호스트에 대한 분산 네트워크를 생성할 수 있는데, Ingress 네트워크 역시 Overlay 네트워크 드라이버를 사용하는 Overlay 네트워크 중 하나입니다.
docker_gwbridge 네트워크
Ingress 네트워크를 사용하지 않는 컨테이너는 기본적으로 존재하는 bridge 네트워크를 사용해 외부와 통신합니다. 그러나 Ingress 네트워크를 포함한 모든 Overlay 네트워크는 docker_gwbridge 네트워크와 함께 사용되는데, 이 docker_gwbridge 네트워크는 도커 데몬(도커 호스트 혹은 노드)에 물리적으로 연결되는 가상의 네트워크로서, 외부로 나가는 통신 및 Overlay 네트워크의 트래픽 종단점 (VTEP, VXLAN Tunnel End Point) 역할을 담당합니다.
docker_gwbridge는 스웜 클러스터를 init하거나 join할 때 자동을 생성되며, Overlay 네트워크를 개별 도커 데몬의 물리적 네트워크에 연결합니다. 서비스에 의해 실행중인 각각의 컨테이너는 로컬 도커 데몬의 docker_gwbridge에 연결됩니다.
사용자 정의 Overlay 네트워크
스웜 모드에서는 별도의 구성 없이 사용자 정의 Overlay 네트워크를 생성하고 사용할 수 있습니다.
Overlay 네트워크 생성
docker network create 명령어로 네트워크를 생성할 수 있습니다.
$ docker network create \
-d overlay \
--ingress \
--subnet 10.0.0.0/24 \
--gateway 10.0.0.1/24 \
my_ingress
pyys706yfwo8536pbmjuts9o5
Overlay 네트워크 사용
생성된 Overlay 네트워크는 서비스를 생성할 때 --network 옵션을 이용하여 Overlay 네트워크가 적용된 컨테이너를 생성하실 수 있습니다.
$ docker service create \
--name overlay_test \
--network my_ingress \
--replicas 3 \
-p 80:80 \
httpd
참고
- 시작하세요! 도커/쿠버네티스
- https://watch-n-learn.tistory.com/49
- https://subicura.com/2017/02/25/container-orchestration-with-docker-swarm.html
- https://docs.docker.com/engine/swarm/ingress/#/configure-an-external-load-balancer
- https://boomkim.github.io/2018/07/27/docker-network-overlay/
- https://medium.com/dtevangelist/docker-%EA%B8%B0%EB%B3%B8-8-8-docker%EC%9D%98-network-c75f3077335d
'Docker' 카테고리의 다른 글
[Docker] Docker Swarm host mode로 서비스 생성하기 (0) | 2022.07.27 |
---|---|
[Docker] ECR Public Gallery에서 이미지 불러오기 (1) | 2022.06.27 |
[Docker] Docker Swarm Cluster 구축하기(Swarm Mode) (0) | 2022.06.17 |
[Docker] 뗏목 합의 알고리즘이란 (1) | 2022.06.14 |
[Docker] Docker Swarm이란 (1) | 2022.06.14 |