Workload Distribution with Docker Swarm - TheOpenCloudEngine/uEngine-cloud GitHub Wiki

Dockerizing Services μ—μ„œ clazz μ„œλΉ„μŠ€λ₯Ό Dockerizing ν•˜λŠ” 법에 λŒ€ν•˜μ—¬ ν•™μŠ΅ν•˜μ˜€λ‹€.
κ·ΈλŸ¬λ‚˜ 맀번 μ΄λ ‡κ²Œ ν•œκ°œμ”© μ„œλΉ„μŠ€λ₯Ό λ„μš°λŠ” 방법은 mvnμ΄λ‚˜ java -jar둜 μ‹€ν–‰μ‹œν‚€λŠ” 것과 별 차이가 μ—†λ‹€.
μ΄λ²ˆμ‹œκ°„μ—λŠ” Docker Swarm 을 ν†΅ν•˜μ—¬ microservice듀을 ν•œλ²ˆμ— μ˜¬λ¦¬λŠ” 법에 λŒ€ν•˜μ—¬ ν•™μŠ΅ν•œλ‹€.

Docker Swarm을 μ‚¬μš©ν•˜κΈ° μœ„ν•˜μ—¬μ„œλŠ” docker-compose νŒŒμΌμ„ ν†΅ν•˜μ—¬ μ„€μ •ν•œλ‹€.

msa-tutorial-class-management-msa/docker-compose.yml

services:
  class-api:
    image: clazz-service:latest
    deploy:
      replicas: 2  # μž‘μ—…μž(μΈμŠ€ν„΄μŠ€)λŠ” 2개λ₯Ό 항상 μœ μ§€ν•œλ‹€
      restart_policy: # health check
        condition: on-failure
    volumes:
      - /tmp:/tmp
    ports:
      - "8088:8080"
    depends_on:
      - registry
  course-api:
    image: course-service:latest
    deploy:
      replicas: 2
      restart_policy:
        condition: on-failure
    volumes:
      - /tmp:/tmp
    ports:
      - "8089:8080"
    depends_on: # registry κ°€ 뜬 후에 imageλ₯Ό μ‹€ν–‰ν•œλ‹€.
      - registry
  proxy:
    image: api-gateway:latest
    deploy:
      replicas: 1
      restart_policy:
        condition: on-failure
    ports:
      - "8080:8080"
    depends_on:
      - registry
  registry:
    image: uengine-registry-server:latest
    deploy:
      replicas: 1
      restart_policy:
        condition: on-failure
    ports:
      - "8761:8761"

파일 μ„€λͺ…을 ν•˜μžλ©΄ registry 와 proxy , class-api, course-apiλ₯Ό λ„μš΄λ‹€.
이전 pageμ—μ„œ class-api λ₯Ό dockerizeν•˜μ˜€μœΌλ‹ˆ λ‚˜λ¨Έμ§€ μ„œλΉ„μŠ€λ“€λ„ λͺ¨λ‘ dockerize ν•΄μ€€λ‹€.

$ cd course/
$ sudo docker build . -t course-service
$ cd ..
$ cd proxy-service/
$ sudo docker build . -t api-gateway
$ cd ..
$ cd registry-service/
$ sudo docker build . -t uengine-registry-server
$ sudo docker images
uengine-registry-server   latest              315b6ac665a9        9 seconds ago       185MB
api-gateway               latest              5045d31821f4        33 seconds ago      184MB
course-service            latest              404c3bd9dae8        57 seconds ago      264MB
clazz-service             latest              bd09f73f2ee1        2 hours ago         264MB

https://github.com/uengine-oss/msa-tutorial-class-management-msa ν”„λ‘œμ νŠΈλ₯Ό λ³΄μ‹œλ©΄
μ΅œμƒμœ„ parent ν”„λ‘œμ νŠΈμ—μ„œ modules 둜 child듀을 λ¬Άμ–΄ 놓고, docker-compose.yml 을 μƒμ„±ν•˜μ˜€κ³ ,
각자의 module 에 Dockerfile을 생성 ν•˜μ—¬ κ΅¬μ„±ν•˜μ˜€λ‹€.

$ ls
README.md  clazz   customer            pom.xml        registry-service  sme
calendar   course  docker-compose.yml  proxy-service  shared-model

μ‹œμž‘μ „μ— docker swam을 μ‹€ν–‰ν•˜μ—¬μ•Ό ν•œλ‹€.

$ docker swarm init
docker swarm join --token SWMTKN-1-4mclslij7bs1n52zolzv4uqc68756bkrv5gwnmg4qg3lmk9bth-dnd0uczlrlr8dj7et1lzrbzbs 192.168.0.17:2377

