د آنلاین ویډیو مینځپانګې سپارښتنې سیسټم چې موږ یې کار کوو یو تړل شوی سوداګریز پرمختګ دی او په تخنیکي ډول د ملکیت او خلاصې سرچینې اجزاو څو برخې کلستر دی. د دې مقالې لیکلو هدف د سټیجینګ پلیټ فارم لپاره د ډاکر سوارم کلسترینګ سیسټم پلي کول تشریح کول دي ، پرته لدې چې د محدود وخت شرایطو لاندې زموږ د پروسو رامینځته شوي کاري جریان ګډوډ کړي. ستاسو پام ته وړاندې شوی داستان په دوو برخو ویشل شوی دی. لومړۍ برخه د ډاکر سوارم کارولو دمخه CI/CD تشریح کوي ، او دویمه برخه یې د پلي کولو پروسه تشریح کوي. هغه څوک چې د لومړۍ برخې لوستلو سره علاقه نلري کولی شي په خوندي ډول دویمه برخه ته لاړ شي.
لومړۍ برخه
په یو وخت کې، اړتیا وه چې ژر تر ژره د CI/CD پروسې تنظیم کړئ. یو شرط دا و چې د ډاکر نه کار واخلئ د ګمارنې لپاره اجزا د ډیری دلایلو لپاره رامینځته کیږي:
- په تولید کې د اجزاو د لا باوري او باثباته عملیاتو لپاره (د مثال په توګه ، د مجازی کولو نه کارولو اړتیا)
- مخکښ پراختیا کونکي نه غوښتل د ډاکر سره کار وکړي (عجیب ، مګر دا څنګه و)
- د R&D مدیریت ایډیالوژیکي دلیلونو لپاره
د MVP لپاره زیربنا، سټیک او نږدې ابتدايي اړتیاوې په لاندې ډول وې:
- د Debian سره 4 Intel® X5650 سرورونه (یو بل پیاوړی ماشین په بشپړ ډول د پراختیا لپاره)
- ستاسو د خپل دودیز اجزاوو پراختیا په C++، Python3 کې ترسره کیږي
- د دریمې ډلې اصلي وسیلې کارول کیږي: کافکا، کلیک هاوس، ایر فلو، ریډیس، ګرافانا، پوسټګریسکیل، مای ایس کیو ایل، ...
- د ډیبګ او خوشې کولو لپاره جلا جلا اجزاو جوړولو او ازموینې لپاره پایپ لاینونه
یو له لومړیو پوښتنو څخه چې اړتیا ورته په لومړي مرحله کې حل کیږي دا ده چې دودیز اجزا به په کوم چاپیریال کې ځای په ځای شي (CI/CD).
موږ پریکړه وکړه چې د دریمې ډلې برخې په سیسټمیک ډول نصب کړو او په سیسټمیک ډول یې تازه کړو. په C++ یا Python کې رامینځته شوي دودیز غوښتنلیکونه په څو لارو ځای په ځای کیدی شي. د دوی په مینځ کې ، د مثال په توګه: د سیسټم کڅوړې رامینځته کول ، د راټول شوي عکسونو ذخیره کولو ته لیږل او په سرورونو کې د دوی وروسته نصب کول. د دمخه نامعلوم دلیل لپاره ، بل میتود غوره شوی ، د بیلګې په توګه: د CI په کارولو سره ، د غوښتنلیک اجرا وړ فایلونه تالیف شوي ، د مجازی پروژې چاپیریال رامینځته کیږي ، د need.txt څخه py ماډلونه نصب شوي ، او دا ټول هنري اثار د تشکیلاتو ، سکریپټونو او سره لیږل کیږي. د سرورونو سره د غوښتنلیک چاپیریال. بیا، غوښتنلیکونه د مجازی کارونکي څخه د مدیر حقونو پرته پیل کیږي.
Gitlab-CI د CI/CD سیسټم په توګه غوره شوی. پایله شوې پایپ لاین داسې ښکاري:
په جوړښت کې، 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
دا د یادونې وړ ده چې مجلس او ازموینه په خپل عکس کې ترسره کیږي ، چیرې چې د سیسټم ټول اړین کڅوړې دمخه نصب شوي او نور تنظیمات رامینځته شوي.
که څه هم په دندو کې د دې سکریپټونو څخه هر یو په خپله طریقه په زړه پورې دی، زه به یقینا د دوی په اړه خبرې ونه کړم؛ د دوی هر یو تشریح کول به د پام وړ وخت ونیسي او دا د مقالې موخه نه ده. اجازه راکړئ یوازې ستاسو پام دې حقیقت ته واړوم چې د پلي کولو مرحله د زنګ وهلو سکریپټونو ترتیب څخه جوړه ده:
- createconfig.py - د راتلونکو ګمارلو لپاره په مختلف چاپیریال کې د اجزاوو لپاره د ترتیباتو سره د Settings.ini فایل رامینځته کوي (مخکینۍ تولید، تولید، ازموینه، ...)
- install_venv.sh - په یوه ځانګړي لارښود کې د py اجزاو لپاره مجازی چاپیریال رامینځته کوي او لرې پرتو سرورونو ته یې کاپي کوي
- تیاری_init.d.py - د ټیمپلیټ پراساس د پیل سټاپ اجزاو لپاره سکریپټونه چمتو کوي
- deploy.py - نوي برخې ځای په ځای کوي او بیا پیل کوي
وخت تېر شو. د مرحلې مرحله د مخکینۍ تولید او تولید لخوا بدله شوه. د محصول لپاره ملاتړ په یو بل توزیع (CentOS) کې اضافه شوی. نور 5 پیاوړي فزیکي سرورونه او یو درجن مجازی سرورونه اضافه شوي. او دا د پراختیا کونکو او ازموینو لپاره په زیاتیدونکي توګه ستونزمن کیږي چې د دوی دندې په چاپیریال کې لږ یا لږ کاري حالت ته نږدې کړي. په دې وخت کې دا څرګنده شوه چې د هغه پرته دا ناشونې وه ...
دوهمه برخه
نو، زموږ کلستر د څو درجن انفرادي اجزاوو یو په زړه پورې سیسټم دی چې د Dockerfiles لخوا ندي تشریح شوي. تاسو کولی شئ دا یوازې په عمومي ډول یو ځانګړي چاپیریال ته د ګمارلو لپاره تنظیم کړئ. زموږ دنده دا ده چې کلستر په سټیجینګ چاپیریال کې ځای په ځای کړو ترڅو دا د خوشې کیدو دمخه ازموینې دمخه ازموینه وکړي.
په تیوریکي توګه، ډیری کلسترونه شتون لري چې په ورته وخت کې کار کوي: څومره چې په بشپړ حالت کې دندې شتون لري یا بشپړیدو ته نږدې وي. زموږ په اختیار کې د سرورونو ځواک موږ ته اجازه راکوي چې په هر سرور کې څو کلسترونه پرمخ یوسو. هر سټیجینګ کلستر باید جلا وي (په بندرونو، لارښودونو، او نورو کې باید هیڅ ډول تکرار نه وي).
زموږ ترټولو ارزښتناکه سرچینه زموږ وخت دی، او موږ د هغې ډیره برخه نه درلوده.
د ګړندي پیل لپاره ، موږ د دې سادګۍ او انعطاف وړ جوړښت له امله ډاکر سوارم غوره کړ. لومړی شی چې موږ یې ترسره کړل په ریموټ سرورونو کې مدیر او څو نوډونه رامینځته کړل:
$ 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
بیا، موږ یوه شبکه جوړه کړه:
$ docker network create --driver overlay --subnet 10.10.10.0/24 nw_swarm
بیا ، موږ د CI څخه د نوډونو ریموټ مدیریت شرایطو کې Gitlab-CI او Swarm نوډونه وصل کړل: د سندونو نصب کول ، د پټ متغیرونو تنظیم کول ، او همدارنګه د کنټرول سرور کې د ډاکر خدمت تنظیم کول. دا یو
بیا، موږ په .gitlab-ci .yml کې د سټیک جوړولو او ویجاړولو لپاره دندې اضافه کړې.
په .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
د پورتنۍ کوډ برخې څخه دا روښانه ده چې دوه تڼۍ په پایپ لاینونو کې اضافه شوي (د ډیپلای_سټینګ، سټاپ_سټینګ) چې لاسي عمل ته اړتیا لري.
د سټیک نوم د څانګې نوم سره سمون لري او دا انفرادیت باید کافي وي. په سټیک کې خدمتونه ځانګړي IP پتې ترلاسه کوي ، او بندرونه ، لارښودونه او داسې نور. جلا به وي، مګر د سټیک څخه سټیک ته ورته (ځکه چې د ترتیب کولو فایل د ټولو سټیکونو لپاره ورته دی) - دا هغه څه دي چې موږ یې غوښتل. موږ د سټیک (کلستر) په کارولو سره ځای په ځای کوو ډاکر - compose.yml، کوم چې زموږ کلستر تشریح کوي.
ډاکر - 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
دلته تاسو لیدلی شئ چې اجزاوې د یوې شبکې (nw_swarm) لخوا وصل شوي او یو بل ته د لاسرسي وړ دي.
د سیسټم برخې (د redis، mysql پر بنسټ) د ګمرک اجزاو عمومي حوض څخه جلا شوي (په پالنونو کې، دودیز برخې هم د خدماتو په توګه ویشل شوي). زموږ د کلستر د پلي کولو مرحله داسې ښکاري چې زموږ یو لوی ترتیب شوي عکس ته د CMD لیږدولو په څیر ښکاري او په عموم کې، په عملي توګه په لومړۍ برخه کې بیان شوي له ګمارلو څخه توپیر نلري. زه به په توپیرونو ټینګار وکړم:
- git کلون... - موږ د پلي کولو ترسره کولو لپاره اړین فایلونه ترلاسه کوو (createconfig.py، install_venv.sh، etc.)
- curl... && unzip... - د ساختماني اثارو ډاونلوډ او خلاص کړئ (تالیف شوي اسانتیاوې)
دلته یوازې یوه ناڅرګنده ستونزه شتون لري: هغه برخې چې ویب انٹرفیس لري د پراختیا کونکو براوزرونو څخه د لاسرسي وړ ندي. موږ دا ستونزه د ریورس پراکسي په کارولو سره حل کوو، پدې توګه:
په .gitlab-ci.yml کې، د کلستر سټیک له مینځه وړلو وروسته، د بیلانس د ځای په ځای کولو لپاره یوه کرښه اضافه کړئ (کوم چې، کله چې ژمن وي، یوازې خپل تشکیلات تازه کوي) د ټیمپلیټ سره سم د نوي nginx ترتیب کولو فایلونه رامینځته کوي: /etc/nginx/conf.d /${CI_COMMIT_REF_NAME}.conf) - کوډ وګورئ 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
په پراختیا کونکي کمپیوټرونو کې، تازه کړئ /etc/hosts؛ nginx ته url تنظیم کړئ:
10.50.173.106 staging_BRANCH-1831_cluster.dev
نو، د جلا شوي سټیجینګ کلسترونو ګمارل پلي شوي او پراختیا کونکي اوس کولی شي دوی د دوی دندو ازموینې لپاره په کافي مقدار کې په لاره واچوي.
راتلونکي پلانونه:
- زموږ برخې د خدماتو په توګه جلا کړئ
- د هر یو لپاره ډاکر فایل جوړ کړئ
- په سټیک کې په اتوماتيک ډول لږ بار شوي نوډونه کشف کړئ
- د نوم ټیمپلیټ په کارولو سره نوډونه مشخص کړئ (د دې پرځای چې په مقاله کې د ID کارولو پرځای)
- یو چک اضافه کړئ چې سټیک ویجاړ شوی
- ...
لپاره ځانګړې مننه
سرچینه: www.habr.com