เบ™เบณเปƒเบŠเป‰เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบเบฑเบš Docker Swarm

เบฅเบฐเบšเบปเบšเบเบฒเบ™เปเบ™เบฐเบ™เปเบฒเป€เบ™เบทเป‰เบญเบซเบฒเบงเบดเบ”เบตเป‚เบญเบญเบญเบ™เป„เบฅเบ™เปŒเบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบฅเบฑเบ‡เป€เบฎเบฑเบ”เบงเบฝเบเปเบกเปˆเบ™เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเบเบฒเบ™เบ„เป‰เบฒเบ›เบดเบ”เปเบฅเบฐเบ—เบฒเบ‡เบ”เป‰เบฒเบ™เบงเบดเบŠเบฒเบเบฒเบ™เป€เบ›เบฑเบ™เบเบธเปˆเบกเบซเบผเบฒเบเบญเบปเบ‡เบ›เบฐเบเบญเบšเบ‚เบญเบ‡เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ—เบตเปˆเป€เบ›เบฑเบ™เป€เบˆเบปเป‰เบฒเบ‚เบญเบ‡เปเบฅเบฐเปเบซเบผเปˆเบ‡เป€เบ›เบตเบ”. เบˆเบธเบ”เบ›เบฐเบชเบปเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบ‚เบฝเบ™เบšเบปเบ”เบ™เบตเป‰เปเบกเปˆเบ™เป€เบžเบทเปˆเบญเบญเบฐเบ—เบดเบšเบฒเบเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบฅเบฐเบšเบปเบš docker swarm clustering เบชเปเบฒเบฅเบฑเบšเบชเบฐเบ–เบฒเบ™เบ—เบตเปˆ staging เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบฅเบปเบšเบเบงเบ™เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ—เบตเปˆเบชเป‰เบฒเบ‡เบ•เบฑเป‰เบ‡เบ‚เบถเป‰เบ™เบ‚เบญเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเปƒเบ™เป€เบงเบฅเบฒเบˆเปเบฒเบเบฑเบ”. เบ„เปเบฒเบšเบฑเบ™เบเบฒเบเบ—เบตเปˆเบ™เปเบฒเบชเบฐเป€เบซเบ™เบตเปƒเบซเป‰เบ„เบงเบฒเบกเบชเบปเบ™เปƒเบˆเบ‚เบญเบ‡เป€เบˆเบปเป‰เบฒเปเบšเปˆเบ‡เบญเบญเบเป€เบ›เบฑเบ™เบชเบญเบ‡เบชเปˆเบงเบ™. เบชเปˆเบงเบ™เบ—เปเบฒเบญเบดเบ”เบญเบฐเบ—เบดเบšเบฒเบ CI / CD เบเปˆเบญเบ™เบ—เบตเปˆเบˆเบฐเปƒเบŠเป‰ docker swarm, เปเบฅเบฐเบชเปˆเบงเบ™เบ—เบตเบชเบญเบ‡เบญเบฐเบ—เบดเบšเบฒเบเป€เบ–เบดเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบญเบ‡เบกเบฑเบ™. เบœเบนเป‰โ€‹เบ—เบตเปˆโ€‹เบšเปเปˆโ€‹เบชเบปเบ™โ€‹เปƒเบˆโ€‹เปƒเบ™โ€‹เบเบฒเบ™โ€‹เบญเปˆเบฒเบ™โ€‹เบžเบฒเบโ€‹เบชเปˆเบงเบ™โ€‹เบ—เปเบฒโ€‹เบญเบดเบ”โ€‹เป„เบ”เป‰โ€‹เบขเปˆเบฒเบ‡โ€‹เบ›เบญเบ”โ€‹เป„เบžโ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เบเป‰เบฒเบโ€‹เป„เบ›โ€‹เบ—เบตเปˆโ€‹เบชเบญเบ‡โ€‹เป„เบ”เป‰โ€‹เบขเปˆเบฒเบ‡โ€‹เบ›เบญเบ”โ€‹เป„เบž.

เบžเบฒเบเบ—เบต I

