Cleachd tagraidhean a’ cleachdadh Docker Swarm

Tha an siostam moladh susbaint bhidio air-loidhne air a bheil sinn ag obair na leasachadh malairteach dùinte agus gu teicnigeach tha e na bhuidheann ioma-phàirteach de phàirtean seilbh agus stòr fosgailte. Is e adhbhar a bhith a’ sgrìobhadh an artaigil seo cunntas a thoirt air buileachadh siostam cruinneachadh swarm docker airson àrd-ùrlar stèidse, gun a bhith a’ cur dragh air sruth-obrach stèidhichte ar pròiseasan fo chumhachan ùine cuibhrichte. Tha an aithris a thèid a thoirt don aire agad air a roinn ann an dà phàirt. Tha a’ chiad phàirt a’ toirt cunntas air CI/CD mus cleachdar swarm docker, agus tha an dàrna pàirt a’ toirt cunntas air a’ phròiseas airson a chur an gnìomh. Faodaidh an fheadhainn aig nach eil ùidh ann a bhith a 'leughadh a' chiad phàirt gluasad gu sàbhailte chun an dàrna fear.

Pàirt I.

Uair dhe na h-uairean, bha feum air pròiseas CI/CD a stèidheachadh cho luath sa ghabhas. B’ e aon de na cumhaichean gun a bhith a’ cleachdadh Docker airson cleachdadh co-phàirtean a leasachadh airson grunn adhbharan:

  • airson obrachadh nas earbsaiche agus nas seasmhaiche de phàirtean ann an Riochdachadh (ie, gu dearbh, an riatanas gun a bhith a’ cleachdadh virtualization)
  • cha robh prìomh luchd-leasachaidh ag iarraidh a bhith ag obair le Docker (neònach, ach sin mar a bha e)
  • airson adhbharan ideòlach a thaobh riaghladh R&D

Bha am bun-structar, an stac agus na riatanasan tùsail tuairmseach airson an MVP mar a leanas:

  • 4 frithealaichean Intel® X5650 le Debian (aon inneal nas cumhachdaiche gu tur airson leasachadh)
  • Thathas a’ leasachadh na co-phàirtean àbhaisteach agad fhèin ann an C ++, Python3
  • Prìomh innealan 3rdparty air an cleachdadh: Kafka, Clickhouse, Airflow, Redis, Grafana, Postgresql, Mysql,…
  • Pìoban airson a bhith a’ togail agus a’ dèanamh deuchainn air co-phàirtean fa leth airson deasbaid is leigeil ma sgaoil

Is e aon de na ciad cheistean a dh’ fheumar fhuasgladh aig a’ chiad ìre mar a thèid co-phàirtean gnàthaichte a chleachdadh ann an àrainneachd sam bith (CI/CD).

Cho-dhùin sinn co-phàirtean treas-phàrtaidh a chuir a-steach gu riaghailteach agus an ùrachadh gu riaghailteach. Faodar tagraidhean gnàthaichte a chaidh an leasachadh ann an C ++ no Python a chleachdadh ann an grunn dhòighean. Nam measg, mar eisimpleir: cruthachadh pasganan siostam, gan cur gu stòr nan ìomhaighean cruinnichte agus an stàladh às deidh sin air frithealaichean. Airson adhbhar neo-aithnichte mu thràth, chaidh dòigh eile a thaghadh, is e sin: a’ cleachdadh CI, tha faidhlichean so-ghnìomhaichte air an cur ri chèile, tha àrainneachd pròiseict brìgheil air a chruthachadh, tha modalan py bho requirements.txt air an stàladh, agus tha na stuthan sin uile air an cur còmhla ri configs, sgriobtaichean agus an àrainneachd tagraidh a tha na chois dha na frithealaichean. An uairsin, thèid tagraidhean a chuir air bhog bho neach-cleachdaidh brìgheil gun chòraichean rianadair.

Chaidh Gitlab-CI a thaghadh mar an siostam CI/CD. Bha an loidhne-phìoban a thàinig às a’ coimhead rudeigin mar seo:

Cleachd tagraidhean a’ cleachdadh Docker Swarm
Gu structarail, bha coltas mar seo air 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