docker swarm init 을 ν•˜κ²Œ 되면 join 문ꡬ가 λ‚˜μ˜€λŠ”λ° init을 ν•œ μ„œλ²„κ°€ masterκ°€ 되고, join을 ν†΅ν•˜μ—¬
μ—¬λŸ¬λŒ€μ˜ μ„œλ²„λ₯Ό worker 둜 묢은 ν›„ cluster둜 ꡬ성을 ν•  수 μžˆλ‹€.

이제 deploy λ₯Ό ν•œλ‹€.

$ sudo docker stack deploy -c docker-compose.yml getstartedlab
Creating network getstartedlab_default
Creating service getstartedlab_proxy
Creating service getstartedlab_registry
Creating service getstartedlab_class-api
Creating service getstartedlab_course-api

-c μ˜΅μ…˜μ€ change λͺ…λ ΉμœΌλ‘œ, docker-compose.yml 이 λ³€κ²½λ˜μ–΄λ„ λ³€κ²½λœ νŒŒμΌμ„ μ½μ–΄μ„œ updateν•œλ‹€.
replicas: 3 으둜 λ³€κ²½ν•˜μ—¬ scale up 을 할적에 μ‚¬μš©ν•œλ‹€.
제일 뒀에 getstartedlab 은 stack의 이름을 μ£Όμ—ˆλ‹€.
stack μ‚­μ œμ‹œμ—λŠ” sudo docker stack rm getstartedlab 을 ν•˜λ©΄ λœλ‹€.
ν•˜λ‚˜μ”© κ°€μƒμ˜ network λ₯Ό ν•˜λ‚˜μ”© λ§Œλ“€μ–΄ μ£Όκ³ , μ„œλΉ„μŠ€λ₯Ό ν•˜λ‚˜μ”© docker run을 μ‹€ν–‰ μ‹œμΌœμ€€λ‹€.

$ sudo docker service ls
ID                  NAME                       MODE                REPLICAS            IMAGE                            PORTS
r942gyy8dto2        getstartedlab_class-api    replicated          2/2                 clazz-service:latest             *:8088->8080/tcp
tpya4amt0nrq        getstartedlab_course-api   replicated          2/2                 course-service:latest            *:8089->8080/tcp
70408gcri6m9        getstartedlab_proxy        replicated          1/1                 api-gateway:latest               *:8080->8080/tcp
qtrs2bj6jz46        getstartedlab_registry     replicated          1/1                 uengine-registry-server:latest   *:8761->8761/tcp

$ sudo docker container ls

REPLICAS 둜 μ„€μ •ν•œ μ„œλΉ„μŠ€λ“€μ΄ 각자 갯수만큼 λ– μžˆμ–΄μ„œ docker container ls λ₯Ό ν•˜μ˜€μ„λ•Œ 총 6개의 containerκ°€ λŒμ•„κ°€κ³  μžˆλŠ”κ²ƒμ„ 확인 ν•  수 μžˆλ‹€.
restart_policy μ˜΅μ…˜μ— μ˜ν•˜μ—¬ class-api 의 ν•œκ°œμ˜ μ„œλΉ„μŠ€λ₯Ό kill ν•˜μ—¬λ„ μ„œλΉ„μŠ€κ°€ λ‹€μ‹œ μ‚΄μ•„λ‚˜λŠ”κ²ƒμ„ ν™•μΈν• μˆ˜ μžˆλ‹€.

Self-Healing

$ docker ps
$ docker kill r942gyy8dto2
## λ°”λ‘œ μ‹€ν–‰ν•˜μ—¬ μ„œλΉ„μŠ€κ°€ kill λœκ²ƒ 확인
$ docker container ls
## μ‘°κΈˆλ’€μ— μ„œλΉ„μŠ€κ°€ λ‹€μ‹œ μ‚΄μ•„λ‚˜λŠ”κ²ƒ 확인
$ docker container ls

μ„œλΉ„μŠ€ λ™μž‘ 확인

$ http 192.168.0.17:8089/courses
$ http 192.168.0.17:8080/courses

http 192.168.0.17:8080/courses λ₯Ό ν•˜κ²Œ 되면 ZuulException 이 λ°œμƒν•˜κ²Œ λ˜λŠ”λ°
ν˜„μž¬ μ˜ˆμ œμ—μ„œλŠ” local κΈ°μ€€μœΌλ‘œ eureka λ₯Ό λΆ™μ—¬λ†”μ„œ μƒκΈ°λŠ” Error 이닀.

μ—¬κΈ°κΉŒμ§€κ°€ 기본적인 Workload Distribution Engine의 λ™μž‘ ꡬ쑰이닀.

⚠️ **GitHub.com Fallback** ⚠️