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:
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:
- 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, ...)
- 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
- ullmhaigh_init.d.py — ullmhaíonn sé scripteanna le haghaidh comhpháirteanna tosaithe bunaithe ar an teimpléad
- 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
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
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.
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
- ...