Docker Engine을 Swarm 모드로 실행하기
Docker Engine을 Swarm 모드로 실행하기
Docker Engine을 처음 설치하고 사용하기 시작하면 Swarm 모드는 기본적으로 비활성화되어 있어요. Swarm 모드를 활성화하면 docker service 명령으로 관리하는 서비스 개념을 사용하게 되죠. Swarm 모드로 엔진을 실행하는 방법은 두 가지가 있어요. 하나는 새 Swarm을 만드는 것이고, 다른 하나는 기존 Swarm에 합류하는 거예요. 이 글에서는 새 Swarm을 만드는 방법을 설명할게요.
출처: 공식문서
본문
Swarm 만들기
Swarm을 생성하는 명령을 실행하면 Docker Engine이 Swarm 모드로 동작하기 시작해요. docker swarm init 명령을 실행하면 현재 노드에 단일 노드 Swarm이 만들어지죠. 엔진은 다음과 같이 Swarm을 설정해요:
- 현재 노드를 Swarm 모드로 전환해요.
default라는 이름의 Swarm을 생성해요.- 현재 노드를 Swarm의 리더 매니저 노드로 지정해요.
- 노드 이름을 머신의 호스트네임으로 지정해요.
- 매니저가 활성 네트워크 인터페이스의
2377포트에서 수신하도록 구성해요. - 현재 노드를
Active가용성 상태로 설정해서 스케줄러가 작업을 받을 수 있게 해요. - Swarm에 참여하는 엔진들이 Swarm과 그 위에서 실행되는 모든 서비스에 대해 일관된 상태를 유지하도록 내부 분산 데이터 저장소를 시작해요.
- 기본적으로 Swarm용 자체 서명 루트 CA를 생성해요.
- 기본적으로 워커 노드와 매니저 노드가 Swarm에 합류할 때 사용할 토큰을 생성해요.
- Swarm 외부로 서비스 포트를 게시하기 위한
ingress라는 오버레이 네트워크를 생성해요. - 네트워크를 위한 기본 IP 주소와 서브넷 마스크를 가진 오버레이 네트워크를 생성해요.
docker swarm init의 출력에는 새 워커 노드를 Swarm에 합류시킬 때 사용할 연결 명령이 포함되어 있어요:
$ docker swarm init
Swarm initialized: current node (dxn1zf6l61qsb1josjja83ngz) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
192.168.99.100:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
기본 주소 풀 구성하기
기본적으로 Swarm 모드는 글로벌 스코프(오버레이) 네트워크를 위해 기본 주소 풀 10.0.0.0/8을 사용해요. 서브넷이 지정되지 않은 모든 네트워크는 이 풀에서 순차적으로 서브넷을 할당받게 되죠. 상황에 따라 네트워크용 기본 IP 주소 풀을 다르게 사용하고 싶을 수도 있어요.
예를 들어, 기본 10.0.0.0/8 범위가 네트워크에서 이미 할당된 주소 공간과 충돌한다면, Swarm 사용자들이 매번 --subnet 명령으로 서브넷을 지정하지 않아도 다른 범위를 사용하도록 하고 싶을 거예요.
사용자 정의 기본 주소 풀을 구성하려면 Swarm 초기화 시 --default-addr-pool 명령줄 옵션으로 풀을 정의해야 해요. 이 옵션은 서브넷 마스크를 정의할 때 CIDR 표기법을 사용해요. Swarm용 사용자 정의 주소 풀을 만들려면 기본 주소 풀을 하나 이상 정의해야 하고, 선택적으로 기본 주소 풀 서브넷 마스크 길이를 지정할 수 있어요. 예를 들어 10.0.0.0/27의 경우 값 27을 사용하면 돼요.
Docker는 --default-addr-pool 옵션으로 지정된 주소 범위에서 서브넷 주소를 할당해요. 예를 들어 --default-addr-pool 10.10.0.0/16 옵션을 사용하면 Docker는 그 /16 주소 범위에서 서브넷을 할당하게 되죠. --default-addr-pool-mask-len을 지정하지 않거나 명시적으로 24로 설정하면 10.10.X.0/24 형태의 /24 네트워크가 256개 생성돼요.
서브넷 범위는 --default-addr-pool(예: 10.10.0.0/16)에서 나와요. 여기서 16이라는 크기는 해당 default-addr-pool 범위 안에서 만들 수 있는 네트워크 수를 나타내요. --default-addr-pool 옵션은 여러 번 사용할 수 있으며, 각 옵션은 Docker가 오버레이 서브넷에 사용할 추가 주소를 제공해요.
명령 형식은 다음과 같아요:
$ docker swarm init --default-addr-pool <IP range in CIDR> [--default-addr-pool <IP range in CIDR> --default-addr-pool-mask-length <CIDR value>]
10.20.0.0 네트워크에 /16(클래스 B) 기본 IP 주소 풀을 만드는 명령은 다음과 같아요:
$ docker swarm init --default-addr-pool 10.20.0.0/16
10.20.0.0과 10.30.0.0 네트워크에 각각 /16(클래스 B) 기본 IP 주소 풀을 만들고, 각 네트워크에 /26 서브넷 마스크를 적용하는 명령은 다음과 같아요:
$ docker swarm init --default-addr-pool 10.20.0.0/16 --default-addr-pool 10.30.0.0/16 --default-addr-pool-mask-length 26
이 예시에서 docker network create -d overlay net1은 net1에 10.20.0.0/26 서브넷을 할당하고, docker network create -d overlay net2는 net2에 10.20.0.64/26 서브넷을 할당해요. 이런 식으로 모든 서브넷이 소진될 때까지 계속됩니다.
자세한 내용은 다음 페이지를 참고하세요:
- Swarm 네트워킹 - 기본 주소 풀 사용에 대한 자세한 정보
docker swarm initCLI 참조 ---default-addr-pool플래그에 대한 자세한 설명
광고 주소 구성하기
매니저 노드는 광고 주소(advertise address)를 사용해서 Swarm 내 다른 노드들이 Swarmkit API와 오버레이 네트워킹에 접근할 수 있게 해요. Swarm의 다른 노드들은 매니저 노드의 광고 주소로 접근할 수 있어야 하죠.
광고 주소를 지정하지 않으면 Docker는 시스템에 IP 주소가 하나만 있는지 확인해요. 하나만 있다면 Docker는 기본적으로 리스닝 포트 2377과 함께 그 IP 주소를 사용해요. 시스템에 IP 주소가 여러 개 있다면, 매니저 간 통신과 오버레이 네트워킹을 활성화하기 위해 올바른 --advertise-addr을 지정해야 해요:
$ docker swarm init --advertise-addr <MANAGER-IP>
다른 노드들이 첫 번째 매니저 노드에 접근하는 주소가 매니저가 자신의 주소로 인식하는 주소와 다를 때도 --advertise-addr을 지정해야 해요. 예를 들어, 여러 리전에 걸친 클라우드 설정에서는 호스트가 리전 내 접근용 내부 주소와 리전 외부에서 접근할 때 사용하는 외부 주소를 모두 가지게 되죠. 이 경우 --advertise-addr에 외부 주소를 지정해서 노드가 이후 연결되는 다른 노드들에게 그 정보를 전파할 수 있게 해야 해요.
광고 주소에 대한 자세한 내용은 docker swarm init CLI 참조를 확인하세요.
조인 명령 확인 또는 Swarm 조인 토큰 갱신하기
노드가 Swarm에 합류하려면 비밀 토큰이 필요해요. 워커 노드용 토큰과 매니저 노드용 토큰은 서로 달라요. 노드는 Swarm에 합류하는 순간에만 조인 토큰을 사용해요. 노드가 이미 Swarm에 합류한 후 조인 토큰을 회전시켜도 해당 노드의 Swarm 멤버십에는 영향을 주지 않아요. 토큰 회전은 새 노드가 Swarm에 합류하려 할 때 이전 토큰을 사용할 수 없도록 보장해줘요.
워커 노드용 조인 명령과 토큰을 확인하려면 다음을 실행하세요:
$ docker swarm join-token worker
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
192.168.99.100:2377
This node joined a swarm as a worker.
매니저 노드용 조인 명령과 토큰을 확인하려면 다음을 실행하세요:
$ docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-59egwe8qangbzbqb3ryawxzk3jn97ifahlsrw01yar60pmkr90-bdjfnkcflhooyafetgjod97sz \
192.168.99.100:2377
--quiet 플래그를 사용하면 토큰만 출력해요:
$ docker swarm join-token --quiet worker
SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c
조인 토큰은 Swarm에 합류하는 데 필요한 비밀이므로 주의해서 다뤄야 해요. 특히 토큰을 버전 관리 시스템에 커밋하는 것은 좋지 않은 습관이에요. 애플리케이션 소스 코드에 접근할 수 있는 사람이라면 누구나 Swarm에 새 노드를 추가할 수 있게 되거든요. 매니저 토큰은 특히 민감해요. 새 매니저 노드가 합류해서 전체 Swarm을 제어할 수 있게 되기 때문이에요.
다음과 같은 상황에서는 조인 토큰을 회전시키는 것을 권장해요:
- 토큰이 실수로 버전 관리 시스템이나 그룹 채팅에 커밋되었거나 로그에 출력된 경우
- 노드가 손상되었다고 의심되는 경우
- 새 노드가 Swarm에 합류할 수 없도록 보장하고 싶은 경우
또한 Swarm 조인 토큰을 포함한 모든 비밀 정보는 정기적으로 회전시키는 것이 모범 사례예요. 최소 6개월마다 토큰을 회전시키는 것을 권장해요.
swarm join-token --rotate를 실행하면 이전 토큰을 무효화하고 새 토큰을 생성해요. worker 또는 manager 노드 중 어떤 토큰을 회전시킬지 지정하면 돼요:
$ docker swarm join-token --rotate worker
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-2kscvs0zuymrsc9t0ocyy1rdns9dhaodvpl639j2bqx55uptag-ebmn5u927reawo27s3azntd44 \
192.168.99.100:2377
더 알아보기
- 노드를 Swarm에 합류시키기
swarm init명령줄 참조- Swarm 모드 튜토리얼