Explicare Applications cum Docker Swarm

In online video systema commendaticii contenti quod laboramus in evolutione commerciali clausa est et technice est botrus proprietatis et fons componentis multi-componentis. Propositum huius articuli scribendi est describere exsequendum examen examinati grisei systematis errantis ad locum errantem sine statuta processuum nostrorum processuum in tempore determinato perturbare. Narratio vestra in duas partes divisa est. Prima pars CI/CD ante examina usus describit, et secunda processum exsecutionis eius describit. Qui non sunt interested in lectione prima partis, tuto ad secundam progrediuntur.

pars I

Retro in longinquum, remotum annum, necesse erat constituere CI / CD processum quam celerrime. Una ex conditionibus uti Docker non erat ad deployment exculta partes aliquot de causis;

  • ad certiorem et stabilem operationem partium in productione (hoc est, revera, postulationem virtualizationis non utendi)
  • principales developers noluerunt operari cum Docker (fatum, sed illud quomodo erat)
  • secundum ideologicas considerationes R & D procuratio

Infrastructura, acervus et requisita initialis approximata pro MVP allata sunt ut sequitur:

  • 4 Intel® X5650 servers cum Debian (unus apparatus potentior est confecta)
  • Progressio propria consue- tium exercetur in C++, Python3 .
  • Pars principalis instrumentorum 3 partium usus est: Kafka, Clickhouse, Airflow, Redis, Grafana, Postgresql, Mysql, ...
  • Pipelines ad aedificationem et probationem components separatim pro lusione et remissione

Una ex primis quaestionibus quae in gradu initiali tradendae sunt necesse est quomodo consue- tium in quavis rerum ambitu explicabitur (CI/CD).

Placuimus ut tertiam partem componentium systemice instituere et systemice renovare. Mores applicationes in C ++ vel Python multipliciter explicari possunt. Inter eos, exempli gratia: fasciculos systematis creandi mittendo eas ad repositorium imaginum aedificatarum et deinde in servitoribus instituendis. Ob ignotam causam, alius modus electus est, nempe: utens CI, applicatio imaginum exsecutabilium componitur, ambitus virtualis propositi creatur, py moduli ex requisitis instituuntur.txt, et omnia haec artificia cum config, scriptis et mittuntur. comitante applicationis ambitus servientibus. Deinceps applicationes ad usum virtualem sine iuribus administratoribus immittuntur.

Gitlab-CI electus est ut ratio CI/CD. Inde aliquid simile hoc pipeline respexit:

Explicare Applications cum Docker Swarm
Structure, gitlab-ci.yml vidi sic

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

Notatu dignum est ecclesiam et probationem in propria imagine exerceri, ubi omnes necessarii fasciculi systematis iam instituti sunt et aliae occasus factae sunt.

Quaelibet haec scripta in jobs suo modo iucunda est, sed de illis utique non loquar, descriptio cuiusque eorum multum temporis capiet et hoc articulum propositum non est. Tantum animum advortamus eo quod scaena instruere consistit in serie vocationis scriptorum:

  1. createconfig.py - file occasus.ini creat cum uncinis componentibus in variis ambitibus ad instruere subsequentem (praeproductionem, productionem, probationem, ...)
  2. install_venv.sh - virtualem environment pro py components in certo presul et exemplaribus in remotis servientibus creat
  3. prepare_init.d.py - parat component satus-subsisto scripta fundatur in template
  4. deploy.py - putrescit et restarts nova components

Tempus praeterit. Scaena scaena substituta est per productionem et productionem. Auxilia addita producti in unum distributio (CentOS). Adiecit 5 potentiores servitores corporis et virtuales duodecim. Ac magis ac difficilius factum est tincidunt et probatores operas suas probare in ambitu magis vel minus prope statum laborantem. Hoc tempore patuit quod sine eo fieri non poterat.

Pars II

Explicare Applications cum Docker Swarm

Botrus noster est systema spectaculum duorum partium duodecim separatorum quae a Dockerfiles non descriptae sunt. Id solum configurare potes ad peculiarem ambitum in genere instruere. Nostrum munus est botrum in ambitu choragi explicandi ut experiatur eam antequam probationem prae- mittat.

Theoretice possunt esse plures racemi simul currentes: quotquot sunt operae in statu perfecto vel prope ad completionem. Facultates ministrantium in nostro arbitrio nos permittit ut plures racemos in unoquoque servo discurramus. Singuli botri choragi secerni debent (in portibus, directoriis, etc. intersectio nulla esse debet).

Nostra subsidia pretiosissima tempus nostrum est, et multum ex eo non habuimus.

Ad initium ocius, examina Docker ex simplicitate sua et flexibilitate architecturae elegimus. Primum rem procuratorem creavimus et plures nodos e servientibus remotis;

$ 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

Deinde, retis creare:


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

Deinceps Gitlab-CI et nodos examina cum remotis nodis ab CI dicione coniunximus: libellos inaugurari, variabiles secretas disponere, et ministerium Docker in servo ditionis constituere. Hoc unum articulus nos multum temporis servavit.

Deinde addimus ACERVUM creationis et exitii in .gitlab-ci .yml.

Aliquot plura jobs additae sunt ad .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

Ex codice superiore PRAECISIO, videre potes duas globulas (displicandas, stop_staging) Pipelines additas esse, actionem manualem requirentem.

Explicare Applications cum Docker Swarm
Nomen ACERVUS nomen ramo congruit et haec singularitas sufficere debet. Officia in ACERVUS accipiunt singulares inscriptiones IP, portus, directoria, etc. desolatus erit, sed idem a acervo ad acervum (quia conformatio fasciculi eadem est omnibus acervis) - quod voluimus. Explicamus ACERVUS (botrus) usura Docker compose.yml,qui botrum nostrum describit.

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

Hic videre potes quod membra una retis (nw_swarm) connexa sunt et inter se praesto sunt.

Systema componentium (ex redis, mysql) a piscina communium consuetudinum separata (in consiliis et consuetudinibus ut officia dividuntur). Scaena instruere nostri botri similis CMD transeuntes in unam imaginem nostram magnae conformatae, et generatim fere non differt ab instructione in Parte I descripta. Differentias illustrabo;

  • git clone... - lima ut opus ad explicandam (createconfig.py, install_venv.sh, etc.)
  • curl... && unzip... - download and unzip aedificate artificialia (utilitas compilavit)

Una tantum quaestio adhuc inscripta est: components quae telam interfaciem habent non sunt adeunda e navigatoribus tincidunt. Hanc quaestionem solvimus per procuratorem contrarium, sic:

In .gitlab-ci.yml, ACERVUS ACERVUS explicans, addimus aciem libratoris explicandi (quae, cum committit, eius conformationem tantum renovat (novas ngingas configurationis format secundum exemplum: /etc/nginx/conf. d/${CI_COMMIT_REF_NAME}.conf) - vide docker-componere-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

De evolutionibus computatoriis, renovatio /etc/ exercituum; praecipimus url ad nginx:

10.50.173.106 staging_BRANCH-1831_cluster.dev

Itaque, racemis choragiis solitarum instruere adductum est et tincidunt nunc in quolibet numero currere possunt quae ad opera sua reprimendam sufficiunt.

Futurum consilia:

  • Separate nostra officia ut components
  • Have ad invicem Dockerfile
  • Automatice deprehendere minus oneratus nodis in ACERVUS
  • Specificare lymphaticorum per nomen exemplar (quam per id ut in articulum)
  • Adde reprehendo quod ACERVUS destruitur
  • ...

Specialis gratias articulus.

Source: www.habr.com

Add a comment