Docker Swarm์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ

์šฐ๋ฆฌ๊ฐ€ ์ž‘์—…ํ•˜๊ณ  ์žˆ๋Š” ์˜จ๋ผ์ธ ๋น„๋””์˜ค ์ฝ˜ํ…์ธ  ์ถ”์ฒœ ์‹œ์Šคํ…œ์€ ํ์‡„ํ˜• ์ƒ์šฉ ๊ฐœ๋ฐœ์ด๋ฉฐ ๊ธฐ์ˆ ์ ์œผ๋กœ ๋…์  ๋ฐ ์˜คํ”ˆ ์†Œ์Šค ๊ตฌ์„ฑ ์š”์†Œ์˜ ๋‹ค์ค‘ ๊ตฌ์„ฑ ์š”์†Œ ํด๋Ÿฌ์Šคํ„ฐ์ž…๋‹ˆ๋‹ค. ์ด ๊ธฐ์‚ฌ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ชฉ์ ์€ ์ œํ•œ๋œ ์‹œ๊ฐ„ ๋‚ด์— ํ”„๋กœ์„ธ์Šค์˜ ํ™•๋ฆฝ๋œ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ๋ฐฉํ•ดํ•˜์ง€ ์•Š๊ณ  ์Šคํ…Œ์ด์ง• ์‚ฌ์ดํŠธ์— ๋Œ€ํ•œ docker swarm ํด๋Ÿฌ์Šคํ„ฐ๋ง ์‹œ์Šคํ…œ์˜ ๊ตฌํ˜„์„ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ๊ด€์‹ฌ์„ ๋Œ๊ธฐ ์œ„ํ•ด ์ œ์‹œ๋œ ๋‚ด๋Ÿฌํ‹ฐ๋ธŒ๋Š” ๋‘ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๋ถ€๋ถ„์€ docker swarm์„ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— CI/CD๋ฅผ ์„ค๋ช…ํ•˜๊ณ  ๋‘ ๋ฒˆ์งธ ๋ถ€๋ถ„์€ ๊ตฌํ˜„ ๊ณผ์ •์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๋ถ€๋ถ„์„ ์ฝ๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์—†๋Š” ์‚ฌ๋žŒ๋“ค์€ ์•ˆ์ „ํ•˜๊ฒŒ ๋‘ ๋ฒˆ์งธ ๋ถ€๋ถ„์œผ๋กœ ๋„˜์–ด๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ œ 1 ๋ถ€

๋ฉ€๊ณ  ๋จผ ํ•ด์— CI / CD ํ”„๋กœ์„ธ์Šค๋ฅผ ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ์„ค์ •ํ•ด์•ผํ–ˆ์Šต๋‹ˆ๋‹ค. ์กฐ๊ฑด ์ค‘ ํ•˜๋‚˜๋Š” Docker๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฐฐ์น˜๋ฅผ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ช‡ ๊ฐ€์ง€ ์ด์œ ๋กœ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ฐœ๋ฐœํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ํ”„๋กœ๋•์…˜์—์„œ ๊ตฌ์„ฑ ์š”์†Œ์˜ ๋ณด๋‹ค ์•ˆ์ •์ ์ด๊ณ  ์•ˆ์ •์ ์ธ ์ž‘๋™์„ ์œ„ํ•ด(์ฆ‰, ๊ฐ€์ƒํ™”๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์š”๊ตฌ ์‚ฌํ•ญ)
  • ์„ ๋„์ ์ธ ๊ฐœ๋ฐœ์ž๋“ค์€ Docker๋กœ ์ž‘์—…ํ•˜๊ธฐ๋ฅผ ์›ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค(์ด์ƒํ•˜์ง€๋งŒ ๊ทธ๋žฌ์Šต๋‹ˆ๋‹ค).
  • R&D ๊ด€๋ฆฌ์˜ ์ด๋ฐ์˜ฌ๋กœ๊ธฐ์  ๊ณ ๋ ค์— ๋”ฐ๋ผ

