1. Docker Swarm 설정
- Swarm 모드에서 여러 노드를 관리하는 과정입니다.
- docker node ls 명령어로 노드 상태를 확인하고, 노드의 역할(manager 또는 worker)을 확인할 수 있습니다.
- 노드 승격/강등:
- docker node promote <node-name> manager: worker 노드를 manager로 승격.
- docker node demote <node-name>: manager 노드를 worker로 강등.
2. Docker 서비스 생성 및 배포
- 서비스 생성 (docker service create): Swarm 클러스터에 서비스를 배포하는 명령어입니다.
- -name: 서비스의 이름을 지정합니다.
- -replicas: 서비스의 컨테이너 수를 지정합니다. 예를 들어 -replicas 3이면 3개의 컨테이너를 배포합니다.
- -mode global: 모든 노드에 하나씩 컨테이너를 배포하는 모드입니다.
- p: 호스트의 포트를 컨테이너의 포트에 매핑하여 외부에서 접근할 수 있게 합니다. 예: p 8001:80은 호스트의 8001 포트를 컨테이너의 80 포트에 연결합니다.
- -constraint: 특정 조건을 만족하는 노드에만 서비스를 배포합니다.
- 예: -constraint node.role==worker: worker 역할을 가진 노드에만 서비스 배포
- 예: -constraint node.labels.zone==seoul: 특정 레이블(zone==seoul)을 가진 노드에만 서비스 배포
3. 서비스 상태 확인
- docker service ls: 현재 실행 중인 서비스 목록을 확인합니다.
- docker service ps <service-name>: 서비스의 각 태스크가 어느 노드에서 실행되고 있는지 확인합니다.
4. 배포 예시
- 서비스 생성 (Replicas 모드):
- 위 명령어는 worker 노드에 3개의 nginx 컨테이너를 배포하며, 외부 포트 8001을 컨테이너 포트 80에 매핑합니다.
- docker service create --name web --replicas 3 -p 8001:80 --constraint node.role==worker nginx
- 서비스 생성 (Global 모드):
- 위 명령어는 zone==seoul 레이블을 가진 노드에 각각 1개의 nginx 컨테이너를 배포합니다.
- docker service create --name web2 --mode global --constraint node.labels.zone==seoul nginx
5. 주요 옵션 설명
- -replicas <num>: 지정된 수만큼 컨테이너를 배포합니다. 기본적으로 Round Robin 방식으로 컨테이너가 배포됩니다.
- -mode global: 모든 노드에 각 1개의 컨테이너를 배포합니다.
- p <host-port>:<container-port>: 외부 포트와 컨테이너 포트를 연결합니다.
- -constraint: 배포할 노드에 대한 제약 조건을 설정합니다.
- node.role: worker 또는 manager 역할을 가진 노드에 배포.
- node.labels.<label-name>: 특정 레이블을 가진 노드에만 배포.
6. 서비스 생성 후 확인
- docker service ps <service-name> 명령어로 서비스가 실제로 실행 중인 노드를 확인할 수 있습니다.
정리된 요약
- Docker Swarm 클러스터에서 replicas 모드로 지정된 수만큼 컨테이너를 배포하거나, global 모드로 모든 노드에 배포할 수 있습니다.
- p 옵션을 사용하여 호스트 포트와 컨테이너 포트를 매핑하고, -constraint를 사용하여 특정 역할이나 레이블을 가진 노드에만 서비스를 배포할 수 있습니다.
- 서비스 상태는 docker service ls 및 docker service ps 명령어로 확인할 수 있습니다.
Docker Swarm 클러스터에서 -p 옵션의 유무에 따른 트래픽 흐름과 로드밸런싱에 대한 내용을 정리하면 다음과 같습니다:
1. p 옵션 없이 컨테이너 배포
- 기본 네트워크: bridge
- p 옵션 없이 배포된 컨테이너는 기본적으로 docker0 브리지 네트워크에 연결됩니다.
- 이 경우 ingress(overlay) 네트워크를 통한 로드밸런싱이 되지 않으며, 특정 서버에 해당 서비스에 포함된 컨테이너가 없으면 웹 페이지를 볼 수 없게 됩니다.
2. p 옵션을 사용한 컨테이너 배포
- 네트워크 연결: ingress
- p 옵션을 사용하여 서비스 배포 시, 컨테이너는 ingress 네트워크에 연결됩니다.
- 로드밸런싱 지원: ingress 네트워크는 Swarm 모드에서 서비스 내 여러 컨테이너들 간 로드밸런싱을 지원합니다.
- 따라서, 안정적인 배포를 위해 반드시 사용해야 합니다.
3. 트래픽 흐름 및 로드밸런싱
- 외부 트래픽 수집: 외부에서 들어오는 트래픽은 **docker_gwbridge*가 수집합니다.
- docker_gwbridge는 외부 네트워크와 ingress 네트워크 사이의 게이트웨이 역할을 하며, 트래픽을 ingress 네트워크의 VIP(Virtual IP)로 전달합니다.
- 트래픽 라우팅: ingress 네트워크 내의 VIP는 서비스의 백엔드 컨테이너 IP 주소로 트래픽을 라운드로빈 방식으로 분배합니다.
- 컨테이너가 없는 서버로 접속한 경우에도, 다른 노드에 있는 컨테이너로 트래픽이 라우팅되어, 웹 페이지를 볼 수 있게 됩니다.
정리된 흐름
- p 옵션 없이 배포: 컨테이너는 docker0 브리지 네트워크에 연결되어 로드밸런싱이 되지 않으며, 특정 서버에 컨테이너가 없으면 웹 페이지를 볼 수 없습니다.
- p 옵션을 추가한 경우: 외부 트래픽은 docker_gwbridge를 통해 ingress 네트워크로 전달되고, VIP를 통한 로드밸런싱이 이루어지며, 어떤 서버에도 컨테이너가 없으면 다른 노드로 트래픽이 라우팅되어 웹 페이지를 볼 수 있습니다.
Docker Swarm 클러스터에서의 **docker_gwbridge**와 Overlay 네트워크에 대해 정리한 내용은 다음과 같습니다:
1. docker_gwbridge
- *docker_gwbridge*는 클러스터에 참여하는 모든 호스트에 무조건 1개씩 배치됩니다.
- 역할: docker_gwbridge는 클러스터의 외부 네트워크와 ingress 또는 다른 overlay 네트워크 간의 연결을 담당합니다.
- 즉, 클러스터 내에서 외부와의 트래픽을 전달하고 라우팅하는 역할을 합니다.
2. Overlay 네트워크
- Overlay 네트워크는 Docker Swarm에서 컨테이너 간의 통신을 위해 사용하는 가상 네트워크로, 여러 개를 생성할 수 있습니다.
- 여러 overlay 네트워크가 가능하지만, 외부와의 연결을 위해서는 반드시 docker_gwbridge를 거쳐야 합니다. 즉, docker_gwbridge가 외부 네트워크와 Overlay 네트워크 간의 게이트웨이 역할을 합니다.
정리
- *docker_gwbridge*는 모든 클러스터 노드에 1개씩 배치되어 외부 네트워크와 ingress 및 overlay 네트워크 간의 연결을 담당합니다.
- Overlay 네트워크는 여러 개가 존재할 수 있지만, 외부와의 연결을 위해서는 반드시 docker_gwbridge를 통해야 하며, docker_gwbridge가 외부 트래픽을 클러스터 내 Overlay 네트워크로 라우팅합니다.