Feidhmchláir a imscaradh ag baint úsáide as Docker Swarm

Is forbairt tráchtála dúnta é an córas molta maidir le hábhar físe ar líne a bhfuilimid ag obair air agus go teicniúil is braisle il-chomhpháirteanna de chomhpháirteanna dílseánaigh agus foinse oscailte é. Is é an cuspóir atá leis an alt seo a scríobh ná cur síos a dhéanamh ar chur i bhfeidhm an chórais braisle swarm docker le haghaidh ardán stáitse, gan cur isteach ar shreabhadh oibre bunaithe ár bpróiseas faoi choinníollacha ama teoranta. Tá an scéal a chuirtear faoi bhur n-aird roinnte ina dhá chuid. Déanann an chéad chuid cur síos ar CI/CD roimh úsáid a bhaint as swarm docker, agus déanann an dara cuid cur síos ar an bpróiseas chun é a chur i bhfeidhm. Is féidir leo siúd nach bhfuil suim acu sa chéad chuid a léamh bogadh ar aghaidh go dtí an dara ceann go sábháilte.

Cuid I

Uair amháin, bhí gá le próiseas CI/CD a bhunú chomh tapa agus ab fhéidir. Ceann de na coinníollacha a bhí gan úsáid a bhaint as Docker le haghaidh imscaradh comhpháirteanna á bhforbairt ar chúiseanna éagsúla:

  • le haghaidh oibriú níos iontaofa agus níos cobhsaí comhpháirteanna sa Táirgeadh (i.e., go bunúsach, an ceanglas gan fíorúlú a úsáid)
  • ní raibh na príomhfhorbróirí ag iarraidh oibriú le Docker (aisteach, ach sin mar a bhí)
  • ar chúiseanna idé-eolaíocha de bhainistíocht T&F

Ba iad seo a leanas na riachtanais bhonneagair, stoic agus na riachtanais tosaigh don MVP:

  • 4 fhreastalaí Intel® X5650 le Debian (meaisín amháin níos cumhachtaí le forbairt go hiomlán)
  • Déantar do chomhpháirteanna saincheaptha féin a fhorbairt in C++, Python3
  • Príomhuirlisí tríú páirtí a úsáidtear: Kafka, Clickhouse, Airflow, Redis, Grafana, Postgresql, Mysql, …
  • Píblínte chun comhpháirteanna a thógáil agus a thástáil ar leithligh le haghaidh dífhabhtaithe agus scaoileadh

Ceann de na chéad cheisteanna nach mór a réiteach ag an gcéad chéim ná conas a dhéanfar comhpháirteanna saincheaptha a úsáid in aon timpeallacht (CI/CD).

Shocraigh muid comhpháirteanna tríú páirtí a shuiteáil go córasach agus iad a nuashonrú go córasach. Is féidir feidhmchláir shaincheaptha a fhorbraítear in C++ nó Python a úsáid ar bhealaí éagsúla. Ina measc, mar shampla: pacáistí córais a chruthú, iad a sheoladh chuig stór na n-íomhánna bailithe agus a shuiteáil ina dhiaidh sin ar fhreastalaithe. Ar chúis anaithnid cheana féin, roghnaíodh modh eile, is é sin: trí úsáid a bhaint as CI, tiomsaítear comhaid inrite feidhmchláir, cruthaítear timpeallacht tionscadail fhíorúil, suiteáiltear modúil py ó requirements.txt, agus seoltar na déantáin seo go léir in éineacht le cumraíochtaí, scripteanna agus an timpeallacht iarratais a ghabhann leis na freastalaithe. Ansin, seoltar feidhmchláir ó úsáideoir fíorúil gan cearta riarthóra.

Roghnaíodh Gitlab-CI mar chóras CI/CD. D'fhéach an phíblíne mar thoradh air seo rud éigin mar seo:

Feidhmchláir a imscaradh ag baint úsáide as Docker Swarm
Go struchtúrach, bhí cuma mar seo ar 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 fiú a thabhairt faoi deara go ndéantar cóimeáil agus tástáil ar a íomhá féin, ina bhfuil na pacáistí córais riachtanacha go léir suiteáilte cheana féin agus go ndéantar socruithe eile.

Cé go bhfuil gach ceann de na scripteanna seo i bpoist suimiúil ina bhealach féin, is cinnte nach labhróidh mé fúthu; tógfaidh sé go leor ama cur síos a dhéanamh ar gach ceann acu agus ní hé sin cuspóir an ailt. Lig dom d’aird a tharraingt ar an bhfíric go bhfuil an chéim imlonnaithe comhdhéanta de sheicheamh de scripteanna glaonna:

  1. createconfig.py — cruthaítear comhad settings.ini ina bhfuil socruithe do chomhpháirteanna i dtimpeallachtaí éagsúla lena n-imscaradh ina dhiaidh sin (Réamhtháirgeadh, Táirgeadh, Tástáil, ...)
  2. install_venv.sh — cruthaítear timpeallacht fhíorúil le haghaidh comhpháirteanna py in eolaire ar leith agus déanann sé é a chóipeáil chuig cianfhreastalaithe
  3. ullmhaigh_init.d.py — ullmhaíonn sé scripteanna le haghaidh comhpháirteanna tosaithe bunaithe ar an teimpléad
  4. imscaradh.py — comhpháirteanna nua a imscaradh agus a atosú

Am caite. Cuireadh réamhtháirgeadh agus táirgeadh in ionad an stáitse. Tá tacaíocht don táirge curtha leis ar dháileadh amháin eile (CentOS). Cuireadh 5 fhreastalaí fisiceacha chumhachtacha eile agus dosaen cinn fhíorúla leis. Agus d'éirigh sé níos deacra d'fhorbróirí agus do thástálaithe a gcuid tascanna a thástáil i dtimpeallacht níos mó nó níos lú gar don staid oibre. Ag an am seo ba léir go raibh sé dodhéanta a dhéanamh gan é ...

