I-deploy ang mga Aplikasyon gamit ang Docker Swarm

Ang sistema sa rekomendasyon sa sulud sa online nga video nga among gitrabaho usa ka sirado nga pag-uswag sa komersyo ug sa teknikal usa ka multi-component cluster sa proprietary ug open source nga mga sangkap. Ang katuyoan sa pagsulat niini nga artikulo mao ang paghulagway sa pagpatuman sa docker swarm clustering system alang sa usa ka staging site nga dili makabalda sa natukod nga workflow sa among mga proseso sa limitado nga panahon. Ang asoy nga gipresentar sa imong pagtagad gibahin sa duha ka bahin. Ang una nga bahin naghulagway sa CI / CD sa wala pa gamiton ang docker swarm, ug ang ikaduha naghulagway sa proseso sa pagpatuman niini. Kadtong dili interesado sa pagbasa sa unang bahin mahimong luwas nga makapadayon sa ikaduha.

Bahin ko

Balik sa layo, layo nga tuig, kinahanglan nga i-set up ang proseso sa CI / CD sa labing madali. Usa sa mga kondisyon mao ang dili paggamit sa Docker alang sa deployment naugmad nga mga sangkap alang sa daghang mga hinungdan:

  • alang sa mas kasaligan ug lig-on nga operasyon sa mga sangkap sa Production (nga mao, sa tinuud, ang kinahanglanon nga dili mogamit sa virtualization)
  • Ang nanguna nga mga developer dili gusto nga magtrabaho kauban ang Docker (katingad-an, apan ingon ana kini)
  • sumala sa mga konsiderasyon sa ideolohiya sa pagdumala sa R&D

Ang imprastraktura, stack ug gibanabana nga inisyal nga mga kinahanglanon alang sa MVP gipresentar ingon sa mosunod:

  • 4 Intel® X5650 server nga adunay Debian (usa ka mas kusgan nga makina ang hingpit nga naugmad)
  • Ang pag-uswag sa kaugalingon nga naandan nga mga sangkap gihimo sa C ++, Python3
  • Panguna nga 3rd party nga mga himan nga gigamit: Kafka, Clickhouse, Airflow, Redis, Grafana, Postgresql, Mysql, ...
  • Pipelines alang sa pagtukod ug pagsulay sa mga sangkap nga gilain alang sa pag-debug ug pagpagawas

Usa sa mga una nga pangutana nga kinahanglan nga sulbaron sa inisyal nga yugto mao kung giunsa ang mga naandan nga sangkap nga i-deploy sa bisan unsang palibot (CI / CD).

Nakahukom kami nga i-install ang mga sangkap sa ikatulo nga partido nga sistematiko ug i-update kini sa sistematiko. Ang mga custom nga aplikasyon nga gihimo sa C++ o Python mahimong ma-deploy sa daghang paagi. Lakip kanila, pananglitan: paghimo sa mga pakete sa sistema, ipadala kini sa repositoryo sa mga gitukod nga mga imahe ug dayon i-install kini sa mga server. Alang sa wala mahibal-an nga hinungdan, lain nga pamaagi ang gipili, nga mao ang: gamit ang CI, ang mga file nga mahimo’g magamit sa aplikasyon giipon, usa ka virtual nga palibot sa proyekto gihimo, gi-install ang mga py module gikan sa requirements.txt, ug kining tanan nga mga artifact gipadala kauban ang mga config, script ug ang nag-uban nga palibot sa aplikasyon sa mga server. Sunod, ang mga aplikasyon gilunsad isip usa ka virtual nga tiggamit nga walay mga katungod sa tigdumala.

Gitlab-CI ang gipili isip CI/CD system. Ang resulta nga pipeline ingon niini:

I-deploy ang mga Aplikasyon gamit ang Docker Swarm
Sa istruktura, ang gitlab-ci.yml ingon niini

---
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

Angay nga matikdan nga ang asembliya ug pagsulay gihimo sa kaugalingon nga imahe, diin ang tanan nga kinahanglan nga mga pakete sa sistema na-install na ug ang uban pang mga setting nahimo na.

Bisan kung ang matag usa niini nga mga script sa mga trabaho makapaikag sa kaugalingon nga paagi, apan siyempre dili ako maghisgot bahin niini.Ang paghulagway sa matag usa kanila magkinahanglan daghang oras ug dili kini ang katuyoan sa artikulo. Ihatag ra nako ang imong atensyon sa kamatuoran nga ang yugto sa pag-deploy naglangkob sa usa ka han-ay sa mga script sa pagtawag:

  1. createconfig.py - nagmugna og settings.ini file nga adunay component settings sa lain-laing mga environment para sa sunod nga deployment (Preproduction, Production, Testing, ...)
  2. install_venv.sh - Naghimo usa ka virtual nga palibot alang sa mga sangkap sa py sa usa ka piho nga direktoryo ug gikopya kini sa mga hilit nga server
  3. prepare_init.d.py - nag-andam sa pagsugod-stop nga mga script alang sa sangkap base sa template
  4. deploy.py - nadugta ug gi-restart ang bag-ong mga sangkap

Milabay ang panahon. Ang yugto sa entablado gipulihan sa preproduction ug production. Gidugang nga suporta alang sa produkto sa usa pa nga pag-apod-apod (CentOS). Gidugang ang 5 nga labi ka kusgan nga pisikal nga mga server ug usa ka dosena nga mga virtual. Ug kini nahimong mas ug mas lisud alang sa mga developers ug mga tester sa pagsulay sa ilang mga buluhaton sa usa ka palibot nga mas o dili kaayo duol sa nagtrabaho nga estado. Niini nga panahon, nahimong tin-aw nga imposible nga buhaton kung wala siya ...

