[Docker] Docker Swarm scheduler의 컨테이너 할당 방식

메린·2023년 5월 19일
0

Docker

목록 보기
2/3
post-thumbnail

Swarm 방식

  • 여러 대의 Docker 머신들을 관리할 수 있는 Tool
  • Swarm Node : Manager node, Swarm node
    • Manager node : Swarm node 들에 연결하여 Docker Daemon을 조작하여 다룬다.
    • Swarm node : Manager node에 등록되어 클러스터의 일부로써 동작한다. Manager node의 지시에 따라 컨테이너를 생성하고 실행하며, 필요에 따라 작업을 분산한다.
  • 따라서, Swarm을 사용하면 여러 Docker 호스트를 통합하여 클러스터로 관리할 수 있으며, Manager node를 통해 컨테이너 생성, 서비스 관리 및 클러스터 상태 확인 등을 수행할 수 있다.

Scheduler 란?

즉, 어느 호스트에 할당할 것인가? 라는 것에 대한 것이다.
호스트 자원 사용량

  • 호스트 자원 사용량: 스케줄러는 호스트 노드의 CPU, 메모리, 디스크 등의 자원 사용량을 고려한다. 따라서 자원 사용량이 낮은 노드에 컨테이너를 할당하려고 한다. 이는 클러스터 전체의 자원 활용을 균형있게 유지하기 위한 방법이다.

  • 컨테이너 수: 스케줄러는 각 노드에 배치된 컨테이너의 수를 고려한다. 컨테이너가 적게 있는 노드에 컨테이너를 할당하려고 한다. 이는 컨테이너를 균등하게 분산시켜 부하를 분산시키는 것을 목표로 한다.

  • 호스트 제약 조건: 스케줄러는 호스트 노드에 대한 제약 조건도 고려할 수 있습니다. 예를 들어, 특정 호스트 노드에만 특정 소프트웨어가 설치되어 있거나 특정 라벨이 설정되어 있는 경우, 해당 조건을 충족하는 호스트에 컨테이너를 할당할 수 있습니다.

  • 사용자 정의 정책: 스케줄러는 사용자가 정의한 정책을 고려할 수도 있다. 사용자는 특정 노드에 컨테이너를 할당하거나 특정 노드를 우선적으로 사용하도록 설정할 수 있다.

즉, Scheduler의 목적은 '컨테이너를 할당하기에 가장 알맞은 호스트'를 찾는것

1. Docker Swarm Strategies

스웜 자체의 컨테이너 할당 옵션

  • spread, binpack, random
  1. spread
  • 모든 swarm 노드에 골고루 분포하도록 하는 옵션
A에 2개, B에 1개, C에 2개

그렇다면, B에 1개가 할당되어 컨테이너의 수에 평형을 이루도록 한다.
2. binpack

  • 자원을 효율적으로 사용한다는 측면에서 컨테이너를 할당
  • memory compaction 개념과 비슷
A에는 가용자원이 1GB, B에는 2GB

만약 1GB의 메모리를 할당해야 하는 동일한 컨테이너를 하나 더 생성한다면, Swarm Manager가 binpack strategy를 사용한다면 B가 아닌 A가 된다.
왜냐하면 나중에 2GB의 메모리를 소모하는 컨테이너를 생성해야 하는 상황이 있다면 이를 대비하여 최대한 큰 공간을 남겨두어야 하기 때문이다.
즉, 빈틈없이 컨테이너의 자원 활용으로 자원을 많이 할당받아야 하는 컨테이너를 위해 대비하고 있는 것으로 보면 된다.

  1. random
  • 임의의 노드를 선정하여 컨테이너를 생성한다. 디버깅 용도로 사용된다고 한다.

2. Docker Swarm Filters

Swarm Filter는 Strategy가 각 노드 별로 크게, 러프하게 노드를 선택하는 것이라면 Filter는 Docker 및 컨테이너의 특성에 맞게 노드를 선택한다.

  • Node Filter : 각 노드들의 특성에 맞게 자원을 할당하는 것
  • Container Filter : 컨테이너의 특성에 맞게 자원을 할당하는 것

Node Filter는 Docker daemon을 실행할 때 옵션을 주고, Container Filter는 컨테이너를 run 할 때 옵션을 준다.

  1. Node Filters
  • Constraint : docker daemon의 label에 따라 컨테이너를 할당한다.
    • Docker daemon들에게 label을 줘서 그룹별로 관리하는 것
  • Healthy
    • Swarm cluster 내에 unbealthy 상태의 노드가 있다면 그 노드에는 컨테이너를 할당하지 않는 것
      • unhealthy : Swarm Cluster와 통신이 불가능하거나 아예 노드가 fail 한 상태
  • Containerslots
    • 노드에 할당할 수 있는 컨테이너 수를 제한하는 것
docker daemon --label containerslots=3
  1. Container Filters
  • affinity : 특정 컨테이너나 이미지, 특정 라벨이 붙은 컨테이너가 존재하는 노드에 할당하는 것
node 1 : mycontainer (ubuntu), mydb (mysql)
node 2 : mycentos (centos)
docker tcp://<manager url> run -it -e affinity:container==mycontainer ubuntu:18.04

affinity 옵션을 사용해서 위와 같이 run을 실행시킨다면 node 1 에 컨테이너가 할당된다.
이와 마찬가지로 특정 이미지가 존재하는 노드를 고를 수도 있다. 이는 affinity:image=redis (redis 이미지가 있는 노드를 선택)과 같이 사용될 수 있다.

  • dependency : 특정 컨테이너와 link, 볼륨을 공유, network 옵션에서 특정 network stack을 사용 해야 할때
--volume-from=dependency
--link=dependency:alias
--net=container:dependency
node 1 : my container (ubuntu), mydb (mysql)
node 2 : mycentos (centos)
docker run -it --volumes-from=mycentos ubuntu:18.04

위와 같은 명령어를 준다면, node 2 에 컨테이너가 생성도리 것이다. mycentos 컨테이너는 -v 옵션으로 호스트와 볼륨을 공유하고 있어야 한다.

  • Port : 특정 포트가 사용 가능한 노드를 찾는 것
node 1 : mycontainer (ubuntu) : 0.0.0.0:80 -> 3306
node 2 : mycentos (centos) : 0.0.0.0:9999 -> 80
docker run -d -p 80:80 nginx

위 명령어를 주면 가용 포트가 80번인 node 2 에 컨테이너가 생성된다. 만약 node 2 에도 80포트를 사용중인 컨테이너나 프로스세가 있다면 Swarm은 컨테이너 할당을 refuse 하게 된다.

profile
I can do it ! 苦盡甘來

0개의 댓글