즉, 어느 호스트에 할당할 것인가? 라는 것에 대한 것이다.
호스트 자원 사용량
호스트 자원 사용량: 스케줄러는 호스트 노드의 CPU, 메모리, 디스크 등의 자원 사용량을 고려한다. 따라서 자원 사용량이 낮은 노드에 컨테이너를 할당하려고 한다. 이는 클러스터 전체의 자원 활용을 균형있게 유지하기 위한 방법이다.
컨테이너 수: 스케줄러는 각 노드에 배치된 컨테이너의 수를 고려한다. 컨테이너가 적게 있는 노드에 컨테이너를 할당하려고 한다. 이는 컨테이너를 균등하게 분산시켜 부하를 분산시키는 것을 목표로 한다.
호스트 제약 조건: 스케줄러는 호스트 노드에 대한 제약 조건도 고려할 수 있습니다. 예를 들어, 특정 호스트 노드에만 특정 소프트웨어가 설치되어 있거나 특정 라벨이 설정되어 있는 경우, 해당 조건을 충족하는 호스트에 컨테이너를 할당할 수 있습니다.
사용자 정의 정책: 스케줄러는 사용자가 정의한 정책을 고려할 수도 있다. 사용자는 특정 노드에 컨테이너를 할당하거나 특정 노드를 우선적으로 사용하도록 설정할 수 있다.
스웜 자체의 컨테이너 할당 옵션
A에 2개, B에 1개, C에 2개
그렇다면, B에 1개가 할당되어 컨테이너의 수에 평형을 이루도록 한다.
2. binpack
A에는 가용자원이 1GB, B에는 2GB
만약 1GB의 메모리를 할당해야 하는 동일한 컨테이너를 하나 더 생성한다면, Swarm Manager가 binpack strategy를 사용한다면 B가 아닌 A가 된다.
왜냐하면 나중에 2GB의 메모리를 소모하는 컨테이너를 생성해야 하는 상황이 있다면 이를 대비하여 최대한 큰 공간을 남겨두어야 하기 때문이다.
즉, 빈틈없이 컨테이너의 자원 활용으로 자원을 많이 할당받아야 하는 컨테이너를 위해 대비하고 있는 것으로 보면 된다.
Swarm Filter는 Strategy가 각 노드 별로 크게, 러프하게 노드를 선택하는 것이라면 Filter는 Docker 및 컨테이너의 특성에 맞게 노드를 선택한다.
docker daemon --label containerslots=3
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 이미지가 있는 노드를 선택)과 같이 사용될 수 있다.
--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 옵션으로 호스트와 볼륨을 공유하고 있어야 한다.
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 하게 된다.