[docker-swarm] docker swarm 네트워크

업데이트:     Updated:

카테고리:

태그:

🎯스웜 서비스 네트워크 관리

스웜 트래픽 유형

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 항목을 설정합니다.

📌출처

Docker Docs


👍 개인 공부 기록용 블로그입니다. 오류나 조언이 있으시면 언제든지 댓글 혹은 메일로 남겨주시면 감사하겠습니다! 😄

맨 위로 이동하기

docker 카테고리 내 다른 글 보러가기

댓글남기기