MVP์— ๋Œ€ํ•œ ์ธํ”„๋ผ, ์Šคํƒ ๋ฐ ๋Œ€๋žต์ ์ธ ์ดˆ๊ธฐ ์š”๊ตฌ ์‚ฌํ•ญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ œ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  • Debian์ด ํƒ‘์žฌ๋œ Intelยฎ X4 ์„œ๋ฒ„ 5650๋Œ€(๊ฐ•๋ ฅํ•œ ๋จธ์‹  ํ•œ ๋Œ€ ๋” ๊ฐœ๋ฐœ ์™„๋ฃŒ)
  • ์ž์ฒด ์ปค์Šคํ…€ ์ปดํฌ๋„ŒํŠธ ๊ฐœ๋ฐœ์€ C++, Python3๋กœ ์ง„ํ–‰
  • ์‚ฌ์šฉ๋œ ์ฃผ์š” ํƒ€์‚ฌ ๋„๊ตฌ: Kafka, Clickhouse, Airflow, Redis, Grafana, Postgresql, Mysql, โ€ฆ
  • ๋””๋ฒ„๊ทธ ๋ฐ ๋ฆด๋ฆฌ์Šค๋ฅผ ์œ„ํ•ด ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ณ„๋„๋กœ ๋นŒ๋“œํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•œ ํŒŒ์ดํ”„๋ผ์ธ

์ดˆ๊ธฐ ๋‹จ๊ณ„์—์„œ ํ•ด๊ฒฐํ•ด์•ผ ํ•  ์ฒซ ๋ฒˆ์งธ ์งˆ๋ฌธ ์ค‘ ํ•˜๋‚˜๋Š” ๋ชจ๋“  ํ™˜๊ฒฝ(CI/CD)์—์„œ ์‚ฌ์šฉ์ž ์ง€์ • ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ํƒ€์‚ฌ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ์„ค์น˜ํ•˜๊ณ  ์ฒด๊ณ„์ ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. C++ ๋˜๋Š” Python์œผ๋กœ ๊ฐœ๋ฐœ๋œ ์‚ฌ์šฉ์ž ์ง€์ • ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์‹œ์Šคํ…œ ํŒจํ‚ค์ง€๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋นŒ๋“œ๋œ ์ด๋ฏธ์ง€ ์ €์žฅ์†Œ๋กœ ๋ณด๋‚ธ ๋‹ค์Œ ์„œ๋ฒ„์— ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. ์•Œ ์ˆ˜ ์—†๋Š” ์ด์œ ๋กœ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์„ ํƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, CI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ ํŒŒ์ผ์ด ์ปดํŒŒ์ผ๋˜๊ณ  ๊ฐ€์ƒ ํ”„๋กœ์ ํŠธ ํ™˜๊ฒฝ์ด ์ƒ์„ฑ๋˜๊ณ  py ๋ชจ๋“ˆ์ด requirements.txt์—์„œ ์„ค์น˜๋˜๋ฉฐ ์ด๋Ÿฌํ•œ ๋ชจ๋“  ์•„ํ‹ฐํŒฉํŠธ๊ฐ€ ๊ตฌ์„ฑ, ์Šคํฌ๋ฆฝํŠธ ๋ฐ ์„œ๋ฒ„์— ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ํ™˜๊ฒฝ์„ ์ˆ˜๋ฐ˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๊ด€๋ฆฌ์ž ๊ถŒํ•œ์ด ์—†๋Š” ๊ฐ€์ƒ ์‚ฌ์šฉ์ž๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

Gitlab-CI๋Š” CI/CD ์‹œ์Šคํ…œ์œผ๋กœ ์„ ํƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ ํŒŒ์ดํ”„๋ผ์ธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค.

Docker Swarm์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ
๊ตฌ์กฐ์ ์œผ๋กœ gitlab-ci.yml์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

