Ampidiro ny fampiharana miaraka amin'ny Docker Swarm

Ny rafitra fanolorana votoaty video an-tserasera izay iasanay dia fampivoarana ara-barotra mihidy ary ara-teknika dia vondrona misy singa maromaro misy singa tompona sy loharano misokatra. Ny tanjon'ny fanoratana an'ity lahatsoratra ity dia ny hamaritana ny fampiharana ny rafitra fivondronan'ny docker swarm ho an'ny tranokala fanaovana hetsika nefa tsy manelingelina ny fizotran'ny fizotranay ao anatin'ny fotoana voafetra. Mizara roa ny fitantarana atolotra anao. Ny ampahany voalohany dia mamaritra ny CI / CD alohan'ny fampiasana docker swarm, ary ny faharoa dia mamaritra ny fizotran'ny fampiharana azy. Ireo izay tsy liana amin'ny famakiana ny ampahany voalohany dia afaka mandroso soa aman-tsara any amin'ny faharoa.

Fizarana I

Niverina tamin'ny taona lavitra sy lavitra, dia nilaina ny nanangana haingana ny fizotran'ny CI / CD. Ny iray amin'ireo fepetra dia ny tsy fampiasana Docker ho an'ny fametrahana novolavolaina singa noho ny antony maro:

  • ho an'ny fampandehanana singa azo antoka sy azo antoka kokoa amin'ny Production (izany hoe, ny fepetra tsy tokony hampiasana virtoaly)
  • Tsy te hiara-hiasa amin'i Docker ny mpamorona malaza (hafahafa, fa izany no izy)
  • araka ny fiheverana ideolojikan'ny fitantanana R&D

Ny fotodrafitrasa, ny stack ary ny fepetra takiana voalohany ho an'ny MVP dia naseho toy izao manaraka izao:

  • Mpizara 4 Intel® X5650 miaraka amin'i Debian (milina iray matanjaka kokoa no mivoatra tanteraka)
  • Ny fampandrosoana ny singa manokana dia atao amin'ny C ++, Python3
  • Fitaovam-pitaovana lehibe 3rd ampiasaina: Kafka, Clickhouse, Airflow, Redis, Grafana, Postgresql, Mysql, ...
  • Pipelines ho an'ny fanamboarana sy fitiliana singa mitokana ho an'ny debug sy ny famoahana

Ny iray amin'ireo fanontaniana voalohany tokony hodinihina amin'ny dingana voalohany dia ny fomba hametrahana singa manokana amin'ny tontolo rehetra (CI / CD).

Nanapa-kevitra ny hametraka ireo singa avy amin'ny antoko fahatelo amin'ny fomba ara-dalàna izahay ary manavao azy ireo amin'ny rafitra. Ny fampiharana manokana novolavolaina amin'ny C++ na Python dia azo apetraka amin'ny fomba maro. Anisan'izany, ohatra: mamorona fonosana rafitra, mandefa azy ireo any amin'ny fitehirizana sary namboarina ary avy eo mametraka azy ireo amin'ny lohamilina. Noho ny antony tsy fantatra dia nisy fomba iray hafa nofidina, dia ny: mampiasa CI, amboarina ny rakitra azo tanterahana amin'ny fampiharana, ny tontolon'ny tetikasa virtoaly dia noforonina, ny py modules dia napetraka avy amin'ny requirements.txt, ary ireo artifact rehetra ireo dia alefa miaraka amin'ny configs, script ary ny miaraka amin'ny tontolo fampiharana amin'ny mpizara. Manaraka, atomboka ho mpampiasa virtoaly tsy misy zon'ny mpitantana ny fampiharana.

Gitlab-CI dia voafidy ho rafitra CI/CD. Ny pipeline vokatr'izany dia nijery toy izao:

Ampidiro ny fampiharana miaraka amin'ny Docker Swarm
Raha ara-drafitra, dia toy izao ny 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

Tsara ny manamarika fa ny fivoriambe sy ny fitsapana dia atao amin'ny sariny manokana, izay efa napetraka ny fonosana rafitra ilaina rehetra ary efa vita ny fanovana hafa.

Na dia mahaliana amin'ny fomba manokana aza ny tsirairay amin'ireo script amin'ny asa ireo, mazava ho azy fa tsy hiresaka momba azy ireo aho. Ny famaritana ny tsirairay amin'izy ireo dia haka fotoana be ary tsy izany no tanjon'ny lahatsoratra. Hisarika ny sainao ho amin'ny zava-misy ihany aho fa ny dingan'ny fametrahana dia misy andian-dahatsoratra miantso:

  1. createconfig.py - mamorona fisie settings.ini miaraka amin'ny firafitry ny singa amin'ny tontolo isan-karazany ho an'ny fametrahana manaraka (Preproduction, Production, Testing, ...)
  2. install_venv.sh - mamorona tontolo virtoaly ho an'ny singa py ao anaty lahatahiry manokana ary mandika izany any amin'ny mpizara lavitra
  3. prepare_init.d.py - manomana script fanombohana ho an'ny singa mifototra amin'ny môdely
  4. deploy.py - manimba sy mamerina ny singa vaovao

Nandeha ny fotoana. Nosoloina mialoha ny famokarana sy famokarana. Fanampiana fanampiny ho an'ny vokatra amin'ny fizarana iray hafa (CentOS). Nanampy mpizara ara-batana 5 mahery kokoa sy virtoaly am-polony. Ary nanjary sarotra kokoa ho an'ny mpamorona sy mpanandrana ny nanandrana ny asany amin'ny tontolo iray akaiky kokoa na latsaka amin'ny fanjakana miasa. Tamin'izany fotoana izany dia nanjary nazava fa tsy azo atao raha tsy misy azy ...