เบเบฑเบšเป„เบ›เปƒเบ™เบ›เบตเบ—เบตเปˆเบซเปˆเบฒเบ‡เป„เบ, เบซเปˆเบฒเบ‡เป„เบ, เบกเบฑเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เบเปเบฒเบ™เบปเบ”เบ‚เบฐเบšเบงเบ™เบเบฒเบ™ CI / CD เป„เบงเป€เบ—เบปเปˆเบฒเบ—เบตเปˆเบˆเบฐเป„เบงเป„เบ”เป‰. เบซเบ™เบถเปˆเบ‡เปƒเบ™เป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เบšเปเปˆเปเบกเปˆเบ™เบเบฒเบ™เปƒเบŠเป‰ Docker เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹ เบญเบปเบ‡โ€‹เบ›เบฐโ€‹เบเบญเบšโ€‹เบ—เบตเปˆโ€‹เบžเบฑเบ”โ€‹เบ—เบฐโ€‹เบ™เบฒโ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เป€เบซเบ”โ€‹เบœเบปเบ™โ€‹เบˆเปเบฒโ€‹เบ™เบงเบ™โ€‹เบซเบ™เบถเปˆเบ‡โ€‹:

  • เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เปเบฅเบฐเบซเบกเบฑเป‰เบ™เบ„เบปเบ‡เบซเบผเบฒเบเบ‚เบญเบ‡เบญเบปเบ‡เบ›เบฐเบเบญเบšเปƒเบ™เบเบฒเบ™เบœเบฐเบฅเบดเบ” (เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เปƒเบ™เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เบˆเบดเบ‡, เบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เบšเปเปˆเปƒเบซเป‰เปƒเบŠเป‰ virtualization)
  • เบœเบนเป‰เบžเบฑเบ”เบ—เบฐเบ™เบฒเบŠเบฑเป‰เบ™เบ™เปเบฒเบšเปเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš Docker (เปเบ›เบ, เปเบ•เปˆเบงเปˆเบฒเบกเบฑเบ™เป€เบ›เบฑเบ™เปเบ™เบงเปƒเบ”)
  • เบญเบตเบ‡เบ•เบฒเบกเบเบฒเบ™เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบญเบธเบ”เบปเบกเบเบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เบ„เบธเป‰เบกเบ„เบญเบ‡ R&D

เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบžเบทเป‰เบ™เบ–เบฒเบ™, stack เปเบฅเบฐเบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบšเบทเป‰เบญเบ‡เบ•เบปเป‰เบ™เป‚เบ”เบเบ›เบฐเบกเบฒเบ™เบชเปเบฒเบฅเบฑเบš MVP เป„เบ”เป‰เบ–เบทเบเบ™เปเบฒเบชเบฐเป€เบซเบ™เบตเบ”เบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰:

  • 4 เป€เบŠเบตเบšเป€เบงเบต Intelยฎ X5650 เบเบฑเบš Debian (เป€เบ„เบทเปˆเบญเบ‡เบ—เบตเปˆเบกเบตเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบญเบตเบเบญเบฑเบ™เปœเบถเปˆเบ‡เปเบกเปˆเบ™เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเบขเปˆเบฒเบ‡เป€เบ•เบฑเบกเบ—เบตเปˆ)
  • เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเบญเบปเบ‡เบ›เบฐเบเบญเบšเบ—เบตเปˆเบเปเบฒเบซเบ™เบปเบ”เป€เบญเบ‡เปเบกเปˆเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบขเบนเปˆเปƒเบ™ C ++, Python3
  • เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบžเบฒเบเบชเปˆเบงเบ™เบ—เบตเบชเบฒเบกเบ•เบปเป‰เบ™เบ•เปเบ—เบตเปˆเปƒเบŠเป‰: Kafka, Clickhouse, Airflow, Redis, Grafana, Postgresql, Mysql, โ€ฆ
  • เบ—เปเปˆเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡เปเบฅเบฐเบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบญเบปเบ‡เบ›เบฐเบเบญเบšเปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™ debug เปเบฅเบฐเบเบฒเบ™เบ›เปˆเบญเบ

เบซเบ™เบถเปˆเบ‡เปƒเบ™เบ„เปเบฒเบ–เบฒเบกเบ—เปเบฒเบญเบดเบ”เบ—เบตเปˆเบ•เป‰เบญเบ‡เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เปเบเป‰เป„เบ‚เปƒเบ™เบ‚เบฑเป‰เบ™เบ•เบญเบ™เป€เบšเบทเป‰เบญเบ‡เบ•เบปเป‰เบ™เปเบกเปˆเบ™เบงเบดเบ—เบตเบเบฒเบ™เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ—เบตเปˆเบเปเบฒเบซเบ™เบปเบ”เป€เบญเบ‡เบˆเบฐเบ–เบทเบเบ™เปเบฒเป„เบ›เปƒเบŠเป‰เปƒเบ™เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเปƒเบ” (CI / CD).

เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบ—เบตเปˆเบˆเบฐเบ•เบดเบ”เบ•เบฑเป‰เบ‡เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ‚เบญเบ‡เบžเบฒเบเบชเปˆเบงเบ™เบ—เบตเบชเบฒเบกเบขเปˆเบฒเบ‡เป€เบ›เบฑเบ™เบฅเบฐเบšเบปเบšเปเบฅเบฐเบ›เบฑเบšเบ›เบธเบ‡เปƒเบซเป‰เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเป€เบ›เบฑเบ™เบฅเบฐเบšเบปเบš. เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เปเบšเบšเบเบณเบ™เบปเบ”เป€เบญเบ‡เบ—เบตเปˆเบžเบฑเบ”เบ—เบฐเบ™เบฒเปƒเบ™ C++ เบซเบผเบท Python เบชเบฒเบกเบฒเบ”เบ–เบทเบเบ™เบณเปƒเบŠเป‰เปƒเบ™เบซเบผเบฒเบเบงเบดเบ—เบต. เปƒเบ™เบšเบฑเบ™เบ”เบฒเบžเบงเบเป€เบ‚เบปเบฒ, เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเบปเบเบ•เบปเบงเบขเปˆเบฒเบ‡: เบเบฒเบ™เบชเป‰เบฒเบ‡เบŠเบธเบ”เบฅเบฐเบšเบปเบš, เบชเบปเปˆเบ‡เบžเบงเบเบกเบฑเบ™เป„เบ›เบซเบฒเบšเปˆเบญเบ™เป€เบเบฑเบšเบกเป‰เบฝเบ™เบ‚เบญเบ‡เบฎเบนเบšเบžเบฒเบšเบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบกเบฑเบ™เบขเบนเปˆเปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ. เบ”เป‰เบงเบเป€เบซเบ”เบœเบปเบ™เบ—เบตเปˆเบšเปเปˆเบฎเบนเป‰เบˆเบฑเบ, เบงเบดเบ—เบตเบเบฒเบ™เบญเบทเปˆเบ™เป„เบ”เป‰เบ–เบทเบเป€เบฅเบทเบญเบ, เบ„เบท: เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ CI, เป„เบŸเบฅเปŒเบ—เบตเปˆเบ›เบฐเบ•เบดเบšเบฑเบ”เป„เบ”เป‰เบ‚เบญเบ‡เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ–เบทเบเบฅเบงเบšเบฅเบงเบก, เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเป‚เบ„เบ‡เบเบฒเบ™ virtual เบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™, เป‚เบกเบ”เบนเบ™ py เบ–เบทเบเบ•เบดเบ”เบ•เบฑเป‰เบ‡เบˆเบฒเบ requirement.txt, เปเบฅเบฐเบชเบดเปˆเบ‡เบ›เบญเบกเบ—เบฑเบ‡เบซเบกเบปเบ”เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบ–เบทเบเบชเบปเปˆเบ‡เบžเป‰เบญเบกเบเบฑเบš configs, scripts เปเบฅเบฐ. เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ—เบตเปˆเบกเบฒเบžเป‰เบญเบกเบเบฑเบšเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ. เบ•เปเปˆเป„เบ›, เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ–เบทเบเป€เบ›เบตเบ”เบ•เบปเบงเป€เบ›เบฑเบ™เบœเบนเป‰เปƒเบŠเป‰ virtual เป‚เบ”เบเบšเปเปˆเบกเบตเบชเบดเบ”เบ‚เบญเบ‡เบœเบนเป‰เป€เบšเบดเปˆเบ‡เปเบเบ‡เบฅเบฐเบšเบปเบš.

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