---
variables:
  # ะผะธะฝะธะผะฐะปัŒะฝะฐั ะฒะตั€ัะธั ะฆะŸะฃ ะฝะฐ ัะตั€ะฒะตั€ะฐั…, ะณะดะต ั€ะฐะทะฒะพั€ะฐั‡ะธะฒะฐะตั‚ัั ะบะปะฐัั‚ะตั€
  CMAKE_CPUTYPE: "westmere"

  DEBIAN: "MYREGISTRY:5000/debian:latest"

before_script:
  - eval $(ssh-agent -s)
  - ssh-add <(echo "$SSH_PRIVATE_KEY")
  - mkdir -p ~/.ssh && echo -e "Host *ntStrictHostKeyChecking nonn" > ~/.ssh/config

stages:
  - build
  - testing
  - deploy

debug.debian:
  stage: build
  image: $DEBIAN
  script:
    - cd builds/release && ./build.sh
    paths:
      - bin/
      - builds/release/bin/
    when: always
release.debian:
  stage: build
  image: $DEBIAN
  script:
    - cd builds/release && ./build.sh
    paths:
      - bin/
      - builds/release/bin/
    when: always

## testing stage
tests.codestyle:
  stage: testing
  image: $DEBIAN
  dependencies:
    - release.debian
  script:
    - /bin/bash run_tests.sh -t codestyle -b "${CI_COMMIT_REF_NAME}_codestyle"
tests.debug.debian:
  stage: testing
  image: $DEBIAN
  dependencies:
    - debug.debian
  script:
    - /bin/bash run_tests.sh -e codestyle/test_pylint.py -b "${CI_COMMIT_REF_NAME}_debian_debug"
  artifacts:
    paths:
      - run_tests/username/
    when: always
    expire_in: 1 week
tests.release.debian:
  stage: testing
  image: $DEBIAN
  dependencies:
    - release.debian
  script:
    - /bin/bash run_tests.sh -e codestyle/test_pylint.py -b "${CI_COMMIT_REF_NAME}_debian_release"
  artifacts:
    paths:
      - run_tests/username/
    when: always
    expire_in: 1 week

## staging stage
deploy_staging:
  stage: deploy
  environment: staging
  image: $DEBIAN
  dependencies:
    - release.debian
  script:
    - cd scripts/deploy/ &&
        python3 createconfig.py -s $CI_ENVIRONMENT_NAME &&
        /bin/bash install_venv.sh -d -r ../../requirements.txt &&
        python3 prepare_init.d.py &&
        python3 deploy.py -s $CI_ENVIRONMENT_NAME
  when: manual

ํ•„์š”ํ•œ ๋ชจ๋“  ์‹œ์Šคํ…œ ํŒจํ‚ค์ง€๊ฐ€ ์ด๋ฏธ ์„ค์น˜๋˜๊ณ  ๊ธฐํƒ€ ์„ค์ •์ด ์™„๋ฃŒ๋œ ์ž์ฒด ์ด๋ฏธ์ง€์—์„œ ์กฐ๋ฆฝ ๋ฐ ํ…Œ์ŠคํŠธ๊ฐ€ ์ˆ˜ํ–‰๋œ๋‹ค๋Š” ์ ์€ ์ฃผ๋ชฉํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž‘์—…์˜ ๊ฐ ์Šคํฌ๋ฆฝํŠธ๋Š” ๋‚˜๋ฆ„๋Œ€๋กœ ํฅ๋ฏธ๋กญ์ง€ ๋งŒ ๋ฌผ๋ก  ์ด์•ผ๊ธฐํ•˜์ง€๋Š” ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค ๊ฐ๊ฐ์— ๋Œ€ํ•œ ์„ค๋ช…์€ ๋งŽ์€ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋ฉฐ ์ด๊ฒƒ์ด ๊ธฐ์‚ฌ์˜ ๋ชฉ์ ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋ฐฐํฌ ๋‹จ๊ณ„๊ฐ€ ์ผ๋ จ์˜ ํ˜ธ์ถœ ์Šคํฌ๋ฆฝํŠธ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค๋Š” ์‚ฌ์‹ค์—๋งŒ ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์ด๊ฒ ์Šต๋‹ˆ๋‹ค.

  1. createconfig.py - ํ›„์† ๋ฐฐํฌ๋ฅผ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ํ™˜๊ฒฝ์—์„œ ๊ตฌ์„ฑ ์š”์†Œ ์„ค์ •์ด ํฌํ•จ๋œ settings.ini ํŒŒ์ผ ์ƒ์„ฑ(์‚ฌ์ „ ํ”„๋กœ๋•์…˜, ํ”„๋กœ๋•์…˜, ํ…Œ์ŠคํŠธ ๋“ฑ)
  2. install_venv.sh - ํŠน์ • ๋””๋ ‰ํ„ฐ๋ฆฌ์— py ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ์ƒ์„ฑํ•˜๊ณ  ์›๊ฒฉ ์„œ๋ฒ„์— ๋ณต์‚ฌ
  3. ์ค€๋น„_์ดˆ๊ธฐํ™”.d.py โ€” ํ…œํ”Œ๋ฆฟ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•œ ์‹œ์ž‘-์ค‘์ง€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค.
  4. ๋ฐฐํฌ.py - ์ƒˆ๋กœ์šด ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋ถ„ํ•ดํ•˜๊ณ  ๋‹ค์‹œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