Is fhiach a bhith mothachail gu bheil co-chruinneachadh agus deuchainn air a dhèanamh air an ìomhaigh aige fhèin, far a bheil a h-uile pasgan siostam riatanach air a chuir a-steach mu thràth agus gu bheil suidheachaidhean eile air an dèanamh.

Ged a tha gach aon de na sgriobtaichean sin ann an obraichean inntinneach na dhòigh fhèin, gu cinnteach cha bhith mi a’ bruidhinn mun deidhinn; bheir cunntas air gach fear dhiubh mòran ùine agus chan e seo adhbhar an artaigil. Leig leam dìreach d ’aire a tharraing chun fhìrinn gu bheil an ìre cleachdadh a’ toirt a-steach sreath de sgriobtaichean gairm:

  1. cruthaichconfig.py - a’ cruthachadh faidhle settings.ini le roghainnean airson co-phàirtean ann an diofar àrainneachdan airson an cleachdadh às deidh sin (Ro-riochdachadh, Riochdachadh, Deuchainn, ...)
  2. install_venv.sh - a’ cruthachadh àrainneachd bhrìgheil airson co-phàirtean py ann an eòlaire sònraichte agus ga chopaigeadh gu frithealaichean iomallach
  3. ullaich_init.d.py - ag ullachadh sgriobtaichean airson co-phàirtean tòiseachaidh stèidhichte air an teamplaid
  4. cleachdadh.py - a’ cleachdadh agus ag ath-thòiseachadh phàirtean ùra

Chaidh ùine seachad. Chaidh ro-riochdachadh agus cinneasachadh a chuir an àite an àrd-ùrlar. Chaidh taic airson an toraidh a chuir ris air aon sgaoileadh eile (CentOS). Chaidh 5 frithealaichean corporra cumhachdach eile agus dusan fear brìgheil a chur ris. Agus dh’ fhàs e a’ sìor fhàs doirbh do luchd-leasachaidh agus luchd-dearbhaidh an gnìomhan a dhearbhadh ann an àrainneachd cha mhòr faisg air an t-suidheachadh obrach. Aig an àm seo dh'fhàs e soilleir nach robh e comasach a dhèanamh às aonais ...

Pàirt II

Cleachd tagraidhean a’ cleachdadh Docker Swarm

Mar sin, tha an cruinneachadh againn na shiostam iongantach de dhà dhusan co-phàirt fa leth nach deach a mhìneachadh le Dockerfiles. Faodaidh tu a rèiteachadh airson a chleachdadh gu àrainneachd shònraichte a-mhàin san fharsaingeachd. Is e an obair a th’ againn am buidheann a chuir a-steach do àrainneachd àrd-ùrlar gus a dhearbhadh mus tèid deuchainn ro-sgaoilidh a dhèanamh.

Gu teòiridheach, faodaidh grunn bhuidhnean a bhith ag obair aig an aon àm: cho mòr ‘s a tha gnìomhan ann an staid crìochnaichte no faisg air a bhith deiseil. Tha cumhachd nan frithealaichean a tha againn a’ leigeil leinn grunn chlàran a ruith air gach frithealaiche. Feumaidh a h-uile buidheann àrd-ùrlar a bhith aonaranach (cha bu chòir gum biodh tar-tharraing ann am puirt, clàran, msaa).

Is e an goireas as luachmhoire a tha againn ar n-ùine, agus cha robh mòran dheth againn.

Airson tòiseachadh nas luaithe, thagh sinn Docker Swarm air sgàth cho sìmplidh ‘s a tha e agus ailtireachd sùbailte. B’ e a’ chiad rud a rinn sinn manaidsear a chruthachadh agus grunn nodan air frithealaichean iomallach:

$ 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

An ath rud, chruthaich sinn lìonra:


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

An ath rud, cheangail sinn nodan Gitlab-CI agus Swarm a thaobh riaghladh iomallach air nodan bho CI: a’ stàladh theisteanasan, a’ suidheachadh caochladairean dìomhair, agus cuideachd a’ stèidheachadh seirbheis Docker air an t-seirbheisiche smachd. Am fear seo artaigil shàbhail sinn tòrr ùine.