เบกเบฑเบ™เป€เบ›เบฑเบ™เบกเบนเบ™เบ„เปˆเบฒเบ—เบตเปˆเบชเบฑเบ‡เป€เบเบ”เบงเปˆเบฒเบเบฒเบ™เบ›เบฐเบเบญเบšเปเบฅเบฐเบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเปเบกเปˆเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบขเบนเปˆเปƒเบ™เบฎเบนเบšเบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡, เบšเปˆเบญเบ™เบ—เบตเปˆเบŠเบธเบ”เบฅเบฐเบšเบปเบšเบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เป„เบ”เป‰เบ–เบทเบเบ•เบดเบ”เบ•เบฑเป‰เบ‡เปเบฅเป‰เบงเปเบฅเบฐเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบญเบทเปˆเบ™เป†.

เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเปเบ•เปˆเบฅเบฐเบชเบฐเบ„เบดเบšเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เปƒเบ™เบซเบ™เป‰เบฒเบงเบฝเบเปเบกเปˆเบ™เบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเปƒเบ™เบฅเบฑเบเบชเบฐเบ™เบฐเบ‚เบญเบ‡เบ•เบปเบ™เป€เบญเบ‡, เปเบ•เปˆเปเบ™เปˆเบ™เบญเบ™เบงเปˆเบฒเบ‚เป‰เบญเบเบˆเบฐเบšเปเปˆเป€เบงเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเบžเบงเบเบกเบฑเบ™. เบ„เปเบฒเบญเบฐเบ—เบดเบšเบฒเบเบ‚เบญเบ‡เบžเบงเบเบกเบฑเบ™เปเบ•เปˆเบฅเบฐเบ„เบปเบ™เบˆเบฐเปƒเบŠเป‰เป€เบงเบฅเบฒเบซเบผเบฒเบเปเบฅเบฐเบ™เบตเป‰เบšเปเปˆเปเบกเปˆเบ™เบˆเบธเบ”เบ›เบฐเบชเบปเบ‡เบ‚เบญเบ‡เบšเบปเบ”เบ„เบงเบฒเบก. เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบžเบฝเบ‡เปเบ•เปˆเบˆเบฐเบ”เบถเบ‡เบ”เบนเบ”เบ„เบงเบฒเบกเบชเบปเบ™เปƒเบˆเบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบ•เปเปˆเบเบฑเบšเบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบงเปˆเบฒเบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ‚เบญเบ‡เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบ›เบฐเบเบญเบšเบ”เป‰เบงเบเบฅเปเบฒเบ”เบฑเบšเบ‚เบญเบ‡ scripts เป‚เบ—เบซเบฒ:

  1. createconfig.py - เบชเป‰เบฒเบ‡โ€‹เป„เบŸเบฅโ€‹เปŒ settings.ini เบ—เบตเปˆโ€‹เบกเบตโ€‹เบเบฒเบ™โ€‹เบ•เบฑเป‰เบ‡โ€‹เบ„เปˆเบฒโ€‹เบญเบปเบ‡โ€‹เบ›เบฐโ€‹เบเบญเบšโ€‹เปƒเบ™โ€‹เบชเบฐโ€‹เบžเบฒเบšโ€‹เปเบงเบ”โ€‹เบฅเป‰เบญเบกโ€‹เบ•เปˆเบฒเบ‡เป†โ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹เบ•เปเปˆโ€‹เบกเบฒ (Preproductionโ€‹, เบเบฒเบ™โ€‹เบœเบฐโ€‹เบฅเบดเบ”โ€‹, เบเบฒเบ™โ€‹เบ—เบปเบ”โ€‹เบชเบญเบšโ€‹, ... )
  2. install_venv.sh - เบชเป‰เบฒเบ‡เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบก virtual เบชเปเบฒเบฅเบฑเบšเบญเบปเบ‡เบ›เบฐเบเบญเบš py เปƒเบ™เป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบตเบชเบฐเป€เบžเบฒเบฐเปเบฅเบฐเบ„เบฑเบ”เบฅเบญเบเบกเบฑเบ™เป„เบ›เบซเบฒเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบซเปˆเบฒเบ‡เป„เบเบชเบญเบเบซเบผเบตเบ
  3. เบเบฐเบเบฝเบก_init.d.py โ€” เบเบฐเบเบฝเบกเบชเบฐเบ„เบฃเบดเบšเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™-เบขเบธเบ”เบชเปเบฒเบฅเบฑเบšเบญเบปเบ‡เบ›เบฐเบเบญเบšเป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆเปเบกเปˆเปเบšเบš
  4. deploy.py - decomposes เปเบฅเบฐ restarts เบญเบปเบ‡เบ›เบฐเบเบญเบšเปƒเบซเบกเปˆ