์‹œ๊ฐ„์ด ์ง€๋‚ฌ์Šต๋‹ˆ๋‹ค. ์Šคํ…Œ์ด์ง• ๋‹จ๊ณ„๋Š” ํ”„๋ฆฌํ”„๋กœ๋•์…˜๊ณผ ํ”„๋กœ๋•์…˜์œผ๋กœ ๋Œ€์ฒด๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ฐฐํฌ(CentOS)์—์„œ ์ œํ’ˆ์— ๋Œ€ํ•œ ์ง€์›์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. 5๊ฐœ์˜ ๋” ๊ฐ•๋ ฅํ•œ ๋ฌผ๋ฆฌ์  ์„œ๋ฒ„์™€ XNUMX๊ฐœ์˜ ๊ฐ€์ƒ ์„œ๋ฒ„๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐœ๋ฐœ์ž์™€ ํ…Œ์Šคํ„ฐ๊ฐ€ ์ž‘์—… ์ƒํƒœ์— ์–ด๋Š ์ •๋„ ๊ฐ€๊นŒ์šด ํ™˜๊ฒฝ์—์„œ ์ž‘์—…์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์ด ์ ์  ๋” ์–ด๋ ค์›Œ์กŒ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ ๊ทธ ์—†์ด๋Š” ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์ด ๋ถ„๋ช…ํ•ด์กŒ์Šต๋‹ˆ๋‹ค ...

2 ๋ถ€

Docker Swarm์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ

๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ ํด๋Ÿฌ์Šคํ„ฐ๋Š” Dockerfiles์—์„œ ์„ค๋ช…ํ•˜์ง€ ์•Š๋Š” ์ˆ˜์‹ญ ๊ฐœ์˜ ๊ฐœ๋ณ„ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ๊ตฌ์„ฑ๋œ ๋ฉ‹์ง„ ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ํŠน์ • ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ๋ฐฐํฌ์šฉ์œผ๋กœ๋งŒ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ์ž„๋ฌด๋Š” ์‹œํ—˜ํŒ ํ…Œ์ŠคํŠธ ์ „์— ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์Šคํ…Œ์ด์ง• ํ™˜๊ฒฝ์— ๋ฐฐํฌํ•˜์—ฌ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋ก ์ ์œผ๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ๋™์‹œ์— ์‹คํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์™„๋ฃŒ๋œ ์ƒํƒœ์ด๊ฑฐ๋‚˜ ์™„๋ฃŒ์— ๊ฐ€๊นŒ์šด ์ž‘์—…์ด ์žˆ๋Š” ๋งŒํผ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๋งˆ์Œ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋ฒ„์˜ ์šฉ๋Ÿ‰์„ ํ†ตํ•ด ๊ฐ ์„œ๋ฒ„์—์„œ ์—ฌ๋Ÿฌ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ์Šคํ…Œ์ด์ง• ํด๋Ÿฌ์Šคํ„ฐ๋Š” ๊ฒฉ๋ฆฌ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(ํฌํŠธ, ๋””๋ ‰ํ„ฐ๋ฆฌ ๋“ฑ์— ๊ต์ฐจ๊ฐ€ ์—†์–ด์•ผ ํ•จ).