An ath rud, chuir sinn obraichean ris airson cruthachadh agus sgrios a' chruaich ann an .gitlab-ci .yml.

Chaidh grunn obraichean eile a chur ri .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

Bhon chriomag de chòd gu h-àrd tha e soilleir gun deach dà phutan a chuir ri Pìoban (deploy_staging, stop_staging) a dh’ fheumas gnìomh làimhe.

Cleachd tagraidhean a’ cleachdadh Docker Swarm
Tha ainm a’ chruach a’ freagairt ri ainm a’ mheur agus bu chòir gum biodh an àraid seo gu leòr. Bidh seirbheisean anns a’ chruach a’ faighinn seòlaidhean IP gun samhail, agus puirt, clàran, msaa. a bhith aonaranach, ach an aon rud bho chruach gu stac (leis gu bheil am faidhle rèiteachaidh an aon rud airson a h-uile stac) - sin a bha sinn ag iarraidh. Bidh sinn a 'cleachdadh a' chruach (cnuasach) a 'cleachdadh docker-compose.yml, a tha a’ toirt cunntas air ar cruinneachadh.

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

An seo chì thu gu bheil na co-phàirtean ceangailte le aon lìonra (nw_swarm) agus gu bheil iad ruigsinneach dha chèile.

Tha co-phàirtean siostam (stèidhichte air redis, mysql) air an sgaradh bhon bhuidheann coitcheann de phàirtean àbhaisteach (ann am planaichean, tha pàirtean àbhaisteach air an roinn mar sheirbheisean). Tha coltas ann gu bheil ìre cleachdadh ar brabhsair mar a bhith a’ gluasad CMD chun aon ìomhaigh mhòr rèiteachaidh againn agus, san fharsaingeachd, cha mhòr nach eil e eadar-dhealaichte bhon chleachdadh a tha air a mhìneachadh ann am Pàirt I. Cuiridh mi cuideam air na h-eadar-dhealachaidhean:

  • git clone... - gheibh sinn na faidhlichean a tha riatanach gus an cleachdadh a dhèanamh (createconfig.py, install_venv.sh, msaa.)
  • curl... && unzip... - luchdaich sìos agus unzip na stuthan togail (goireasan cruinnichte)

Chan eil ann ach aon duilgheadas nach deach a mhìneachadh fhathast: chan eil co-phàirtean aig a bheil eadar-aghaidh lìn ruigsinneach bho bhrobhsairean an luchd-leasachaidh. Bidh sinn a’ fuasgladh na trioblaid seo le bhith a’ cleachdadh progsaidh cùil, mar sin:

Ann an .gitlab-ci.yml, às deidh dhut an stac brabhsair a chleachdadh, cuir loidhne ris airson a bhith a’ cleachdadh a’ chothromachaidh (a bhios, nuair a thèid a ghealltainn, ag ùrachadh an rèiteachaidh aige a-mhàin (a’ cruthachadh faidhlichean rèiteachaidh nginx ùra a rèir an teamplaid: /etc/nginx/conf.d /${CI_COMMIT_REF_NAME}.conf) - faic an còd 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

Air coimpiutairean an luchd-leasachaidh, ùraich /etc/hosts; suidhich an url gu nginx:

10.50.173.106 staging_BRANCH-1831_cluster.dev

Mar sin, chaidh cleachdadh cruinneachaidhean stèidse iomallach a chuir an gnìomh agus faodaidh luchd-leasachaidh a-nis an cur air bhog ann am meud sam bith gu leòr airson na gnìomhan aca a dhearbhadh.

Planaichean airson an ama ri teachd:

  • Roinn na pàirtean againn mar sheirbheisean
  • Cruthaich Dockerfile airson gach fear
  • Lorg gu fèin-ghluasadach nodan nas lugha de luchdachadh anns a’ chruach
  • Sònraich nodan a’ cleachdadh teamplaid ainm (seach a bhith a’ cleachdadh id mar a tha san artaigil)
  • Cuir seic a-steach gu bheil an stac air a sgrios
  • ...

Taing shònraichte airson artaigil.

Source: www.habr.com

Cuir beachd ann