Cloud System Engineer

도커 swarm 본문

리눅스/docker

도커 swarm

클라우드 엔지니어 2021. 2. 5. 23:53

도커엔진을 구동하다가 시스템 자원이 모자랄때 방법이 된다.

여러대의 서버를 클러스터로 만들어 자원을 병렬로 확장하는 것이다.
하지만 여러 대의 서버를 하나의 자원 풀로 만들게되면 새로운 컨테이너가 추가되었을때 로드벨런스 문제,
클러스터 내의 서버가  다운됐을때 고가용성을 어떻게 보장할지  문제로 남는다.
이 문제를 해결해줄 방법: 오픈소스 솔루션 중 대표적인 것이 도커스웜(docker swarm),스웜모드(swarm mode)이다.

 

스웜 클래식이 여러대의 도커 서버를 하나의 지점에서 사용하도록 단일
접근점을 제공한다면 스웜 모드는 클러스터링 기능에 초점을 마추고 있다.

스윔 모드는 매니저 노드와 워커 노트로 구성되어 있다.
워커노드는 실제로 컨테이너가 생성되고 관리되는 도커서버이고 매니저 노드는
워크노드를 관리하기 위한 도커 서버이다. 기본적으로 매니저 노드는 워커노드의 역할
을 포함하고 있다. 매니저 노드는 1개이상이어야한다.

 

스웜매니저는 기본적으로 2377번포트를 사용하며 노드 사이의 통신에
7946/tcp, 7946/udp 포트를 스웜이 사용하는 네트워크인 igress 오버레이에
4789/tcp   4789/udp 포트를 사용한다. 스웜클러스터를 구성하기 전에
해당 포트를 열어두러야 한다.

 

docker swarm init --advertise-addr 192.168.0.128

 

 

firewall-config
docker-registry
docker-swarm 체크

 

docker swarm join-token manager // 토큰확인

 

#docker swarm join-token --rotate manager  // 토큰 바꾸기

 

결과

Successfully rotated manager join token.

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

    docker swarm join --token SWMTKN-1-4jn365c7so7i90ndne7tefm7d9ywkii9a45lfxhjyxv69zefsq-7pt6dc17rwr03yn3hpeeo31y0 192.168.0.128:2377

 

## 도커 스웜 가입

 

# docker swarm join --token [도커 토큰]

 

 

 

 

매니저 1개와 워커 2개가 있다.

 

## 도커 스웜 탈퇴

docker swarm leave 
Node left the swarm. 라고 뜬다

 

 

## 웹서버 구축

 

# docker service create --name myweb --replicas 2 -p 80:80 nginx

 

결과
 nghb2vu4kgdlyu2pu15e58652
overall progress: 2 out of 2 tasks 
1/2: running   [==================================================>] 
2/2: running   [==================================================>] 
verify: Service converged 
[root@swarm-manager ~]# docker service ls
ID             NAME                  MODE         REPLICAS   IMAGE          PORTS
hvkn6oksrjeo   crazy_easley          replicated   1/1        ubuntu:14.04   
nghb2vu4kgdl   myweb                 replicated   2/2        nginx:latest   *:80->80/tcp
jmxbytas65tp   optimistic_hamilton   replicated   0/1        name:latest    

 

 

파이어 폭스에서 192.168.0.128(매니저 의 ip)

 

 

위 내용은 컨테이너들이 호스트의 80번 포트에 연결된 것이 아니며, 실제로는 각 노드의 80번 포트로 들어온 요청을 4개의
컨테이너 중 1개로 리다이렉트한다. 따라서 각 호스트의 어느 노드로 접근하든 4개의 컨테이너 중 1개에 접근한다.
스웜 모드는 라운드 로빈(round-robin) 방식으로 서비스 내에 접글할 컨테이너를 결정한다.

 

#docker service scale myweb=4  //레플리카를 4개로 늘림

 

결과

 

## global 서비스 생성하기
서비스 모드는 두가지 가 있다. 하나는 위와 같은 복제 모드로서 일반적으로 쓰이는 방식이다.
다른 하나는 글로벌 모드이다. 글로벌 서비스는 스웜 클러스터 내에서 사용할 수 있는 모드는 모드에 컨테이너를
반드시 하나씩 생성한다. 따라서 레플리카 셋의 수를 별도로 지정하지 않는다.


docker service create --name global_web --mode global nginx

 

#docker service ps global_web

 

각각 하나씩 생긴다
이중 컨테이너 하나를 삭제해보고 그 결과를 지켜보자

 

 

myweb.2 새로운 컨테이너가 생성됐음을 확인할 수 있다.

 

특정 노드가 다운됐을 떄의 반응을 살펴보자

 

worker1: service docker stop

 

 

manager:docker node ls

 

 

worker1 이 다운되었다.

 

 

manager: docker service ps myweb

swarm-worke1 에서 myweb.1 이 삭제되면서 동시에 \_myweb.1 새로운 컨테이너가 복구되었다.

 

다운됐던 노드가 다시 정상 동작을 해도 장애를 복구하기 위해 다른노드로 옮겨진 컨테이너가 해당 노드에 자동 할당되지 않는다.
scale 명령을 이용해 컨테이너의 수를 조정해야함

 

 

 

 

 

레플리카 수보다 컨테이너 수가 많아진다. 떄문에 scale 명령어를 이용해 컨테이너의 수를 조정해야함

 

docker service scale myweb=4

'리눅스 > docker' 카테고리의 다른 글

도커 컴포즈의 활용  (0) 2021.02.15
도커 스웜 노드 다루기  (0) 2021.02.11
도커 이미지 배포  (0) 2021.02.03
도커 cpu 자원 할당  (0) 2021.02.01
컨테이너 자원 할당 제한  (0) 2021.01.31