์šฐ๋ฆฌ์˜ ๊ฐ€์žฅ ๊ท€์ค‘ํ•œ ์ž์›์€ ์šฐ๋ฆฌ์˜ ์‹œ๊ฐ„์ธ๋ฐ, ์šฐ๋ฆฌ์—๊ฒŒ๋Š” ๊ทธ ์‹œ๊ฐ„์ด ๋งŽ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋” ๋น ๋ฅธ ์‹œ์ž‘์„ ์œ„ํ•ด ๋‹จ์ˆœ์„ฑ๊ณผ ์•„ํ‚คํ…์ฒ˜ ์œ ์—ฐ์„ฑ์œผ๋กœ ์ธํ•ด Docker Swarm์„ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๋จผ์ € ํ•œ ์ผ์€ ์›๊ฒฉ ์„œ๋ฒ„์— ๊ด€๋ฆฌ์ž์™€ ์—ฌ๋Ÿฌ ๋…ธ๋“œ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

$ docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
kilqc94pi2upzvabttikrfr5d     nop-test-1     Ready               Active                                  19.03.2
jilwe56pl2zvabupryuosdj78     nop-test-2     Ready               Active                                  19.03.2
j5a4yz1kr2xke6b1ohoqlnbq5 *   nop-test-3     Ready               Active              Leader              19.03.2

๋‹ค์Œ์œผ๋กœ ๋„คํŠธ์›Œํฌ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.


$ docker network create --driver overlay --subnet 10.10.10.0/24 nw_swarm

๋‹ค์Œ์œผ๋กœ CI์—์„œ ๋…ธ๋“œ ์›๊ฒฉ ์ œ์–ด ์ธก๋ฉด์—์„œ Gitlab-CI ๋ฐ Swarm ๋…ธ๋“œ๋ฅผ ์—ฐ๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ธ์ฆ์„œ ์„ค์น˜, ๋น„๋ฐ€ ๋ณ€์ˆ˜ ์„ค์ • ๋ฐ ์ œ์–ด ์„œ๋ฒ„์—์„œ Docker ์„œ๋น„์Šค ์„ค์ •. ์ด ํ•˜๋‚˜ ๊ธฐ์‚ฌ ๋งŽ์€ ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์œผ๋กœ ์Šคํƒ ์ƒ์„ฑ ๋ฐ ์ œ๊ฑฐ ์ž‘์—…์„ .gitlab-ci .yml์— ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

.gitlab-ci .yml์— ๋ช‡ ๊ฐ€์ง€ ๋” ๋งŽ์€ ์ž‘์—…์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

## staging stage
deploy_staging:
  stage: testing
  before_script:
    - echo "override global 'before_script'"
  image: "REGISTRY:5000/docker:latest"
  environment: staging
  dependencies: []
  variables:
    DOCKER_CERT_PATH: "/certs"
    DOCKER_HOST: tcp://10.50.173.107:2376
    DOCKER_TLS_VERIFY: 1
    CI_BIN_DEPENDENCIES_JOB: "release.centos.7"
  script:
    - mkdir -p $DOCKER_CERT_PATH
    - echo "$TLSCACERT" > $DOCKER_CERT_PATH/ca.pem
    - echo "$TLSCERT" > $DOCKER_CERT_PATH/cert.pem
    - echo "$TLSKEY" > $DOCKER_CERT_PATH/key.pem
    - docker stack deploy -c docker-compose.yml ${CI_ENVIRONMENT_NAME}_${CI_COMMIT_REF_NAME} --with-registry-auth
    - rm -rf $DOCKER_CERT_PATH
  when: manual

