본문 바로가기

가상화/Kubernetes

[Docker] swarm 모드에서 컨테이너 rebalance

반응형

개요

swarm에 컨테이너 생성시 swarm manager는 자동으로 각 노드에 내부 알고리즘을 이용하여 컨테이너를 배포한다. 그러나 운영중 worker 노드가 추가(삭제) 또는 service생성시 특정 노드가 unusable시 의도치 않게 특정 노드에 컨테이너가 집중될수 있다.  이러한 문제를 해결하기 위해 docker는 rebalance 기능을 이용하여 컨테이너를 각 노도에 재 배포할 수 있다.

구성환경

docker-ce-19.03.5 / CentOS 7.6

 

syntax) docker service update --force serviceName

예) 2노드(총 6개의 컨테이너)로 이루어진 swarm에 1개의 노드를 swarm에 추가, rebalance 실행후 각 노드에 컨테이너가 재 배포 되었는지 확인

1. node1(manager) 에서 컨테이너 생성

snell> docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
tabzxnado7x2fon7x67vqg7m1     rac1.hoya.com       Ready               Active              Leader              19.03.5
qz09j7g6d6mxenvaiu35p616w *   testsvr             Ready               Active              Reachable           19.03.5
snell> docker service create --replicas 6 --name my_nginx_1 -p 8080:80 nginx:latest
k8f5uiwomjwg0w3ewfi95qyi9
overall progress: 6 out of 6 tasks
1/6: running
2/6: running
3/6: running
4/6: running
5/6: running
6/6: running
verify: Service converged
snell> docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
0585c4d7ab0c        nginx:latest        "nginx -g 'daemon of…"   13 seconds ago      Up 11 seconds       80/tcp              my_nginx_1.2.ouch2bilavqupskc3bo02sv27
c79358f42072        nginx:latest        "nginx -g 'daemon of…"   13 seconds ago      Up 11 seconds       80/tcp              my_nginx_1.6.17rw4cxx63cb5bgyfugd8vlpn
5654a78737df        nginx:latest        "nginx -g 'daemon of…"   13 seconds ago      Up 11 seconds       80/tcp              my_nginx_1.4.qra9qdzbo3o0cwhutg9b1pttx
shell> docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
k8f5uiwomjwg        my_nginx_1          replicated          6/6                 nginx:latest        *:8080->80/tcp
shell>

2. node2에 배포된 컨테이너 3개 확인

shell> docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
a5208fa90018        nginx:latest        "nginx -g 'daemon of…"   21 seconds ago      Up 17 seconds       80/tcp              my_nginx_1.3.ayjf638nmyev2323rsjbplm7h
bbdacc4011e8        nginx:latest        "nginx -g 'daemon of…"   21 seconds ago      Up 18 seconds       80/tcp              my_nginx_1.5.81y0we9botdcfka5v2ijvs8bz
2f3e67941912        nginx:latest        "nginx -g 'daemon of…"   21 seconds ago      Up 18 seconds       80/tcp              my_nginx_1.1.z28h0pz6g0vo1j06z9viy95pl
shell>

 3. node3에서 swarm에 가입

shell> docker swarm join --token SWMTKN-1-11a6xx0tp9ikxdzfponlfinetsydfjmncvo9x3zx23in2n9lxh-5puxp1z3p2hss4kimdhuviqi5 192.168.0.167:2377
This node joined a swarm as a manager.
shell> docker ps  => 아직 어떠한 컨테이너도 없음
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
shell>

4. node1에서 rebalance 실행후 3개에서 2개로 조정됨

shell> docker service update --force my_nginx_1
my_nginx_1
overall progress: 6 out of 6 tasks
1/6: running
2/6: running
3/6: running
4/6: running
5/6: running
6/6: running
verify: Service converged
shell> docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
558d7003977e        nginx:latest        "nginx -g 'daemon of…"   22 seconds ago      Up 17 seconds       80/tcp              my_nginx_1.6.uaxbb2ow5894m7vkr9d9l68pm
74b10a86c30e        nginx:latest        "nginx -g 'daemon of…"   26 seconds ago      Up 22 seconds       80/tcp              my_nginx_1.1.swh9746z2puyy1ikveme20zil
shell>

5. node2 에서 컨테이너가 3개의 2개로 조정됨

shell> docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
51cc0ff99eaf        nginx:latest        "nginx -g 'daemon of…"   17 seconds ago      Up 12 seconds       80/tcp              my_nginx_1.3.qaeki0jye8imyyrclo5qihtl8
d73c5dc1411b        nginx:latest        "nginx -g 'daemon of…"   22 seconds ago      Up 17 seconds       80/tcp              my_nginx_1.5.rokzl83jzzarhfiz4472ceyef
shell>

6. node3에 컨테이너2개가 추가 됨을 확인할 수 있다

shell> docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
a8e79d67dd62        nginx:latest        "nginx -g 'daemon of…"   41 seconds ago      Up 36 seconds       80/tcp              my_nginx_1.4.gyhbxg2v7qwfzswboyzudumtx
a9cac4336fe4        nginx:latest        "nginx -g 'daemon of…"   46 seconds ago      Up 41 seconds       80/tcp              my_nginx_1.2.w7g8vhzlnpftkivfuzkqgmcur
shell>
반응형