Docker 6일차
Docker Swarm
-
하나의 호스트 머신에서 도커 엔진을 구동하다가 시스템 자원이 모자랄 때 좋은 대안이 된다.
-
이는 여러 대의 서버를 클러스터로 만들어 자원을 병렬로 확장하는 것이다.
-
그러나 여러 대의 서버를 하나의 자원 풀로 만들게 되면 새로운 서버나 컨테이너가 추가됐을 때 이를 발견(Service Discovery)하는 작업부터 어떤 서버에 컨테이너를 할당할 것인가에 대한 스케줄러와 로드밸런서 문제, 클러스터 내의 서버가 다운됐을 때 고가용성을 어떻게 보장할지 등이 문제로 남는다.
-
이러한 문제를 해결해 주는 오픈소스 솔루션 중 대표적인 것이 도커 스웜(docker swarm) 과 스웜 모드(swarm mode)이다.
Swarm classic 과 Docker swarm mode
-
이 두가지는 여러 대의 도커 서버를 하나의 클러스터로 만들어 컨테이너를 생성하는 기능을 제공한다.
-
도커 스웜에는 두 가지 종류가 있다. 도커 버전 1.6 이후부터 사용할 수 있는 컨 테이너로서의 스웜이고, 두 번째는 도커 버전 1.12 이후부터 사용할 수 있는 도커 스웜 모드 (Swarm Mode)이다.
-
스웜 클래식은 여러 대의 도커 서버를 하나의 지점에서 사용하도록 단일 접근점을 제공한다면 스웜 모드는 클러스터링 기능에 초점을 맞추고 있다.
-
여러 개의 도커 서버를 하나의 클러스터로 구성하려면 각종 정보를 저장하고 동기화하는 분산 코디네이터, 클러스터 내의 서버를 관리하고 제어하는 매니저, 각 서버를 제어하는 에이전트가 있어야 한다.
-
스웜 클래식은 분산 코디네이터, 에이전트 등이 별도로 실행돼야 하지만, 스웜 모드는 클러스터링을 위한 모든 도구가 도커 엔진 자체에 내장돼 있다.
-
스웜 모드는 도커 엔진 자체에 내장돼 있다.
-
서버 클러스터링을 할 때는 반드시 각 서버의 시각을 NTP 등의 툴을 이용해 동기화해야 한다.
도커 스웜 모드의 구조
-
스웜 모드는 매니저 노드와 워커(Worker) 노드로 구성돼 있다.
-
워커 노드는 실제로 컨테이너가 생성되고 관리되는 도커 서버이고 매니저 노드는 워커 노드를 관리하기 위한 도커 서버이다.
-
기본적으로 매니저 노드는 워커 노드의 역할을 포함하고 있다.
-
매니저 노드는 1개 이상이어야 하지만 워커 노드는 없을 수도 있다.
# 도커 스윔 모드 클러스터 구축
Manager, Worker1 - 2]
vi /etc/hostname
!
manager, worker1, worker2
!
vi /etc/sysconfig/entwork-scripts/ifcfg-ens33 // 100:manager, 101:worker1, 102:worker2
systemctl restart network
init6
Manager]
firewall-cmd --zone=public --permanent --add-port=2377/tcp
firewall-cmd --zone=public --permanent --add-port=7946/tcp
firewall-cmd --zone=public --permanent --add-port=7946/udp
firewall-cmd --zone=public --permanent --add-port=4789/tcp
firewall-cmd --zone=public --permanent --add-port=4789/udp
firewall-cmd --reload
worker1 - 2]
firewall-config // docker-swarm 추가
Manager]
docker swarm init --advertise-addr 192.168.0.100 // 이제부터 광고하겠다.
worker1 - 2]
docker swarm join --token SWMTKN-1-59xgyn9l9oqi9mjtfcpvro4smk79geds1wx42o0xd32g69wkzs-0aqcu8dtiu3aem22j5odzvf03 192.168.0.100:2377 // worker1에 복붙, 매니저와 워커로 클러스트로 엮임
docker node ls // 클러스트로 엮인 노드 확인
docker swarm join-token manager => token key 확인할 수 있다.
docker swarm leave --force // 해당 클러스터에서 manager에서 떠나짐
docker swarm leave // 해당 클러스터에서 worker에서 떠남
docker swarm init --advertise-addr 192.168.0.100 // 다시 매니저로 이니셜라이져
worker1, worker2 에서 manage 키 값 복붙 입력
docker node ls // 노드 확인
docker node promote worker1 // 매니저가 죽으면 대책이 없기때문에 worker1을 MANAGER의 Reachable 상태로 만듦
worker1]
docker node ls // 이제 node ls 명령어를 사용할 수 있게됨
Manager]
docker node demote worker1 // demote 명령어로 worker1의 manager node를 삭제
도커 스웜 모드 서비스
-
도커 명령어의 제어 단위는 컨테이너이다. 그러나 스웜 모드에서 제어하는 단위는 서비스(Service)이다.
-
서비스는 같은 이미지에서 생성된 컨테이너의 집합이며, 서비스를 제어하면 해당 서비스 내의 컨테이너에 같은 명령이 수행된다.
-
서비스 내에 존재하는 컨테이너들을 태스크(Task)라고 한다.
-
예를들어 serviceA라는 서버(레플리카)가 3대일때 1대가 다운되면 나머지 노드 2대중에 1대에 자동 복구되어 생성된다.
-
그래서 스웜모드를 쓴다. 이를 복구, 생성하는건 매니저에서 설정한다.
# 스윔 모드 서비스
Manager]
docker service create ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done" // 서비스 내의 컨테이너를 생성하며 동시에 1초마다 헬로 월드 출력
docker service ls // 서비스 확인
docker service rm [ID] // 해당 명령어로 삭제할 수 있다.
docker ps -a
docker attach [containerID] // 1초마다 helloworld를 확인할 수 있다
docker service ls
docker service rm [ID] // 만든것 다 지웠다.
## nginx 웹 서버 서비스 생성
docker service create --name myweb --replicas 2 -p 80:80 nginx
docker service ps myweb
docker service scale myweb=4 // scale 명령어를 사용하여 레플리카 4개로 설정.
docker service ps myweb // 레플리카 4개임을 확인.
docker service rm [서비스 명]
# docker swarm network
docker network ls
docker network ls | grep ingress // 스웜 클러스터를 생성하면 자동으로 등록되는 네트워크이다. 스웜 모드를 사용할 때 유효함
worker1에서 docker ps -a로 확인된 컨테이너를 지우고 manager에서 192.168.0.101 접속해도 nginx가 뜬다.
즉, ingress네트워크는 어떤 스웜 노드에 접근하더라도 서비스 내의 컨테이너에 접근할 수 있게 설정하는 레우팅 메시를 구성하고, 서비스 내의 컨테이너에 대한 접근을 라운드 로빈 방식으로 분산하는 로드 밸런싱을 담당한다.
댓글남기기