## stop staging stage
stop_staging:
  stage: testing
  before_script:
    - echo "override global 'before_script'"
  image: "REGISTRY:5000/docker:latest"
  environment: staging
  dependencies: []
  variables:
    DOCKER_CERT_PATH: "/certs"
    DOCKER_HOST: tcp://10.50.173.107:2376
    DOCKER_TLS_VERIFY: 1
  script:
    - mkdir -p $DOCKER_CERT_PATH
    - echo "$TLSCACERT" > $DOCKER_CERT_PATH/ca.pem
    - echo "$TLSCERT" > $DOCKER_CERT_PATH/cert.pem
    - echo "$TLSKEY" > $DOCKER_CERT_PATH/key.pem
    - docker stack rm ${CI_ENVIRONMENT_NAME}_${CI_COMMIT_REF_NAME}
    # TODO: need check that stopped
  when: manual

์œ„์˜ ์ฝ”๋“œ ์กฐ๊ฐ์—์„œ ๋‘ ๊ฐœ์˜ ๋ฒ„ํŠผ(deploy_staging, stop_staging)์ด ํŒŒ์ดํ”„๋ผ์ธ์— ์ถ”๊ฐ€๋˜์–ด ์ˆ˜๋™ ์ž‘์—…์ด ํ•„์š”ํ•œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Docker Swarm์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ
์Šคํƒ ์ด๋ฆ„์€ ๋ถ„๊ธฐ ์ด๋ฆ„๊ณผ ์ผ์น˜ํ•˜๋ฉฐ ์ด ๊ณ ์œ ์„ฑ์œผ๋กœ ์ถฉ๋ถ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์Šคํƒ์˜ ์„œ๋น„์Šค๋Š” ๊ณ ์œ ํ•œ IP ์ฃผ์†Œ, ํฌํŠธ, ๋””๋ ‰ํ„ฐ๋ฆฌ ๋“ฑ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. ๊ฒฉ๋ฆฌ๋˜์ง€๋งŒ ์Šคํƒ๋งˆ๋‹ค ๋™์ผํ•ฉ๋‹ˆ๋‹ค(๊ตฌ์„ฑ ํŒŒ์ผ์ด ๋ชจ๋“  ์Šคํƒ์— ๋Œ€ํ•ด ๋™์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์—) - ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์Šคํƒ(ํด๋Ÿฌ์Šคํ„ฐ)์„ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค. docker-compose.yml, ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

docker-compose.yml

---
version: '3'

