Ubuntu에서 Docker Swarm 클러스터를 구축합니다.

소개



Ubuntu 16.0.4의 서버를 3대 준비하고 그것을 Docker Swarm에서 클러스터를 짜서 그것을 정리했습니다.



구성



이번 구성은 3대 모두 manager&worker로 클러스터를 구성하는 구성입니다.

이미지


Docker 설치



우선 모든 서버에 docker-engine을 설치합니다.

이미지


먼저 apt를 https를 통해 사용할 수 있도록 라이브러리를 설치합니다.

필수 라이브라이 설치
$ sudo apt-get install apt-transport-https ca-certificates

그런 다음 docker를 설치하는 데 사용할 리포지토리를 추가합니다.

리포지토리 추가
$ sudo vim /etc/apt/sources.list.d/docker.list

$ cat /etc/apt/sources.list.d/docker.list
deb https://apt.dockerproject.org/repo ubuntu-xenial main

apt 업데이트
$ sudo apt-get update

준비가 되면 docker-engine을 설치합니다.

docker 설치
$ apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
$ sudo apt-get install docker-engine

이번에는 사용하지 않지만 docker compose도 설치합니다.

compose 설치
$ apt-get install docker-compose

또한 우분투 사용자가 docker 명령을 사용할 수 있도록 docker 그룹에 연결합니다.

그룹 추가
$ sudo gpasswd -a ubuntu docker

추가한 후 다시 로그인하여 작업을 진행합니다.

마스터 (리더) 노드 만들기



이번에는 3대 모두 manager node로 합니다. 우선은 manager 의 master 가 되는 1대를 작성합니다.

이미지


manager (Leader) 만들기
$ docker swarm init 
Swarm initialized: current node (71uuiqwvlcizxln4bfk3gvr4a) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join \
    --token SWMTKN-1-0ymf7p2vy09a15usvwbb6ya04hqg7b0aaupj0xp3vfy137nrhr-5k87wh49qn3j7ml6b8kxiz5t7 \
    172.31.17.88:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

여기서 init 했을 때에 나오는 것은 worker용의 token 입니다. 이번에는 manager용의 token 을 원하기 때문에 다음의 커멘드를 실행해 취득합니다.

manager용 token 취득
$ docker swarm join-token manager
To add a manager to this swarm, run the following command:

    docker swarm join \
    --token SWMTKN-1-0ymf7p2vy09a15usvwbb6ya04hqg7b0aaupj0xp3vfy137nrhr-0blrkkwxwghkddo7hk5tkcy2y \
    172.31.17.88:2377

이것으로는 각 노드가 되는 서버에 로그인해, 추가해 가는 작업이 됩니다.

노드에 참여



이제 node-2를 방금 만든 manager node에 추가합니다.

이미지


manager (Leader)에 노드 추가
$ docker swarm join --token SWMTKN-1-0ymf7p2vy09a15usvwbb6ya04hqg7b0aaupj0xp3vfy137nrhr-0blrkkwxwghkddo7hk5tkcy2y 172.31.17.88:2377
This node joined a swarm as a manager.

이제 추가되었습니다. 나머지 1대도 마찬가지로 추가합니다.

만약, manager 가 아닌 worker 로서 추가하고 싶은 경우는 --token 옵션의 값을 worker 로 해 주는 것만으로 OK입니다.

이상으로 완료입니다. 그럼 확인해 봅시다.

노드 확인
$ docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS
71uuiqwvlcizxln4bfk3gvr4a *   node-1              Ready               Active              Leader
musl2m94jqx7gb0fa953rd43j     node-3              Ready               Active              Reachable
nwhmqq24zkvgbxlbsq8zut4vo     node-2              Ready               Active              Reachable

여기서 "*"가 붙어 있는 것이 명령을 실행한 node입니다. 즉 여기에서는 node-1 로 docker node ls 를 실행했다고 하는 것입니다.
또, MANAGER STATUS 가 Leader 가 되고 있는 것이 처음에 swarm init 한 master 가 되는 node 로 Reachable 가 되어 있는 것이 추가한 node 가 됩니다. 만약 worker 로서 node 를 추가했을 경우는, 여기의 항목은 blank 가 됩니다.

배포



클러스터를 만들었으므로 무언가를 배포해 보겠습니다.
이번에는 nginx 컨테이너를 배포해 보았습니다.

배포
$ docker service create --replicas 1 --name web -p 80:80 nginx
zelm5elrp6czm1mtisk942ujx

배포가 완료되면 서비스를 확인해 봅니다.

배포 확인 (서비스)
$ docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
zelm5elrp6cz        web                 replicated          1/1                 nginx:latest        *:80->80/tcp

배포 확인(컨테이너)
$ docker service ps web
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE           ERROR               PORTS
mjbwdr63zfyo        web.1               nginx:latest        node1               Running             Running 3 minutes ago                       

node1에서 nginx 컨테이너가 1대 web라는 서비스명으로 기동하고 있는 것을 확인할 수 있었습니다.
그러면 이 서비스를 컨테이너 3대에 스케일 해 보겠습니다.

스케일
$ docker service scale web=3
web scaled to 3

스케일 확인
$ docker service ps web
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE             ERROR               PORTS
mjbwdr63zfyo        web.1               nginx:latest        node1               Running             Running 4 minutes ago                         
jmm52jos2vgl        web.2               nginx:latest        node3               Running             Running 8 seconds ago                       
sbpa751k6wwa        web.3               nginx:latest        node2               Running             Running 8 seconds ago                       

각 노드에 1대씩 컨테이너가 기동하고 있는 것을 확인할 수 있었습니다.

결론



최근에는 kubernetes이 고조되고있는 것 같습니다만,
Swarm도 그렇게 이용성은 나쁘지 않을 것 같습니다. compose 의 yml도 그대로 이용할 수 있고, 어느 것을 사용할까는 경우에 따라서 뭐일까라고 생각합니다.

좋은 웹페이지 즐겨찾기