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:
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:
- 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, ...)
- install_venv.sh - mamorona tontolo virtoaly ho an'ny singa py ao anaty lahatahiry manokana ary mandika izany any amin'ny mpizara lavitra
- prepare_init.d.py - manomana script fanombohana ho an'ny singa mifototra amin'ny môdely
- 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
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
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.
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
Source: www.habr.com