services:
  userprop:
    image: redis:alpine
    deploy:
      replicas: 1
      placement:
        constraints: [node.id == kilqc94pi2upzvabttikrfr5d]
      restart_policy:
        condition: none
    networks:
      nw_swarm:
  celery_bcd:
    image: redis:alpine
    deploy:
      replicas: 1
      placement:
        constraints: [node.id == kilqc94pi2upzvabttikrfr5d]
      restart_policy:
        condition: none
    networks:
      nw_swarm:

  schedulerdb:
    image: mariadb:latest
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
      MYSQL_DATABASE: schedulerdb
      MYSQL_USER: ****
      MYSQL_PASSWORD: ****
    command: ['--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci', '--explicit_defaults_for_timestamp=1']
    deploy:
      replicas: 1
      placement:
        constraints: [node.id == kilqc94pi2upzvabttikrfr5d]
      restart_policy:
        condition: none
    networks:
      nw_swarm:

  celerydb:
    image: mariadb:latest
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
      MYSQL_DATABASE: celerydb
      MYSQL_USER: ****
      MYSQL_PASSWORD: ****
    deploy:
      replicas: 1
      placement:
        constraints: [node.id == kilqc94pi2upzvabttikrfr5d]
      restart_policy:
        condition: none
    networks:
      nw_swarm:

  cluster:
    image: $CENTOS7
    environment:
      - CENTOS
      - CI_ENVIRONMENT_NAME
      - CI_API_V4_URL
      - CI_REPOSITORY_URL
      - CI_PROJECT_ID
      - CI_PROJECT_URL
      - CI_PROJECT_PATH
      - CI_PROJECT_NAME
      - CI_COMMIT_REF_NAME
      - CI_BIN_DEPENDENCIES_JOB
    command: >
      sudo -u myusername -H /bin/bash -c ". /etc/profile &&
        mkdir -p /storage1/$CI_COMMIT_REF_NAME/$CI_PROJECT_NAME &&
        cd /storage1/$CI_COMMIT_REF_NAME/$CI_PROJECT_NAME &&
            git clone -b $CI_COMMIT_REF_NAME $CI_REPOSITORY_URL . &&
            curl $CI_API_V4_URL/projects/$CI_PROJECT_ID/jobs/artifacts/$CI_COMMIT_REF_NAME/download?job=$CI_BIN_DEPENDENCIES_JOB -o artifacts.zip &&
            unzip artifacts.zip ;
        cd /storage1/$CI_COMMIT_REF_NAME/$CI_PROJECT_NAME/scripts/deploy/ &&
            python3 createconfig.py -s $CI_ENVIRONMENT_NAME &&
            /bin/bash install_venv.sh -d -r ../../requirements.txt &&
            python3 prepare_init.d.py &&
            python3 deploy.py -s $CI_ENVIRONMENT_NAME"
    deploy:
      replicas: 1
      placement:
        constraints: [node.id == kilqc94pi2upzvabttikrfr5d]
      restart_policy:
        condition: none
    tty: true
    stdin_open: true
    networks:
      nw_swarm:

networks:
  nw_swarm:
    external: true

์—ฌ๊ธฐ์—์„œ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ํ•˜๋‚˜์˜ ๋„คํŠธ์›Œํฌ(nw_swarm)๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๊ณ  ์„œ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹œ์Šคํ…œ ๊ตฌ์„ฑ ์š”์†Œ(redis, mysql ๊ธฐ๋ฐ˜)๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ๊ตฌ์„ฑ ์š”์†Œ์˜ ์ผ๋ฐ˜ ํ’€๊ณผ ๋ถ„๋ฆฌ๋ฉ๋‹ˆ๋‹ค(๊ณ„ํš ๋ฐ ์‚ฌ์šฉ์ž ์ •์˜ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ์„œ๋น„์Šค๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค). ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ฐฐํฌ ๋‹จ๊ณ„๋Š” CMD๋ฅผ ํ•˜๋‚˜์˜ ํฐ ๊ตฌ์„ฑ๋œ ์ด๋ฏธ์ง€์— ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ XNUMX๋ถ€์—์„œ ์„ค๋ช…ํ•œ ๋ฐฐํฌ์™€ ์‹ค์งˆ์ ์œผ๋กœ ๋‹ค๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฐจ์ด์ ์„ ๊ฐ•์กฐํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

  • ์ž์‹ ๋ณต์ œ... - ๋ฐฐํฌ์— ํ•„์š”ํ•œ ํŒŒ์ผ ๊ฐ€์ ธ์˜ค๊ธฐ(createconfig.py, install_venv.sh ๋“ฑ)
  • ์ปฌ... && ์••์ถ• ํ•ด์ œ... - ๋นŒ๋“œ ์•„ํ‹ฐํŒฉํŠธ ๋‹ค์šด๋กœ๋“œ ๋ฐ ์••์ถ• ํ•ด์ œ(์ปดํŒŒ์ผ๋œ ์œ ํ‹ธ๋ฆฌํ‹ฐ)

์•„์ง ์„ค๋ช…๋˜์ง€ ์•Š์€ ๋ฌธ์ œ๊ฐ€ ํ•˜๋‚˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์›น ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ๋Š” ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๊ฐœ๋ฐœ์ž์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