เป€เบงเบฅเบฒเบœเปˆเบฒเบ™เป„เบ›. เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ‚เบญเบ‡เบ‚เบฑเป‰เบ™เบ•เบญเบ™เป„เบ”เป‰เบ–เบทเบเบ—เบปเบ”เปเบ—เบ™เป‚เบ”เบเบเบฒเบ™เบœเบฐเบฅเบดเบ”เบเปˆเบญเบ™เบเบฒเบ™เบœเบฐเบฅเบดเบ”เปเบฅเบฐเบเบฒเบ™เบœเบฐเบฅเบดเบ”. เป€เบžเบตเปˆเบกเบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบชเปเบฒเบฅเบฑเบšเบœเบฐเบฅเบดเบ”เบ•เบฐเบžเบฑเบ™เปƒเบ™เบเบฒเบ™เปเบˆเบเบขเบฒเบเบญเบทเปˆเบ™ (CentOS). เป„เบ”เป‰เป€เบžเบตเปˆเบก 5 เป€เบŠเบตเบšเป€เบงเบตเบ—เบตเปˆเบกเบตเบžเบฐเบฅเบฑเบ‡ เปเบฅเบฐ เป€เบŠเบตเบšเป€เบงเบตเบชเบฐเป€เปเบทเบญเบ™เบซเบผเบฒเบเบชเบดเบšเบญเบฑเบ™. เปเบฅเบฐเบกเบฑเบ™เป„เบ”เป‰เบเบฒเบเป€เบ›เบฑเบ™เบ„เบงเบฒเบกเบซเบเบธเป‰เบ‡เบเบฒเบเบซเบผเบฒเบเบ‚เบทเป‰เบ™เบชเปเบฒเบฅเบฑเบšเบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒเปเบฅเบฐเบœเบนเป‰เบ—เบปเบ”เบชเบญเบšเป€เบžเบทเปˆเบญเบ—เบปเบ”เบชเบญเบšเบงเบฝเบเบ‡เบฒเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒเปƒเบ™เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบ—เบตเปˆเปƒเบเป‰เบŠเบดเบ”เบเบฑเบšเบฅเบฑเบ”เบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบเบซเบผเบฒเบเบซเบผเบทเบซเบ™เป‰เบญเบ. เปƒเบ™เป€เบงเบฅเบฒเบ™เบตเป‰, เบกเบฑเบ™เป„เบ”เป‰เบเบฒเบเป€เบ›เบฑเบ™เบ—เบตเปˆเบŠเบฑเบ”เป€เบˆเบ™เบงเปˆเบฒเบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เบšเปเปˆเป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเป€เบฎเบฑเบ”เป‚เบ”เบเบšเปเปˆเบกเบตเบฅเบฒเบง ...

เบžเบฒเบเบ—เบต II

เบ™เบณเปƒเบŠเป‰เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบเบฑเบš Docker Swarm

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบเบธเปˆเบกเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเปเบกเปˆเบ™เบฅเบฐเบšเบปเบšเบ—เบตเปˆเบซเบ™เป‰เบฒเบ›เบฐเบ—เบฑเบšเปƒเบˆเบ‚เบญเบ‡เบชเบญเบ‡เบญเบปเบ‡เบ›เบฐเบเบญเบšเปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเบ—เบตเปˆเบšเปเปˆเป„เบ”เป‰เบญเบฐเบ—เบดเบšเบฒเบเป‚เบ”เบ Dockerfiles. เบ—เปˆเบฒเบ™เบžเบฝเบ‡เปเบ•เปˆเบชเบฒเบกเบฒเบ” configure เบกเบฑเบ™เบชเปเบฒเบฅเบฑเบš deployment เบเบฑเบšเบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบชเบฐเป€เบžเบฒเบฐเปƒเบ”เบซเบ™เบถเปˆเบ‡เป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›. เปœเป‰เบฒเบ—เบตเปˆเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเปเบกเปˆเบ™เป€เบžเบทเปˆเบญเบ™เบณเปƒเบŠเป‰เบเบธเปˆเบกเป€เบ‚เบปเป‰เบฒเปƒเบ™เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบ‚เบฑเป‰เบ™เบ•เบญเบ™เป€เบžเบทเปˆเบญเบ—เบปเบ”เบชเบญเบšเบเปˆเบญเบ™เบเบฒเบ™เบญเบญเบเบˆเบณเปœเปˆเบฒเบเบเปˆเบญเบ™.

