12.4.클러스터 환경에서 네트워크 트래픽 관리하기

오버레이 네트워크(overlay network) * 스웜 모드에서는 오버레이 네트워크(overlay network)라는 새로운 형태의 도커 네트워크를 사용할 수 있다. * 오버레이 네트워크는 클러스터에 속한 모든 노드를 연결하는 가상 네트워크다. * 오버레이 네트워크에 연결된 서비스는 서비스 이름을 도메인 네임 삼아 다른 서비스와 통신할 수 있다. * 오버레이 네트워크 자체는 서로 독립적이기 때문에 서로 다른 네트워크에 속한 서비스는 통신이 불가능하다. * 오버레이 네트워크와 일반적인 도커 네트워크의 차이점이 한 가지 더 있다. * 도커 컴포즈를 이용해 스케일링 했을 경우 DNS 질의를 하면 모든 컨테이너의 IP 주소가 응답에 포함됐다. * 이 중 어느 IP 주소로 실제 트래픽이 전달될지는 전적으로 서비스를 사용하는 쪽(컨슈머)의 몫이었다. * 스웜에서 실행한 서비스는 때로 수백 개의 레플리카를 가질 수도 있기 때문에 이런 방식은 제대로 된 스케일링이라 할 수 없다. * 이런 경우 오버레이 네트워크에서는 서비스를 가리키는 가상 IP 주소 하나를 반환한다.

실습 기존에 실행 중인 애플리케이션을 제거하고 새로운 네트워크와 앞 장에서 배운 NASA의 오늘의 천문 사진 애플리케이션의 컴포넌트 중 API 서비스를 실행한다.

001) # 기존에 실행 중인 애플리케이션 제거
002)  docker service rm timecheck
003) timecheck
004) 
005) # 새로운 오버레이 네트워크를 만든다.
006)  docker network create --driver overlay iotd-net
007) 9qcqcnkzkrxx83bihzt0ekysg
008) 
009) # 오늘의 천문 사진 애플리케이션의 API 서비스와
010)  docker service create --detach --replicas 3 --network iotd-net --name iotd diamol/ch09-image-of-the-day
011) efhl51hbn7zqrp6x5zwng1fla
012) 
013) # 로그 API를 실행해 같은 네트워크에 연결한다.
014)  docker service create --detach --replicas 2 --network iotd-net --name accesslog diamol/ch09-access-log      
015) yfivcbheg23k3wurs5enkypn6
016) 
017) # 서비스 목록을 확인한다.
018)  docker service ls
019) ID             NAME        MODE         REPLICAS   IMAGE                                 PORTS
020) yfivcbheg23k   accesslog   replicated   2/2        diamol/ch09-access-log:latest         
021) efhl51hbn7zq   iotd        replicated   3/3        diamol/ch09-image-of-the-day:latest   
  1. 006: 도커 네트워크에도 종류가 있다. 스웜 모드에서는 overlay 타입이 기본으로 사용되지만 명시적으로 지정하는 것이 좋다.
  2. 010: 서비스를 생성하고 오버레이 네트워크에 연결한다. detach 옵션을 사용하면 CLI 도구가 레플리카가 모두 실행될 때까지 기다리지 않는다.
  3. 018~021: 서비스는 여러 개의 레플리카로 구성된다. 서비스 네임으로 DNS 조회를 하면 가상 IP 주소 하나만이 조회된다.

실습 가장 최근에 실행한 컨테이너에서 대화식 터미널 창을 열고, API 서비스에 대해 DNS 조회를 요청하라. 첫 번째 명령의 경우 윈도 컨테이너와 리눅스 컨테이너에서 다른 명령이 쓰이지만, 터미널을 통해 컨테이너에 접속하고 나면 나머지 명령은 동일하다.

  • 가상 IP 주소를 확인하려면 레플리카 컨테이너에서 터미널로 접속하는 방법이 가장 간단하다.
  • 터미널에서 서비스 네임으로 DNS를 조회해 응답에서 IP 주소를 확인하면 된다.