Bahin II

I-deploy ang mga Aplikasyon gamit ang Docker Swarm

Mao nga, ang among cluster usa ka talagsaon nga sistema sa usa ka dosena nga managsama nga mga sangkap nga wala gihulagway sa Dockerfiles. Mahimo ra nimo kini i-configure alang sa pag-deploy sa usa ka piho nga palibot sa kinatibuk-an. Ang among tahas mao ang pag-deploy sa cluster sa usa ka staging environment aron sulayan kini sa dili pa ang pre-release testing.

Sa teoriya, mahimong adunay daghang mga cluster nga nagdagan nga dungan: kutob sa adunay mga buluhaton sa nahuman nga estado o hapit na makompleto. Ang mga kapasidad sa mga server nga among magamit nagtugot kanamo sa pagpadagan sa daghang mga cluster sa matag server. Ang matag staging cluster kinahanglan nga ilain (kinahanglan walay intersection sa mga pantalan, direktoryo, ug uban pa).

Ang among labing bililhon nga kapanguhaan mao ang among oras, ug wala kaayo kami niini.

Alang sa mas paspas nga pagsugod, gipili namo ang Docker Swarm tungod sa kayano ug pagka-flexible sa arkitektura. Ang una nga butang nga among gibuhat mao ang paghimo usa ka manager ug daghang mga node sa hilit nga mga server:

$ 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

Sunod, paghimo og network:


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

Sunod, among gikonektar ang Gitlab-CI ug Swarm nodes sa mga termino sa remote control sa mga node gikan sa CI: pag-instalar sa mga sertipiko, pag-set sa sekretong mga variable, ug pag-set up sa serbisyo sa Docker sa control server. Kini usa nga artikulo nagluwas kanamo sa daghang oras.

Sunod, gidugang namo ang paghimo ug mga trabaho sa pagguba sa stack sa .gitlab-ci .yml.

Pipila pa ka trabaho ang gidugang sa .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

Gikan sa snippet sa code sa ibabaw, imong makita nga duha ka buton (deploy_staging, stop_staging) ang gidugang sa Pipelines, nga nagkinahanglan og manwal nga aksyon.

I-deploy ang mga Aplikasyon gamit ang Docker Swarm
Ang ngalan sa stack mohaum sa ngalan sa sanga ug kini nga pagkatalagsaon kinahanglan nga igo. Ang mga serbisyo sa stack makadawat og talagsaon nga mga adres sa ip, ug mga pantalan, mga direktoryo, ug uban pa. ilain, apan parehas gikan sa stack hangtod sa stack (tungod kay ang file sa pag-configure parehas alang sa tanan nga mga stack) - kung unsa ang gusto namon. Gi-deploy namo ang stack (cluster) gamit docker-compose.yml, nga naghulagway sa among cluster.

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

Dinhi imong makita nga ang mga sangkap konektado sa usa ka network (nw_swarm) ug magamit sa usag usa.

Ang mga sangkap sa sistema (base sa redis, mysql) gibulag gikan sa kinatibuk-ang hugpong sa mga naandan nga sangkap (sa mga plano ug ang mga kostumbre gibahin ingon mga serbisyo). Ang deployment stage sa among cluster morag gipasa ang CMD sa among usa ka dako nga configured nga imahe ug, sa kinatibuk-an, halos wala magkalahi sa deployment nga gihulagway sa Part I. Akong ipasiugda ang mga kalainan:

  • git clone... - kuhaa ang mga file nga gikinahanglan aron ma-deploy (createconfig.py, install_venv.sh, etc.)
  • curl... && unzip... - Pag-download ug pag-unzip sa pagtukod sa mga artifact (nagtipon nga mga gamit)

Adunay usa ra nga wala pa mahulagway nga problema: ang mga sangkap nga adunay interface sa web dili ma-access gikan sa mga browser sa mga developer. Gisulbad namon kini nga problema gamit ang reverse proxy, sa ingon:

Sa .gitlab-ci.yml, human ma-deploy ang cluster stack, atong idugang ang linya sa pag-deploy sa balancer (nga, kung mo-commit, mag-update lang sa configuration niini (makahimo ug bag-ong nginx configuration files sumala sa template: /etc/nginx/conf. d/${CI_COMMIT_REF_NAME}.conf) - tan-awa ang docker-compose-nginx.yml code)

    - 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

Sa pagpalambo sa mga kompyuter, i-update ang /etc/hosts; prescribe url sa nginx:

10.50.173.106 staging_BRANCH-1831_cluster.dev

Busa, ang deployment sa nahilit nga staging clusters gipatuman na ug ang mga developers mahimo na nga magpadagan niini sa bisan unsang gidaghanon nga igo aron masusi ang ilang mga buluhaton.

Mga plano sa umaabot:

  • Ibulag ang among mga sangkap ingon mga serbisyo
  • Adunay alang sa matag Dockerfile
  • Awtomatikong makit-an ang dili kaayo gikarga nga mga node sa stack
  • Ipiho ang mga node pinaagi sa ngalan nga sumbanan (imbes nga gamiton ang id sama sa artikulo)
  • Pagdugang og tseke nga ang stack naguba
  • ...

Espesyal nga salamat sa usa ka artikulo.

Source: www.habr.com

Idugang sa usa ka comment