เปƒเบ™เบ—เบฒเบ‡เบ—เบดเบ”เบชเบฐเบ”เบต, เบชเบฒเบกเบฒเบ”เบกเบตเบซเบผเบฒเบเบเบธเปˆเบกเป€เบฎเบฑเบ”เบงเบฝเบเบžเป‰เบญเบกเป†เบเบฑเบ™: เบซเบผเบฒเบเป€เบ—เบปเปˆเบฒเบ—เบตเปˆเบกเบตเบงเบฝเบเบ‡เบฒเบ™เบขเบนเปˆเปƒเบ™เบฅเบฑเบ”เบชเปเบฒเป€เบฅเบฑเบ”เบซเบผเบทเปƒเบเป‰เบˆเบฐเบชเปเบฒเป€เบฅเบฑเบ”. เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเปƒเบ™เบเบฒเบ™เบเปเบฒเบˆเบฑเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบซเบผเบฒเบเบเบธเปˆเบกเปƒเบ™เปเบ•เปˆเบฅเบฐเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ. เปเบ•เปˆเบฅเบฐเบเบธเปˆเบกเบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ•เป‰เบญเบ‡เป‚เบ”เบ”เบ”เปˆเบฝเบง (เบ•เป‰เบญเบ‡เบšเปเปˆเบกเบตเบˆเบธเบ”เบ•เบฑเบ”เบเบฑเบ™เปƒเบ™เบžเบญเบ”, เป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบต, เปเบฅเบฐเบญเบทเปˆเบ™เป†).

เบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เบ—เบตเปˆเบกเบตเบ„เบธเบ™เบ„เปˆเบฒเบ—เบตเปˆเบชเบธเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเปเบกเปˆเบ™เป€เบงเบฅเบฒเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ, เปเบฅเบฐเบžเบงเบเป€เบฎเบปเบฒเบšเปเปˆเบกเบตเบกเบฑเบ™เบซเบผเบฒเบ.

เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เป„เบงเบ‚เบถเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเป€เบฅเบทเบญเบ Docker Swarm เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบ„เบงเบฒเบกเบ‡เปˆเบฒเบเบ”เบฒเบเปเบฅเบฐเบ„เบงเบฒเบกเบเบทเบ”เบซเบเบธเปˆเบ™เบ‚เบญเบ‡เบชเบฐเบ–เบฒเบ›เบฑเบ”เบ•เบฐเบเบฐเบเปเบฒ. เบชเบดเปˆเบ‡เบ—เปเบฒเบญเบดเบ”เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเป€เบฎเบฑเบ”เปเบกเปˆเบ™เบชเป‰เบฒเบ‡เบœเบนเป‰เบˆเบฑเบ”เบเบฒเบ™เปเบฅเบฐเบซเบผเบฒเบ nodes เปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบซเปˆเบฒเบ‡เป„เบเบชเบญเบเบซเบผเบตเบ:

$ 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

เบ•เปเปˆเป„เบ›, เบžเบงเบเป€เบฎเบปเบฒเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ Gitlab-CI เปเบฅเบฐ Swarm nodes เปƒเบ™เป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เบ‚เบญเบ‡เบเบฒเบ™เบ„เบงเบšเบ„เบธเบกเบซเปˆเบฒเบ‡เป„เบเบชเบญเบเบซเบผเบตเบเบ‚เบญเบ‡ nodes เบˆเบฒเบ CI: เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เปƒเบšเบขเบฑเป‰เบ‡เบขเบทเบ™, เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ•เบปเบงเปเบ›เบฅเบฑเบš, เปเบฅเบฐเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบšเปเบฅเบดเบเบฒเบ™ Docker เปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบเบฒเบ™เบ„เบงเบšเบ„เบธเบก. เบญเบฑเบ™เบ™เบตเป‰ เบšเบปเบ”เบ„เบงเบฒเบก เบŠเปˆเบงเบเบ›เบฐเบขเบฑเบ”เบžเบงเบเป€เบฎเบปเบฒเบซเบผเบฒเบเป€เบงเบฅเบฒ.

