2 개의 LB 를 둔다. 앞의 LB 는 L7 LB 로, 주소를 보고 트래픽을 전달해준다. 뒤의 LB 는 L4 LB 로, 앞에서 주소를 보고 분산해줬으므로, 컨테이너들에게 라운드 로빈 방식으로 트래픽을 전달해준다
이를 통해 분리 및 동시 개발이 가능해지며, 개발 언어를 통일 시키지 않아도 된다. 또한, 각 파트끼리는 API 나 HTTP 를 이용해 통신한다
주소를 기준으로 파트를 나눴으므로, 주소에 대한 트래픽 부하에 따라, 각 파트의 Scale 을 조정할 수 있다
- Scale up : 컨테이너의 자원을 늘린다
- Scale out : 컨테이너의 수를 늘린다
Ingress Network 는 외부에서 들어오는 접근을 컨테이너에 연결해준다
위와 같은 방식을 통해 L7 LB 와 L4 LB 환경을 구현할 수 있다
docker node update --label-rm zone worker1
worker1 - region=seoul , customer=lg
worker2 - region=seoul , customer=kia
worker3 - region=jeju , customer=lg
version: '3.7'
services:
nginx:
image: nginx
deploy:
replicas: 3
placement:
constraints:
- node.labels.region==seoul
- node.labels.customer==lg
restart_policy:
condition: on-failure
max_attempts: 2
environment:
SERVICE_PORTS: 80
networks:
- web
proxy:
image: dockercloud/haproxy
depends_on:
- nginx
volumes:
- /var/run/docker.sock:/var/run/docker.sock
ports: # -p option, attached to ingress network
- "8001:80"
networks: # backend network -> nginx containers
- web
deploy:
mode: global
placement:
constraints: [node.role==manager]
networks:
web:
external: true
- 다수의 placement 를 줄 때에는 list 형태를 사용할 수 있다. 이때, 이 조건 list 를 모두 만족하는 Node 에게만 컨테이너를 배치한다. 이는 AND 연산으로 동작한다
- 즉, label 에 seoul 과 lg 가 다 붙어있는 Node 에게 배포하는 것이다
- compose 에서는 디렉터리를 기준으로 작업 공간이 나뉘어진다