Cuid II

Feidhmchláir a imscaradh ag baint úsáide as Docker Swarm

Mar sin, is córas iontach é ár mbraisle de chúpla dosaen comhpháirteanna aonair nach ndéanann Dockerfiles cur síos orthu. Is féidir leat é a chumrú le himscaradh i dtimpeallacht shonrach amháin. Is é an tasc atá againn ná an braisle a imscaradh i dtimpeallacht stáitse chun é a thástáil roimh thástáil réamhscaoilte.

Go teoiriciúil, is féidir roinnt braislí a bheith ag obair go comhuaineach: an oiread agus a bhíonn tascanna i riocht críochnaithe nó beagnach críochnaithe. Ligeann cumhacht na bhfreastalaithe atá ar fáil dúinn roinnt braislí a rith ar gach freastalaí. Ní mór gach braisle stáitse a aonrú (níor cheart go mbeadh aon fhorluí i gcalafoirt, in eolairí, etc.).

Is é an acmhainn is luachmhaire atá againn ná ár gcuid ama, agus ní raibh mórán de againn.

Chun tús níos tapúla, roghnaigh muid Docker Swarm mar gheall ar a simplíocht agus ailtireacht solúbtha. Ba é an chéad rud a rinneamar ná bainisteoir a chruthú agus roinnt nóid ar fhreastalaithe cianda:

$ 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

Ansin, chruthaíomar líonra:


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

Ar aghaidh, cheangail muid nóid Gitlab-CI agus Swarm i dtéarmaí cianbhainistiú nóid ó CI: teastais a shuiteáil, athróga rúnda a shocrú, agus an tseirbhís Docker a bhunú ar an bhfreastalaí bainistíochta freisin. An ceann seo airteagal shábháil dúinn go leor ama.

Ansin, chuireamar poist leis chun an chruach a chruthú agus a scriosadh i .gitlab-ci .yml.

Cuireadh roinnt post eile le .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

Ón blúire cód thuas tá sé soiléir go bhfuil dhá chnaipe curtha le Píblínte (deploy_staging, stop_staging) a éilíonn gníomh láimhe.

Feidhmchláir a imscaradh ag baint úsáide as Docker Swarm
Meaitseálann an t-ainm cruachta leis an ainm brainse agus ba chóir go mbeadh an uathúlacht seo go leor. Faigheann seirbhísí sa chruach seoltaí IP uathúla, agus calafoirt, eolairí, etc. a leithlisiú, ach mar an gcéanna ó chruach go cruach (ós rud é go bhfuil an comhad cumraíochta mar an gcéanna do gach cruach) - sin an rud a theastaigh uainn. Imscaraimid an chairn (braisle) ag baint úsáide as docker-compose.yml, a chuireann síos ar ár gcnuasach.

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

Anseo is féidir leat a fheiceáil go bhfuil na comhpháirteanna ceangailte ag líonra amháin (nw_swarm) agus go bhfuil siad inrochtana dá chéile.

Tá comhpháirteanna an chórais (bunaithe ar redis, mysql) scartha ón gcomhthiomsú ginearálta de chomhpháirteanna saincheaptha (i bpleananna, roinntear comhpháirteanna saincheaptha mar sheirbhísí freisin). Is cosúil le céim imlonnaithe ár mbraisle CMD a aistriú chuig ár n-íomhá mór cumraithe amháin agus, go ginearálta, níl sé difriúil go mór leis an imscaradh a gcuirtear síos air i gCuid I. Leagfaidh mé béim ar na difríochtaí:

  • clón git... - faighimid na comhaid atá riachtanach chun an t-imscaradh a dhéanamh (createconfig.py, install_venv.sh, etc.)
  • curl... && unzip... - íoslódáil agus dízip na déantáin tógála (fóntais tiomsaithe)

Níl ach fadhb amháin nach bhfuil tuairisc uirthi go fóill: níl rochtain ar chomhpháirteanna a bhfuil comhéadan gréasáin acu ó bhrabhsálaithe na bhforbróirí. Réitímid an fhadhb seo le seachfhreastalaí droim ar ais, mar sin:

I .gitlab-ci.yml, tar éis duit an braisle stack a imscaradh, cuir líne leis chun an t-iarmhéidóir a imscaradh (nach nuashonraíonn, nuair a bhíonn sé tiomanta, ach a chumraíocht (cruthaíonn comhaid chumraíochta nginx nua de réir an teimpléid: /etc/nginx/conf.d /${CI_COMMIT_REF_NAME}.conf) - féach 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

Ar ríomhairí forbróra, nuashonraigh /etc/hosts; socraigh an url go nginx:

10.50.173.106 staging_BRANCH-1831_cluster.dev

Mar sin, tá imscaradh braislí stáitse leithleacha curtha i bhfeidhm agus is féidir le forbróirí anois iad a sheoladh ar aon mhéid atá leordhóthanach chun a gcuid tascanna a thástáil.

Pleananna don todhchaí:

  • Deighil ár gcomhpháirteanna mar sheirbhísí
  • Cruthaigh Dockerfile do gach ceann acu
  • Braith go huathoibríoch nóid níos lú luchtaithe sa chruach
  • Sonraigh nóid ag baint úsáide as teimpléad ainm (seachas úsáid a bhaint as aitheantas mar atá san alt)
  • Cuir seic leis go bhfuil an chruach scriosta
  • ...

Buíochas ar leith as Airteagal.

Foinse: will.com

Add a comment