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:
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:
- createconfig.py - nagmugna og settings.ini file nga adunay component settings sa lain-laing mga environment para sa sunod nga deployment (Preproduction, Production, Testing, ...)
- 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
- prepare_init.d.py - nag-andam sa pagsugod-stop nga mga script alang sa sangkap base sa template
- 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
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
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.
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
Source: www.habr.com