001) # 컨테이너에 터미널로 접속한다.
002)  docker container exec -it $(docker container ls --last 1 -q) sh 
003) /app # nslookup iotd
004) Name:      iotd
005) Address 1: 10.0.1.2
006) 
007) # DNS 조회하기
008) /app # nslookup accesslog
009) Name:      accesslog
010) Address 1: 10.0.1.7
  1. 002: 가장 최근에 실행한 컨테이너의 식별자를 구해 이 컨테이너 내부와 연결된 터미널 세션을 연다. 이 컨테이너는 어느 서비스에 속한 레플리카라도 무방하다.
  2. 005: 서비스가 여러 개의 레플리카로 구성됐지만 각 서비스마다 IP 주소는 하나만 조회됐다.

VIP 네트워크 * VIP 네트워크는 리눅스와 윈도 두 환경 모두에서 지원하는데, 네트워크 트래픽을 고르게 분배하는 로드 밸런싱에 훨씬 더 유리하다. * 서비스의 스케일링 규모와 상관없이 DNS 조회 결과에는 IP 주소가 하나만 조회됐다. * 클라이언트가 이 IP 주소로 요청을 보내면, 운영체제의 네트워크 계층에서 이 IP 주소의 종착점이 여러 곳임을 파악하고 그중 하나를 결정해 준다. * 스웜 모드는 클러스터로 들어오는 트래픽을 처리하는 복잡한 과정을 드러내지 않고 숨겨 둔다. * 컨테이너가 실행 중이 아닌 노드에 요청이 도달하면, 해당 노드가 받은 요청을 처리하지 못하기 때문에 요청을 처리할 수 있는 다른 노드로 요청을 포워딩한다. * 요청이 도달한 노드에서 컨테이너가 여러 개 실행 중이라면, 도커 엔진이 컨테이너 간에 고르게 요청을 배분한다.

예시 * 예를 들어 열 개 레플리카로 실행되는 웹 애플리케이션이 있다고 하자. * 클러스터의 노드가 20개라면, 웹 애플리케이션 컨테이너를 실행하지 않는 노드가 있을 수 있다. * 그런데 스웜은 클러스터에 인입되는 요청을 웹 애플리케이션 컨테이너를 실행 중인 노드로만 전달해야 한다. * 반대로 클러스터의 노드가 다섯 개뿐이었다면 한 노드에서도 컨테이너를 여러 개 실행 중일 것이므로 한 노드에서 실행 중인 컨테이너끼리도 로드 밸런싱을 해야 한다. * 스웜은 인그레스 네트 워킹(ngress networking)을 이용해 이런 문제를 해결한다.

실습 NASA 오늘의 천문 사진 애플리케이션의 마지막 구성 요소인 웹 애플리케이션을 실행할 차례다. 웹 애플리케이션을 스웜 서비스 형태로 실행하고 공개할 포트를 지정하면, 인그레스 네트워크가 적용된다.

  • 서비스의 포트를 공개하면 인그레스 네트워크가 기본적으로 적용된다.
  • 서비스를 생성할 때 공개할 포트를 지정하기만 하면 인그레스 네트워크를 사용할 수 있다.
001) # 웹 프론트엔드를 실행한다.
002)  docker service create --detach --name image-gallery --network iotd-net --publish 8010:80 --replicas 2 diamol/ch09-image-gallery
003) image replicas:latest could not be accessed on a registry to record
004) its digest. Each node will access replicas:latest independently,
005) possibly leading to different nodes running different
006) versions of the image.
007) 
008) qqpdwarhabwxslfhmqhjmzuk8
009) 
010) # 서비스의 목록 확인
011)  docker service ls
012) ID             NAME            MODE         REPLICAS   IMAGE                                 PORTS
013) yfivcbheg23k   accesslog       replicated   2/2        diamol/ch09-access-log:latest         
014) qqpdwarhabwx   image-gallery   replicated   2/2        diamol/ch09-image-gallery:latest      *:8010->80/tcp
015) efhl51hbn7zq   iotd            replicated   3/3        diamol/ch09-image-of-the-day:latest   
  1. 002: 도커 스웜에서 공개 포트가 있는 서비스를 생성하면, 해당 포트는 인그레스 네트워크에서 외부 공개된다.
  2. 014: 이 서비스는 두 개의 레플리카로 구성되지만, 한 포트를 주시 중이다. 내부적으로는 인그레스 네트워크가 해당 포트를 주시하며 이 포트로 인입되는 트래픽을 레플리카로 전달해 준다.

links

social