ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Docker Swarm
    Container 2016. 3. 16. 09:00
    반응형
    도커 스웜은(Docker Swarm) 여러개의 호스트에 있는 Docker 데몬들을 관리할 수 있는 Docker 클러스터링 도구다. 도커 스웜은 도커사에서 제공하는 도구인 만큼 표준 도커 API  제공하기 때문에 기존에 도커 데몬을 사용하던 외부도구들이 그대로 스웜을 사용해서 여러개 호스트에서 도커를 사용할 수 있다. 다음 과 같은 것들은 바로 스웜을 이용할 수 있다.
    Dokku
    Docker Compose
    Krane
    Jenkins
     
    스웜에서 제공하는 기능은 다음과 같다.
    • 클러스터 내에서의 CPU, 메모리등의 자원 사용량 제한
    • 지정한 호스트에만 컨테이너를 할당하거나 할당하지 않게 하기
    • 특정 목적의 컨테이너를 하나의 호스트에 몰리지 않게 여러 호스트에 분산되어 배치하거나 하나의 호스트에만 몰아서 배치하기
    • 컨테이너나 호스트에 문제가 생겼을때 자동복구
     
    스웜은 스케쥴링에 사용하는 벡엔드 기술을 변경할 수 있는 구조여서 mesos같은  대용량 클러스터 관리도구를 사용할수도 있다.
    도커 스웜으로 클러스터를 관리하려면 우선 장비들에 다음과 같은 설정이 필요하다.
    • 노드들간의 스웜 관리자가 통신할수 있게 TCP 포트가 열려 있어야 한다.
    • 노드에 도커가 설치되어 있어야 한다.
    • 스웜의 보안성을 위해 TLS 인증이 있어야 한다.
     
    직접 수동으로 노드마다 설정을 해줄수도 있지만. 도커 머신을 이용하면 보다 빠르게 설정이 가능하고, 사용자 컴퓨터 뿐만 아니라 다양한 클라우드 서비스에도 구성이 가능하다.
     
     
    스웜 구성하기
    도커 머신을 이용해서 로컬 컴퓨터에서 vm 이용해서 도커 스웜 클러스터를 구성해 보자. 우선 도커 머신으로 사용할 VM 준비한다.
    docker-machine create -d virtualbox local
    VM 생성되면 VM 사용할 있게 셀에 환경설정을 한다.
    eval "$(docker-machine env local)"
    도커 스웜이미지를 이용해서 스웜에서 사용할 토큰을 생성한다.
    docker run swarm create
    이렇게하면 마지막에 토큰 정보가 나온걸 확인할 있다.
    여기서는 49897084f229df438c20e5f340071aec이다.
     
    스웜 관리자는 스웜 클러스터의 도커 노드(Docker node) 관리하기 위한 시스템이다.
    도커머신을 이용해서 스웜 관리자를 생성해 보자. 이때 token 부분에 들어가는 값은 위에서 만들었던 8313186cb9b18ec1138e6e555b269a3d 이용하면 된다. 사용자들은 직접 생성한 값을 이용하면 된다.
    docker-machine create -d virtualbox --swarm --swarm-master --swarm-discovery token://49897084f229df438c20e5f340071aec swarm-master
    swarm-master라는 이름으로 스웜 관리자로 사용할 VM 만든다.
    이후에 아래처럼 스웜에서 사용할 노드를 2 추가해 보자.
     
    docker-machine create -d virtualbox --swarm --swarm-discovery token://49897084f229df438c20e5f340071aec swarm-node01
    docker-machine create -d virtualbox --swarm --swarm-discovery token://49897084f229df438c20e5f340071aec swarm-node02
     
    여기까지하면 스웜에서 사용할 관리자 노드와 에이전트 노드가 모두 생성된다.
    docker-machine ls 통해서 VM들이 생성된 확인할 있다.
     
    스웜클러스터가 제대로 구성됐는지 확인하기 위해서 swarm-master VM 명령을 실행할 있게 셸에 환경을 설정한다.
    eval $(docker-machine env --swarm swarm-master)
     
    docker info 하면 보통 docker info 실행했을때와는 다르게 스웜 관련 정보들이 있는걸 확인할 있다.
     
    docker ps –a 실행하면 swarm-master VM안에 스웜용 컨테이너들이 실행되 있는걸 확인할 있다.
     
    마지막의 NAMES 항목을 보면 노드에 어떤 컨테이너들이 있는지 확인할 있다.
    Swarm-master에는 swarm-agent-master swarm-agent 있고, swarm-node01, 02에는 swarm-agent 있다.
    이제 상태에서 hello-world 이미지를 실행해 보자.
    docker run hello-world
    실행된 다음에 docker ps –a 통해서 확인해 보면 hello-world 이미지가 swarm-node02 에서 실행됐던걸 있다.
     
     
    스웜 사용하기
    스웜 클러스터 내에 이미지를 실행할때 원하는 만큼 자원을 할당할 있다.
    docker run -d --cpu-shares 1 -m 512m --name nginx01 nginx
    위와 같이 실행하면 스웜은 cpu 코어를 1 사용하고 메모리를 512m 사용하는 nginx 컨테이너를 스웜 노드에 실행한다. 스웜 클러스터내에서 지정한 만큼의 자원이 사용가능한 노드가 있으면 노드에서 컨테이너가 실행되게 된다. 지정된 만큼의 자원을 가진 노드가 없으면 다음과 같은 에러를 내면서 컨테이너를 실행하지 못한다.
    Error response from daemon: no resources available to schedule container
     
    컨테이너가 실행됐으면 docker ps –a 이용해서 어떤 노드에 실행됐는지 확인할 있다.  여기서는 swarm-node01 VM 컨테이너가 떠있는걸 있다. 이상태에서 다시  docker info 사용해서 사용량을 확인해 보면 nginx 컨테이너가 swarm-node01 자원중 CPU 1 사용중이고 메모리를 512M 만큼 사용하고 있는걸 확인할 있다.
     
    앞에서는 자원 사용량만을 가지고 컨테이너를 실행했었다. 스웜에서는 밖에도 다양한 옵션을 사용해서 클러스터상에서 컨테이너를 실행할 있다. 예를들어 특정 조건이 맞는 노드들을 지정해서 거기에만 컨테이너를 실행하게 할수도 있고, 반대로 특정 조건에 해당하는 노드들에는 컨테이너를 실행하지 못하게 할수도 있다.
    조건을 지정하기 위해서는 컨테이너를 실행할때 constraint 옵션을 지정할 있는데 이때 label정보를 이용한다. 그래서 앞서 만든 클러스터에 레이블이 다른 노드를 하나 추가해 보자.
    docker-machine create -d virtualbox --swarm --swarm-discovery token://49897084f229df438c20e5f340071aec  --engine-label storage=ssd swarm-node03
    이렇게 하면 storage ssd라고 표기한 노드가 추가된다. 실제 환경에서는 이외에도 다양한 환경이 있을 있다.
    이제 storage ssd 노드에서 컨테이너가 실행되게 해보자.
    docker run -d -e constraint:storage==ssd mysql
    이렇게 실행하면 레이블에서 storage ssd swarm-node03 노드에서 컨테이너가 실행된걸 확인할 있다. 클러스터 내에는 다양한 환경의 노드가 있을 있는데 기능을 이용하면 그런 노드들 중에서 특성에 맞는 노드만 사용하는 것이 가능해진다. 앞서 봤던 것처럼 ssd 가지고 있는 노드들에서는 디스크 IO 중요한 DB 실행하게 할수도 있고, 노드별로 OS 다를 경우에도 특정 OS 지정해서 컨테이너를 실행할수도 있다.
     
    클러스터내에 컨테이너가 여러개 있을때 비슷한 역할을 하는 컨테이너들이 하나의 노드에 있는것보다는 여러개의 노드에 분산되어 실행되는 것이 좋다. 이런 동작을 지원하기 위해서 스웜에서는 affinity라는 옵션을 지원한다.
    docker run -d --name redis01 -e ‘affinity:container!=redis0*’ redis
    docker run -d --name redis02 -e ‘affinity:container!=redis0*’ redis
    docker run -d --name redis03 -e ‘affinity:container!=redis0*’ redis
    이렇게 실행하면 레디스 컨테이너들이 겹치지 않고 전체 클러스터 노드에 고르게 분산되어 실행되는걸 확인할 있다.
     
    constraint affinity 조건을 설정할때는 앞서 봤던것 처럼 키와 값으로 구성되어 있다.
    값에 있는 형식은 다음과 같다.
    사용가능한 문자 : 알파벳, 숫자, 소수점(.), 하이픈(-), 언더바(_)
    * 이용한 검색
    /regexp/형식의 정규표현식
    연산자로는 == != 사용할 있다.
     
    디스커버리
    ./etcd --listen-client-urls http://0.0.0.0:2379,http://0.0.0.0:4001 --advertise-client-urls http://0.0.0.0:2379,http://0.0.0.0:4001
     
    docker-machine create -d virtualbox --swarm --swarm-master  --swarm-discovery etcd://192.168.99.1:4001/  swarm-master
    docker-machine create -d virtualbox --swarm  --swarm-discovery etcd://192.168.99.1:4001/  swarm-node01
    docker-machine create -d virtualbox --swarm  --swarm-discovery etcd://192.168.99.1:4001/  swarm-node02
     
     
     
    스웜 고가용성
    스웜으로 구성된 클러스터는 스웜 관리자가 관리한다. 그런데 스웜 마스터에 문제가 생기면 클러스터 관리에 문제가 발생할 있다. 이런 부분을 방지하기 위해서 스웜은 하나의 실행중인 스웜 관리자를 두고 여러대의 백업 관리자를 있는 방식을 제공하고 있다. 이렇게 되면 관리자에 문제가 생겼을때 백업 관리자를 통해서 스웜 클러스터를 관리할 있게 된다.
    구성에 대해서 살펴보자.
     
    아직 docker-machine으로는  안된다
    docker-machine create -d virtualbox --swarm --swarm-master  --swarm-discovery etcd://192.168.99.1:4001/  --swarm-opt replication=true  swarm-master01
     
     
     
    참고자료
     
     
    반응형

    'Container' 카테고리의 다른 글

    DockerHub 사용하기  (1) 2016.03.21
    Docker Toolbox  (0) 2016.03.18
    Docker Registry  (0) 2016.03.14
    Docker Machine  (0) 2016.03.11
    Docker Kitematic  (0) 2016.03.09

    댓글

Designed by Tistory.