เบ•เปเปˆเป„เบ›, เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เป€เบžเบตเปˆเบกเบงเบฝเบเบเบฒเบ™เบชเป‰เบฒเบ‡ stack เปเบฅเบฐเบเบฒเบ™เบ—เปเบฒเบฅเบฒเบเบเบฑเบš .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) เป„เบ”เป‰เบ–เบทเบเป€เบžเบตเปˆเบกเปƒเบชเปˆ Pipelines, เบฎเบฝเบเบฎเป‰เบญเบ‡เปƒเบซเป‰เบกเบตเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ„เบนเปˆเบกเบท.

เบ™เบณเปƒเบŠเป‰เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบเบฑเบš Docker Swarm
เบŠเบทเปˆ stack เบเบปเบ‡เบเบฑเบšเบŠเบทเปˆเบชเบฒเบ‚เบฒเปเบฅเบฐเบ„เบงเบฒเบกเป€เบ›เบฑเบ™เป€เบญเบเบฐเบฅเบฑเบเบ™เบตเป‰เบ„เบงเบ™เบˆเบฐเบžเบฝเบ‡เบžเป. เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เปƒเบ™ stack เป„เบ”เป‰เบฎเบฑเบšเบ—เบตเปˆเบขเบนเปˆ ip เบ—เบตเปˆเป€เบ›เบฑเบ™เป€เบญเบเบฐเบฅเบฑเบ, เปเบฅเบฐเบžเบญเบ”, เป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบต, เปเบฅเบฐเบญเบทเปˆเบ™เป†. เบˆเบฐเบ–เบทเบเป‚เบ”เบ”เบ”เปˆเบฝเบง, เปเบ•เปˆเบ„เบทเบเบฑเบ™เบˆเบฒเบ stack เบเบฑเบš stack (เป€เบžเบฒเบฐเบงเปˆเบฒเป„เบŸเบฅเปŒเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเปเบกเปˆเบ™เบ„เบทเบเบฑเบ™เบชเปเบฒเบฅเบฑเบš stacks เบ—เบฑเบ‡เบซเบกเบปเบ”) - เบชเบดเปˆเบ‡เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™. เบžเบงเบเป€เบฎเบปเบฒ deploy stack (cluster) เป‚เบ”เบเปƒเบŠเป‰ 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) เบ–เบทเบเปเบเบเบญเบญเบเบˆเบฒเบเบชเบฐเบ™เบธเบเป€เบเบตเบ—เบปเปˆเบงเป„เบ›เบ‚เบญเบ‡เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ—เบตเปˆเบเปเบฒเบซเบ™เบปเบ”เป€เบญเบ‡ (เปƒเบ™เปเบœเบ™เบเบฒเบ™เปเบฅเบฐ custom เปเบกเปˆเบ™เปเบšเปˆเบ‡เบญเบญเบเป€เบ›เบฑเบ™เบšเปเบฅเบดเบเบฒเบ™). เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบเบฒเบ™เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบ‚เบญเบ‡เบเบธเปˆเบกเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบเบฒเบ™เบ–เปˆเบฒเบเบ—เบญเบ” CMD เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบฎเบนเบšเบžเบฒเบšเบ—เบตเปˆเบกเบตเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆเบญเบฑเบ™เบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเปเบฅเบฐเป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›เปเบฅเป‰เบง, เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบšเปเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบˆเบฒเบเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ—เบตเปˆเป„เบ”เป‰เบญเบฐเบ—เบดเบšเบฒเบเป„เบงเป‰เปƒเบ™เบžเบฒเบ I. เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเป€เบ™เบฑเป‰เบ™เปƒเบซเป‰เป€เบซเบฑเบ™เบ„เบงเบฒเบกเปเบ•เบเบ•เปˆเบฒเบ‡:

  • git clone... - เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เป„เบŸเบฅโ€‹เปŒโ€‹เบ—เบตเปˆโ€‹เบˆเปเบฒโ€‹เป€เบ›เบฑเบ™โ€‹เป€เบžเบทเปˆเบญโ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰ (createconfig.pyโ€‹, install_venv.shโ€‹, เปเบฅเบฐโ€‹เบญเบทเปˆเบ™เป†โ€‹)
  • curl... && unzip... - เบ”เบฒเบงโ€‹เบ™โ€‹เปŒโ€‹เป‚เบซเบฅเบ”โ€‹เปเบฅเบฐ unzip เบเบฒเบ™โ€‹เบเปเปˆโ€‹เบชเป‰เบฒเบ‡ artifacts (เบญเบธโ€‹เบ›เบฐโ€‹เบเบญเบ™โ€‹เบเบฒเบ™โ€‹เบชเบฑเบ‡โ€‹เบฅเบงเบกโ€‹)