Fizarana II

Ampidiro ny fampiharana miaraka amin'ny Docker Swarm

Noho izany, ny klustery dia rafitra mahavariana misy singa roa misaraka roa izay tsy nofaritan'i Dockerfiles. Azonao atao ihany ny manamboatra azy io mba hapetraka amin'ny tontolo manokana amin'ny ankapobeny. Ny andraikitray dia ny mametraka ny cluster ho amin'ny tontolon'ny fanaovana fitiliana azy alohan'ny andrana mialoha ny famoahana.

Ara-teorika, mety misy cluster maromaro mandeha miaraka: betsaka araka izay misy asa ao amin'ny fanjakana vita na efa ho vita. Ny fahaiza-manaon'ireo mpizara eo am-pelatananay dia ahafahantsika mampandeha cluster maromaro amin'ny mpizara tsirairay. Tsy maintsy mitoka-monina ny cluster tsirairay (tsy tokony hisy fihaonan-dalana amin'ny seranana, lahatahiry, sns.).

Ny fananantsika tena sarobidy dia ny fotoanantsika, ary tsy nanana firy tamin’izany isika.

Ho fanombohana haingana kokoa dia nisafidy ny Docker Swarm izahay noho ny fahatsorany sy ny fahaiza-manaony. Ny zavatra voalohany nataonay dia namorona mpitantana sy node maromaro amin'ny mpizara lavitra:

$ 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

Manaraka, mamorona tambajotra:


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

Manaraka izany dia nampifandray ny Gitlab-CI sy ny Swarm nodes izahay amin'ny resaka fanaraha-maso lavitra ny nodes avy amin'ny CI: fametrahana mari-pankasitrahana, fametrahana variables miafina, ary fametrahana ny serivisy Docker amin'ny mpizara fanaraha-maso. Ity iray ity lahatsoratra namonjy antsika fotoana be.

Manaraka izany dia nanampy asa famoronana sy fandravana ny .gitlab-ci .yml izahay.

Asa vitsivitsy fanampiny no nampiana .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

Avy amin'ny snippet kaody etsy ambony, hitanao fa bokotra roa (deploy_staging, stop_staging) no nampiana tao amin'ny Pipelines, mitaky asa tanana.

Ampidiro ny fampiharana miaraka amin'ny Docker Swarm
Mifanaraka amin'ny anaran'ny sampana ny anaran'ny stack ary tokony ho ampy izany maha-tokana izany. Ny serivisy ao amin'ny stack dia mahazo adiresy ip tokana, sy seranan-tsambo, lahatahiry, sns. dia hitoka-monina, fa mitovy amin'ny stack mankany stack (satria mitovy amin'ny stack rehetra ny rakitra fanamafisana) - izay tadiavinay. Mampiasa ny stack (cluster) izahay docker-compose.yml, izay mamaritra ny 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

Eto ianao dia afaka mahita fa ny singa dia mifandray amin'ny tambajotra iray (nw_swarm) ary azo ampiasaina.

Ny singa rafitra (mifototra amin'ny redis, mysql) dia misaraka amin'ny dobo ankapoben'ny singa mahazatra (amin'ny drafitra ary ny mahazatra dia mizara ho serivisy). Ny dingan'ny fametrahana ny klustery dia toa mamindra ny CMD amin'ny sary lehibe iray voarindra ary, amin'ny ankapobeny, dia tsy mitovy amin'ny fametrahana voalaza ao amin'ny Fizarana I. Hanasongadina ireo fahasamihafana aho:

  • git clone... - alaivo ny rakitra ilaina haparitaka (createconfig.py, install_venv.sh, sns.)
  • curl... && unzip... - misintona sy unzip fananganana artifacts (fitaovana natambatra)

Iray ihany no olana mbola tsy voafaritra: tsy azo idirana amin'ny mpitety tranonkalan'ny mpamorona ny singa misy interface tsara. Mamaha ity olana ity izahay amin'ny alàlan'ny proxy reverse, toy izao:

Ao amin'ny .gitlab-ci.yml, aorian'ny fametrahana ny kluster stack, dia ampianay ny tsipika fametrahana ny balancer (izay, rehefa commit, dia manavao fotsiny ny configuration azy (mamorona rakitra konfigurasi nginx vaovao araka ny maodely: /etc/nginx/conf. d/${CI_COMMIT_REF_NAME}.conf) - jereo 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

Ao amin'ny solosaina fampandrosoana, manavao /etc/hosts; manendry url amin'ny nginx:

10.50.173.106 staging_BRANCH-1831_cluster.dev

Noho izany, efa nampiharina ny fametrahana ireo klustera mitoka-monina ary afaka mampandeha azy ireo amin'ny isa ampy hanamarinana ny asany ny mpamorona.

Ny drafitra ho avy:

  • Zarao ho serivisy ny singanay
  • Manana ho an'ny Dockerfile tsirairay
  • Mamantatra ho azy ireo node tsy dia misy entana ao amin'ny stack
  • Ampidiro ny nodes amin'ny lamina anarana (fa tsy mampiasa id toy ny ao amin'ny lahatsoratra)
  • Manampia fanamarinana fa rava ny stack
  • ...

Misaotra manokana lahatsoratra.

Source: www.habr.com

Add a comment