[docker-swarm] docker swarm 네트워크
카테고리: docker
태그: docker
🎯스웜 서비스 네트워크 관리
스웜 트래픽 유형
Docker Swarm은 두 가지 종류의 다른 트래픽을 생성합니다.
control plane traffic: Swarm에 가입 또는 탈퇴하는 요청 같은 Swarm 관리 메시지가 포함됩니다. 또한 이 트래픽은 항상 암호화됩니다.data plane traffic: 컨테이너간의 트래픽 및 외부 클라이언트와의 트래픽이 포함됩니다.
주요 네트워크 개념
다음 세 가지의 네트워크 개념은 Swarm 서비스를 이해하는 데 중요합니다.
Overlay network:- Swarm에 참여하는 Docker 데몬 간의 통신을 관리합니다.
- 독립 실행형 컨테이너에 대한 사용자 정의 네트워크와 동일한 방식으로 오버레이 네트워크를 생성할 수 있습니다.
- 서비스 간 통신을 활성화하기 위해 하나 이상의 기존 오버레이 네트워크에도 서비스를 연결할 수 있습니다.
- 오버레이 네트워크는
overlay네트워크 드라이버를 사용하는 Docker 네트워크입니다.
Ingress network:- 서비스 노드 간의 로드 밸런싱을 용이하게 하는 특수 오버레이 네트워크입니다.
- Swarm 노드가 게시된 포트에서 요청을 수신하면 해당 요청을
IPVS이라는 모듈로 전달합니다. IPVS는 해당 서비스에 참여하는 모든 IP 주소를 추적하고 그 중 하나를 선택해서 요청을 라우팅합니다.ingress네트워크는 스웜을 초기화하거나 가입할 때 자동으로 생성됩니다.
docker_gwbridge:- 오버레이 네트워크(
ingress네트워크 포함)를 개별 Docker 데몬의 물리적 네트워크에 연결하는 브리지 네트워크입니다. - 기본적으로 서비스가 실행 중인 각 컨테이너는 로컬 Docker 데몬 호스트의
docker_gwbridge네트워크에 연결됩니다. docker_gwbridge네트워크는 스웜을 초기화하거나 가입할 때 자동으로 생성됩니다.
- 오버레이 네트워크(
방화벽 고려 사항
Swarm에 참여하는 Docker 데몬은 다음 포트를 통해 서로 통신할 수 있는 기능이 필요합니다.
- 컨테이너 네트워크 검색을 위한
TCP/UDP 7946 포트 - 컨테이너 오버레이 네트워크용
UDP 4789 포트
오버레이 네트워크 만들기
# TODO 1. 오버레이 네트워크를 생성합니다.
$ docker network create \
--driver overlay \
my-network
# 오버레이 네트워크를 생성하려면 overlay 드라이버를 지정합니다.
# 위 명령은 사용자 지정 옵션을 지정하지 않으므로 Docker는 서브넷을 할당하고 기본 옵션을 사용합니다.
# TODO 2. 생성된 오버레이 네트워크에 대한 정보를 확인합니다.
$ docker network inspect my-network
[
{
"Name": "my-network",
"Id": "fsf1dmx3i9q75an49z36jycxd",
"Created": "0001-01-01T00:00:00Z",
"Scope": "swarm",
"Driver": "overlay",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": []
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"Containers": null,
"Options": {
"com.docker.network.driver.overlay.vxlanid_list": "4097"
},
"Labels": null
}
]
# 위 출력에서 드라이버는 overlay 이고 scope는 swarm 입니다. scope에는 local, host, global 등이 사용될 수 있고 swarm scope는 Swarm에 참여하는 호스트만 이 네트워크에 액세스할 수 있음을 의미합니다.
# 네트워크의 서브넷과 게이트웨이는 서비스가 네트워크에 처음 연결할 때 동적으로 구성됩니다. 다음 예제는 위와 동일한 네트워크를 보여주지만 세 개의 redis 서비스 컨테이너가 연결되어 있습니다.
$ docker network inspect my-network
[
{
"Name": "my-network",
"Id": "fsf1dmx3i9q75an49z36jycxd",
"Created": "2017-05-31T18:35:58.877628262Z",
"Scope": "swarm",
"Driver": "overlay",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "10.0.0.0/24",
"Gateway": "10.0.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"Containers": {
"0e08442918814c2275c31321f877a47569ba3447498db10e25d234e47773756d": {
"Name": "my-redis.1.ka6oo5cfmxbe6mq8qat2djgyj",
"EndpointID": "950ce63a3ace13fe7ef40724afbdb297a50642b6d47f83a5ca8636d44039e1dd",
"MacAddress": "02:42:0a:00:00:03",
"IPv4Address": "10.0.0.3/24",
"IPv6Address": ""
},
"88d55505c2a02632c1e0e42930bcde7e2fa6e3cce074507908dc4b827016b833": {
"Name": "my-redis.2.s7vlybipal9xlmjfqnt6qwz5e",
"EndpointID": "dd822cb68bcd4ae172e29c321ced70b731b9994eee5a4ad1d807d9ae80ecc365",
"MacAddress": "02:42:0a:00:00:05",
"IPv4Address": "10.0.0.5/24",
"IPv6Address": ""
},
"9ed165407384f1276e5cfb0e065e7914adbf2658794fd861cfb9b991eddca754": {
"Name": "my-redis.3.hbz3uk3hi5gb61xhxol27hl7d",
"EndpointID": "f62c686a34c9f4d70a47b869576c37dffe5200732e1dd6609b488581634cf5d2",
"MacAddress": "02:42:0a:00:00:04",
"IPv4Address": "10.0.0.4/24",
"IPv6Address": ""
}
},
"Options": {
"com.docker.network.driver.overlay.vxlanid_list": "4097"
},
"Labels": {},
"Peers": [
{
"Name": "moby-e57c567e25e2",
"IP": "192.168.65.2"
}
]
}
]
오버레이 네트워크 사용자 지정
- 구성 가능한 옵션의 전체 목록을 보려면
docker network create -help명령을 실행합니다. - 다음은 변경할 수 있는 가장 일반적인 옵션 중 일부입니다.
1. 서브넷 및 게이트웨이 구성
- 기본적으로 네트워크의 서브넷과 게이트웨이는 첫 번째 서비스가 네트워크에 연결될 때 자동으로 구성됩니다.
--subnet,--gateway플래그를 사용하여 네트워크를 생성할 때 이를 구성할 수 있습니다.
$ docker network create \
--driver overlay \
--subnet 10.0.9.0/24 \
--gateway 10.0.9.99 \
my-network
2. 사용자 지정 기본 주소 풀
- 스웜을 초기화할 때 Swarm 네트워크에 대한 서브넷 할당을 사용자 정의할 수 있습니다.
- 사용자가 네트워크를 생성하지만
--subnet명령줄 옵션을 사용하지 않은 경우 이 네트워크의 서브넷은 기본 주소 풀에서 사용 가능한 다음 서브넷 부터 순차적으로 할당됩니다. 기본 주소 풀을 설정하려면--default-addr-pool명령줄 옵션을 사용합니다. - 기본 서브넷 마스크 길이는
/24로 설정되어 있고 변경하려면--default-addr-pool-mask-length명령줄 옵션을 사용합니다.
$ docker swarm init --default-addr-pool 10.20.0.0/16 --default-addr-pool-mask-length 26
3. 오버레이 네트워크 크기 제한
- Docker는
/24블록으로 오버레이 네트워크를 생성할 것을 권장합니다. /24오버레이 네트워크 블록은 네트워크를 256개의 IP 주소로 제한합니다.
4. 애플리케이션 데이터의 암호화 구성
- Swarm과 관련된 control plain 데이터는 항상 암호화됩니다.
- Swarm 노드 간의 애플리케이션 데이터는 기본적으로 암호화되지 않습니다. 지정된 오버레이 네트워크에서 이 트래픽을 암호화하려면
--opt encrypted플래그를 사용합니다. - 이렇게 하면 vxlan 수준에서 IPSEC 암호화가 활성화됩니다. 하지만 이 암호화는 성능 저하를 초래할 수 있으므로 운영 환경에서는 사용하기 전에 테스트가 필요합니다.
오버레이 네트워크에 서비스 연결
- 기존 오버레이 네트워크를 새로 생성할 서비스에 연결하려면
docker service create명령에--network플래그를 전달합니다. - 기존 오버레이 네트워크를 기존 서비스에 연결하려면
docker service update명령에--network-add플래그를 전달합니다. - 오버레이 네트워크에 연결된 서비스 컨테이너는 이를 통해 서로 통신할 수 있습니다.
$ docker service create \
--name my-web \
--replicas 3 \
--network my-network \
nginx
$ docker service update \
--network-add my-network \
nginx
서비스 검색
- 서비스 검색은 클라이언트가 서비스에 참여하는 노드 수나 해당 IP 주소 또는 포트를 알 필요 없이 서비스의 외부 클라이언트에서 개별 Swarm 노드로 요청을 라우팅하기 위해 Docker가 사용하는 메커니즘입니다.
- 서비스 검색은 두 가지 다른 방법으로 동작할 수 있습니다.
- 기본적으로 서비스를 네트워크에 연결하고 해당 서비스가 하나 이상의 포트를 게시하면 Docker는 클라이언트가 서비스에 연결하는 프론트 엔드인 가상 IP(VIP)를 서비스에 할당합니다. Docker는 서비스의 모든 작업자 노드 목록을 유지하고 노드 중 하나에 요청을 라우팅합니다. 클라이언트의 각 요청은 다른 노드로 라우팅될 수 있습니다.
- DNSRR(DNS 라운드 로빈) 서비스 검색을 사용하도록 서비스를 구성하는 경우 단일 가상 IP가 없습니다. 대신 Docker는 서비스 이름에 대한 DNS 쿼리가 IP 주소 목록을 반환하고 클라이언트가 이들 중 하나에 직접 연결하도록 서비스에 대한 DNS 항목을 설정합니다.
📌출처
👍 개인 공부 기록용 블로그입니다. 오류나 조언이 있으시면 언제든지 댓글 혹은 메일로 남겨주시면 감사하겠습니다! 😄
댓글남기기