เบกเบตเบžเบฝเบ‡เปเบ•เปˆเบซเบ™เบถเปˆเบ‡เบšเบฑเบ™เบซเบฒเบ—เบตเปˆเบเบฑเบ‡เบšเปเปˆเป„เบ”เป‰เบญเบฐเบ—เบดเบšเบฒเบ: เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ—เบตเปˆเบกเบตเบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเป€เบงเบฑเบšเป„เบŠเบ•เปŒเปเบกเปˆเบ™เบšเปเปˆเบชเบฒเบกเบฒเบ”เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เป„เบ”เป‰เบˆเบฒเบเบ•เบปเบงเบ—เปˆเบญเบ‡เป€เบงเบฑเบšเบ‚เบญเบ‡เบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒ. เบžเบงเบเป€เบฎเบปเบฒเปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเบ™เบตเป‰เป‚เบ”เบเปƒเบŠเป‰ reverse proxy, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™:

เปƒเบ™ .gitlab-ci.yml, เบซเบผเบฑเบ‡เบˆเบฒเบ deploy the cluster stack, we add line of deploy the balancer (เบŠเบถเปˆเบ‡, เป€เบกเบทเปˆเบญ commits, เบžเบฝเบ‡เปเบ•เปˆเบ›เบฑเบšเบ›เบธเบ‡เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ‚เบญเบ‡เบกเบฑเบ™ (เบชเป‰เบฒเบ‡เป„เบŸเบฅเปŒเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ 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

docker-compose-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; เบเปเบฒเบ™เบปเบ” url เบเบฑเบš nginx:

10.50.173.106 staging_BRANCH-1831_cluster.dev

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบเบฒเบ™เบˆเบฑเบ”เบงเบฒเบ‡เบเบธเปˆเบกเบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ—เบตเปˆเป‚เบ”เบ”เบ”เปˆเบฝเบงเป„เบ”เป‰เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เปเบฅเบฐเปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒเบชเบฒเบกเบฒเบ”เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เปƒเบซเป‰เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเปƒเบ™เบˆเปเบฒเบ™เบงเบ™เบ—เบตเปˆเบžเบฝเบ‡เบžเปเป€เบžเบทเปˆเบญเบเบงเบ”เบเบฒเป€เบšเบดเปˆเบ‡เบงเบฝเบเบ‡เบฒเบ™เบ‚เบญเบ‡เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒ.

เปเบœเบ™โ€‹เบเบฒเบ™โ€‹เปƒเบ™โ€‹เบญเบฐโ€‹เบ™เบฒโ€‹เบ„เบปเบ”โ€‹:

  • เปเบเบเบญเบปเบ‡เบ›เบฐเบเบญเบšเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเป€เบ›เบฑเบ™เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™
  • เบกเบตเบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐ Dockerfile
  • เบเบงเบ”เบžเบปเบšเป‚เบ™เบ”เบ—เบตเปˆเป‚เบซเบผเบ”เปœเป‰เบญเบเบฅเบปเบ‡เป‚เบ”เบเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เปƒเบ™ stack
  • เบฅเบฐเบšเบธ nodes เป‚เบ”เบเบฎเบนเบšเปเบšเบšเบŠเบทเปˆ (เปเบ—เบ™เบ—เบตเปˆเบˆเบฐเปƒเบŠเป‰ id เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบก)
  • เป€เบžเบตเปˆเบกเบเบฒเบ™เบเบงเบ”เบชเบญเบšเบงเปˆเบฒ stack เป„เบ”เป‰เบ–เบทเบเบ—เปเบฒเบฅเบฒเบ
  • ...

เบ‚เบญเบšเปƒเบˆเบžเบดเป€เบชเบ”เบชเบณเบฅเบฑเบš เบšเบปเบ”เบ„เบงเบฒเบก.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™