.gitlab-ci.yml์—์„œ ํด๋Ÿฌ์Šคํ„ฐ ์Šคํƒ์„ ๋ฐฐํฌํ•œ ํ›„ ๋ฐธ๋Ÿฐ์„œ๋ฅผ ๋ฐฐํฌํ•˜๋Š” ์ค„์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค(์ปค๋ฐ‹ํ•  ๋•Œ ๊ตฌ์„ฑ๋งŒ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค(ํ…œํ”Œ๋ฆฟ์— ๋”ฐ๋ผ ์ƒˆ nginx ๊ตฌ์„ฑ ํŒŒ์ผ ์ƒ์„ฑ: /etc/nginx/conf. d/${CI_COMMIT_REF_NAME}.conf) - docker-compose-nginx.yml ์ฝ”๋“œ ์ฐธ์กฐ)

    - docker stack deploy -c docker-compose-nginx.yml ${CI_ENVIRONMENT_NAME} --with-registry-auth

๋„์ปค ์ž‘์„ฑ-nginx.yml

---
version: '3'

services:
  nginx:
    image: nginx:latest
    environment:
      CI_COMMIT_REF_NAME: ${CI_COMMIT_REF_NAME}
      NGINX_CONFIG: |-
            server {
                listen 8080;
                server_name staging_${CI_COMMIT_REF_NAME}_cluster.dev;

                location / {
                    proxy_pass http://staging_${CI_COMMIT_REF_NAME}_cluster:8080;
                }
            }
            server {
                listen 5555;
                server_name staging_${CI_COMMIT_REF_NAME}_cluster.dev;

                location / {
                    proxy_pass http://staging_${CI_COMMIT_REF_NAME}_cluster:5555;
                }
            }
    volumes:
      - /tmp/staging/nginx:/etc/nginx/conf.d
    command:
      /bin/bash -c "echo -e "$$NGINX_CONFIG" > /etc/nginx/conf.d/${CI_COMMIT_REF_NAME}.conf;
        nginx -g "daemon off;";
        /etc/init.d/nginx reload"
    ports:
      - 8080:8080
      - 5555:5555
      - 3000:3000
      - 443:443
      - 80:80
    deploy:
      replicas: 1
      placement:
        constraints: [node.id == kilqc94pi2upzvabttikrfr5d]
      restart_policy:
        condition: none
    networks:
      nw_swarm:

networks:
  nw_swarm:
    external: true

๊ฐœ๋ฐœ ์ปดํ“จํ„ฐ์—์„œ /etc/hosts๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. nginx์— URL์„ ์ง€์ •ํ•˜์‹ญ์‹œ์˜ค.

10.50.173.106 staging_BRANCH-1831_cluster.dev

๋”ฐ๋ผ์„œ ๊ฒฉ๋ฆฌ๋œ ์Šคํ…Œ์ด์ง• ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ฐฐํฌ๊ฐ€ ๊ตฌํ˜„๋˜์—ˆ์œผ๋ฉฐ ๊ฐœ๋ฐœ์ž๋Š” ์ด์ œ ์ž‘์—…์„ ํ™•์ธํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•œ ์ˆ˜๋งŒํผ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ–ฅํ›„ ๊ณ„ํš:

  • ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์„œ๋น„์Šค๋กœ ๋ถ„๋ฆฌ
  • Dockerfile๋งˆ๋‹ค ์žˆ์Œ
  • ์Šคํƒ์—์„œ ๋ถ€ํ•˜๊ฐ€ ์ ์€ ๋…ธ๋“œ๋ฅผ ์ž๋™์œผ๋กœ ๊ฐ์ง€
  • ์ด๋ฆ„ ํŒจํ„ด์œผ๋กœ ๋…ธ๋“œ ์ง€์ •(๊ธฐ์‚ฌ์—์„œ์™€ ๊ฐ™์ด id๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹ )
  • ์Šคํƒ์ด ํŒŒ๊ดด๋˜์—ˆ๋Š”์ง€ ํ™•์ธ ์ถ”๊ฐ€
  • ...

ํŠน๋ณ„ํ•œ ๊ฐ์‚ฌ ัั‚ะฐั‚ัŒัŽ.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€