Docker Swarm Network : ingress
Ingress 네트워크는 서비스의 노드들 간에 로드 밸런싱을 수행하는 Overlay 네트워크이다. Ingress 네트워크는 도커스웜을 init 하거나 join 할 때 자동으로 생성된다. Docker Swarm에서는 서비스를 외부에 쉽게 노출하기 위해 모든 노드가 ingress라는 가상 네트워크에 속해있다. Docker swarm의 모든 노드가 노출된 포트로 클라이언트에서 요청을 하면, 해당 요청을 IPVS라는 모듈로 전달한다. IPVS는 해당 서비스에 참여하는 모든 IP주소를 추적하고 그 중 하나를 선택한 뒤, 요청을 해당 경로로 라우팅한다.
포트를 노출할 때는 docker service create 명령에서 노출할 포트를 설정할 수 있다. 포트를 따로 지정하지 않는다면 매니저 노드는 30000~32767 범위 내에서 포트를 자동으로 할당한다.
즉, 다시 정리하면 "서비스에서 포트를 오픈하면, 모든 노드에서 포트가 오픈되고 어떤 노드에 요청을 보내도 실행 중인 컨테이너에 자동으로 전달한다." 노드1에 컨테이너가 있는데, 노드2 IP주소:포트 로 접속하면 노드1에 있는 컨테이너에 접속이 가능하다는 것이다. 이렇게 Ingress 네트워크를 통해 load balancing이 수행된다.
위 예시에서 보면 whoami 서비스로 4567포트를 오픈한다면 3 노드 모두 4567 포트가 오픈된다. 외부에서 해당 서비스에 접속할 때, 어떤 노드를 통해서 접속하든 5개의 컨테이너 중 하나로 분산처리된다.
실제 운영레벨에서는 외부에 nginx 또는 haproxy같은 로드밸런서를 둬서 하나의 IP로 전체 스웜 노드를 가리킬 수 있다.
참고 : https://docs.docker.com/engine/swarm/ingress/#/configure-an-external-load-balancer
* Ingress 네트워크 테스트
아래 명령을 통해 정말 어떤 아이피로 접속하든 랜덤하케 건테이너에 접속되는지 확인을 해볼 수 있다.
docker service create --name loadbalance_test --replicas 4 -p 80:80 utyk/swarm_loadbalance_check:1.0
아래와 같이 브라우저에서 각 노드에 대한 아이피와 포트번호 80으로 접속한 후, 새로고침을 여러번 누르면 랜덤하게 컨테이너 ID가 바뀌는 것을 확인할 수 있다. 계속 F5를 연타해보자.
Docker Swarm Network : Overlay
만약 예를들어 2개의 컨테이너가 있는데, 컨테이너1이 DB컨테이너와 접속해야 한다면, 둘다 ingress 네트워크에 배치해 외부에 노출된 상태로 통신한다면 이것은 좋은 방법이 아니다. 컨테이너간 통신을 위한 네트워크를 만들면 된다. 외부에서 접근하지 못하는 내부 컨테이너간의 네트워크에 컨테이너를 배치하여 편리함과 보안을 모두 잡을 수 있다.
# 참고 : docker_gwbridge
오버레이 네트워크(Ingress 네트워크 포함)를 개별 Docker daemon의 물리적 네트워크에 연결하는 브릿지 네트워크이다. 기본적으로, service가 실행 중인 각각의 컨테이너는 로컬 Docker daemon host의 docker_gwbridge network에 연결된다. 이 docker_gwbridge 네트워크는 docker swarm을 init 하거나 join 할 때 생성된다.
오버레이 네트워크는 Docker Swarm에 참여하는 Docker Daemon 간의 통신을 관리한다. 독립 실행 컨테이너의 네트워크를 생성하는 방법과 동일한 방식으로 생성할 수 있다. 또한 생성한 오버레이 네트워크에 Swarm service를 연결시켜 service 간에 통신을 활성화 할 수 있다. 이러한 오버레이 네트워크는 Overlay Network Driver를 사용한다.
오버레이 네트워크를 사용하면 컨테이너는 외부에 포트를 오픈하지 않아도 되고 연결되는 다른 컨테이너와(예를들어 웹과 디비) 다른 노드에 있어도 같은 서버에 있는 것처럼 통신할 수 있다.
# 오버레이 네트워크 생성하기
docker network create --attachable --driver overlay 이름(testbackend)
# 해당 오버레이 네트워크를 적용하여 서비스 생성하기
docker service create --name loadbalance_test2 --network=testbackend --replicas 4 -p 99:80 utyk/swarm_loadbalance_check:1.0
위와 같이 네트워크를 testbackend로 설정하면, 해당 서비스는 overlay 네트워크에 연결되며, 다른 컨테이너도 해당 testbackend에 연결했다면 서로 통신할 수 있게 된다. 아래의 inspect 명령으로 네트워크를 확인할 수 있다.
docker compose로 여러 컨테이너를 생성하는 경우에는 자동으로 overlay 네트워크를 생성한다. 자동으로 생성되는 overlay 네트워크의 이름을 따로 정해준다면, 아래의 예시대로 수행할 수 있다. 아래 예시는 wordpress와 db를 docker-compose로 만든 예시이다.
version: '3.1'
services:
wordpress:
image: wordpress
ports:
- 8888:80
networks:
- swarm_overlay_internal
deploy:
mode: replicated
replicas: 3
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wpuser
WORDPRESS_DB_PASSWORD: examplepass
WORDPRESS_DB_NAME: wpdb
db:
image: mysql:5.7
networks:
- swarm_overlay_internal
deploy:
mode: replicated
replicas: 3
environment:
MYSQL_DATABASE: wpdb
MYSQL_USER: wpuser
MYSQL_PASSWORD: examplepass
MYSQL_RANDOM_ROOT_PASSWORD: '1'
networks:
swarm_overlay_internal:
# 참고 : docker stack 명령
Docker swarm에서는 docker-compose를 실행하려면 docker stack 명령을 사용한다. stack 은 service 의 묶음인 최상위 단위이다. 즉 동일한 컨테이너의 묶음이 service, 이러한 service를 여러개 묶은것이 stack 이다. docker stack ls, docker stack rm 등의 명령어로 관리할 수 있다. 더 이상 자세한 설명은 생략한다.
'Docker Advanced' 카테고리의 다른 글
Docker 예제 : 단독 컨테이너 실행 예제 (0) | 2020.07.16 |
---|---|
[Docker Advanced] Docker Swarm Cluster 명령어와 작업 예시 (0) | 2020.07.02 |
[Docker Advanced] Docker Swarm Cluster 구축 (0) | 2020.07.02 |
Docker 예제 : 웹서버 어플리케이션 (0) | 2020.05.15 |