እየሰራንበት ያለው የመስመር ላይ የቪዲዮ ይዘት ምክር ስርዓት ዝግ የንግድ ልማት ነው እና በቴክኒካል ባለብዙ-ክፍል የባለቤትነት እና የክፍት ምንጭ አካላት ስብስብ ነው። የዚህ ጽሁፍ አላማ የዶክተር መንጋ ክላስተር ሲስተም ለዝግጅት ጣቢያ በተወሰነ ጊዜ ውስጥ የተቀመጠውን የስራ ሂደት ሳያስተጓጉል ተግባራዊነቱን ለመግለጽ ነው። ለእርስዎ ትኩረት የቀረበው ትረካ በሁለት ክፍሎች የተከፈለ ነው. የመጀመሪያው ክፍል ዶከር መንጋ ከመጠቀምዎ በፊት CI / ሲዲ ይገልፃል ፣ ሁለተኛው ደግሞ የአተገባበሩን ሂደት ይገልጻል። የመጀመሪያውን ክፍል ለማንበብ ፍላጎት የሌላቸው ሰዎች በደህና ወደ ሁለተኛው መሄድ ይችላሉ.
ክፍል I
ወደ ሩቅ ፣ ሩቅ ዓመት ፣ የ CI / ሲዲ ሂደቱን በተቻለ ፍጥነት ማዋቀር አስፈላጊ ነበር። ከሁኔታዎች አንዱ ዶከርን አለመጠቀም ነበር። ለማሰማራት በተለያዩ ምክንያቶች የተገነቡ አካላት-
- በምርት ውስጥ ይበልጥ አስተማማኝ እና የተረጋጋ የሥራ ክፍሎች (ይህም በእውነቱ ቨርቹዋልን ያለመጠቀም መስፈርት ነው)
- መሪ ገንቢዎች ከዶከር ጋር መስራት አልፈለጉም (የሚገርም ነገር ግን እንደዛ ነበር)
- በ R&D አስተዳደር ርዕዮተ ዓለም ግምት መሠረት
ለMVP መሠረተ ልማት፣ ቁልል እና ግምታዊ የመጀመሪያ መስፈርቶች እንደሚከተለው ቀርበዋል፡
- 4 Intel® X5650 አገልጋዮች ከዲቢያን ጋር (አንድ ተጨማሪ ኃይለኛ ማሽን ሙሉ በሙሉ ተዘጋጅቷል)
- የራሳቸው ብጁ አካላት ልማት በ C ++ ፣ Python3 ውስጥ ይከናወናል
- ጥቅም ላይ የዋሉ ዋና የሶስተኛ ወገን መሳሪያዎች፡ ካፍካ፣ ክሊክሀውስ፣ የአየር ፍሰት፣ ሬዲስ፣ ግራፋና፣ ፖስትግሬስqል፣ ማይስክል፣…
- ለማረም እና ለመልቀቅ በተናጠል ክፍሎችን ለመገንባት እና ለመሞከር የቧንቧ መስመሮች
በመነሻ ደረጃ ላይ መታየት ከሚያስፈልጋቸው የመጀመሪያ ጥያቄዎች ውስጥ አንዱ ብጁ አካላት በማንኛውም አካባቢ (ሲአይ / ሲዲ) ውስጥ እንዴት እንደሚሰማሩ ነው ።
የሶስተኛ ወገን ክፍሎችን በስርዓት ለመጫን እና በስርዓት ለማዘመን ወስነናል. በC++ ወይም Python ውስጥ የተገነቡ ብጁ አፕሊኬሽኖች በተለያዩ መንገዶች ሊሰማሩ ይችላሉ። ከነሱ መካከል ለምሳሌ: የስርዓት ፓኬጆችን መፍጠር, ወደ የተገነቡ ምስሎች ማከማቻ መላክ እና ከዚያም በአገልጋዮች ላይ መጫን. ባልታወቀ ምክንያት ሌላ ዘዴ ተመርጧል፡- ሲአይን በመጠቀም አፕሊኬሽን ሊተገበሩ የሚችሉ ፋይሎች ይዘጋጃሉ፣ ምናባዊ የፕሮጀክት አካባቢ ይፈጠራል፣ py ሞጁሎች ከ መስፈርቶች.txt ተጭነዋል እና እነዚህ ሁሉ ቅርሶች ከቅንጅቶች፣ ስክሪፕቶች እና አብሮ የመተግበሪያ አካባቢ ወደ አገልጋዮች. በመቀጠል ትግበራዎች ያለአስተዳዳሪ መብቶች እንደ ምናባዊ ተጠቃሚ ይጀመራሉ።
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 - በአብነት ላይ በመመስረት ለክፍለ-ነገር መነሻ-ማቆሚያ ስክሪፕቶችን ያዘጋጃል።
- ማሰማራት.py - መበስበስ እና አዲስ አካላትን እንደገና ያስጀምራል
ጊዜ አለፈ። የዝግጅት ደረጃ በቅድመ-ምርት እና ምርት ተተክቷል. ለአንድ ተጨማሪ ስርጭት (ሴንት ኦኤስ) ለምርቱ ድጋፍ ታክሏል። 5 ተጨማሪ ኃይለኛ አካላዊ አገልጋዮች እና ደርዘን ቨርቹዋል ታክለዋል። እና ለገንቢዎች እና ሞካሪዎች ከስራው ሁኔታ ጋር በተገናኘ ወይም ባነሰ አካባቢ ውስጥ ተግባራቸውን ለመፈተሽ የበለጠ አስቸጋሪ እየሆነ መጣ። በዚህ ጊዜ, ያለ እሱ ማድረግ የማይቻል መሆኑን ግልጽ ሆነ ...
ክፍል II
ስለዚህ፣ የእኛ ክላስተር በDockerfiles ያልተገለጹ የሁለት ደርዘን የተለያዩ አካላት አስደናቂ ስርዓት ነው። በአጠቃላይ ለአንድ የተወሰነ አካባቢ ለማሰማራት ብቻ ማዋቀር ይችላሉ። የእኛ ተግባር ከቅድመ-ልቀት ሙከራ በፊት ክላስተርን ለመፈተሽ ወደ ማዘጋጃ አካባቢ ማሰማራት ነው።
በንድፈ ሃሳቡ፣ በአንድ ጊዜ የሚሄዱ ብዙ ዘለላዎች ሊኖሩ ይችላሉ፡ በተጠናቀቀው ግዛት ውስጥ ያሉ ተግባራት እንዳሉ ወይም ሊጠናቀቅ በተቃረበ መጠን። በእጃችን ያለው የአገልጋዮቹ አቅም በእያንዳንዱ አገልጋይ ላይ ብዙ ዘለላዎችን እንድናሄድ ያስችለናል። እያንዳንዱ የዝግጅት ክላስተር መነጠል አለበት (በወደቦች ፣ ማውጫዎች ፣ ወዘተ ውስጥ ምንም መገናኛ መኖር የለበትም)።
በጣም ጠቃሚው ሀብታችን ጊዜያችን ነው፣ እና ብዙም አልነበረንም።
ለፈጣን ጅምር Docker Swarmን የመረጥነው በቀላልነቱ እና በአርክቴክቸር ተለዋዋጭነቱ ነው። የመጀመሪያው ነገር በሩቅ አገልጋዮች ላይ አስተዳዳሪ እና በርካታ አንጓዎችን መፍጠር ነበር፡
$ 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
በመቀጠል Gitlab-CI እና Swarm nodesን ከ CI የርቀት መቆጣጠሪያ አንፃር አገናኘን: የምስክር ወረቀቶችን መጫን, ሚስጥራዊ ተለዋዋጮችን ማዘጋጀት እና የ Docker አገልግሎትን በመቆጣጠሪያ አገልጋዩ ላይ ማዋቀር. ይሄኛው
በመቀጠል፣ ቁልል መፍጠር እና የማጥፋት ስራዎችን ወደ .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
ከላይ ካለው የኮድ ቅንጭብጭብ መመልከት ትችላላችሁ ሁለት አዝራሮች (deploy_staging, stop_staging) ወደ ፓይፕላይን ተጨምረዋል, ይህም በእጅ እርምጃ ያስፈልገዋል.
የቁልል ስም ከቅርንጫፉ ስም ጋር ይዛመዳል እና ይህ ልዩነት በቂ መሆን አለበት. በጥቅሉ ውስጥ ያሉ አገልግሎቶች ልዩ የአይፒ አድራሻዎችን እና ወደቦችን፣ ማውጫዎችን፣ ወዘተ ይቀበላሉ። ይገለላሉ, ነገር ግን ከቁልል እስከ ቁልል ተመሳሳይ (ምክንያቱም የውቅረት ፋይሉ ለሁሉም ቁልል አንድ አይነት ስለሆነ) - እኛ የምንፈልገው. እኛ በመጠቀም ቁልል (ክላስተር) እናሰማራለን docker-compose.yml, እሱም የእኛን ስብስብ ይገልፃል.
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
እዚህ ላይ ክፍሎቹ በአንድ አውታረ መረብ (nw_swarm) የተገናኙ እና እርስ በእርስ የሚገኙ መሆናቸውን ማየት ይችላሉ።
የስርዓት ክፍሎች (redis, mysql ላይ የተመሠረተ) ብጁ ክፍሎች አጠቃላይ ገንዳ ተለያይተዋል (በዕቅዶች ውስጥ እና ብጁ እንደ አገልግሎቶች የተከፋፈሉ). የክላስተርችን የማሰማራት ደረጃ CMD ወደ አንድ ትልቅ የተዋቀረ ምስላችን እንደማስተላለፍ ይመስላል እና በአጠቃላይ በክፍል XNUMX ከተገለጸው የስርጭት ስራ አይለይም። ልዩነቶቹን አጉላለሁ።
- git clone... - ለማሰማራት የሚያስፈልጉትን ፋይሎች ያግኙ (createconfig.py፣ install_venv.sh፣ ወዘተ.)
- ከርል... እና ዚፕ ንፈቱ... - የግንባታ ቅርሶችን ያውርዱ እና ይክፈቱ (የተቀናጁ መገልገያዎች)
ገና ያልተገለጸ አንድ ችግር ብቻ አለ፡ የድር በይነገጽ ያላቸው አካላት ከገንቢዎች አሳሾች ተደራሽ አይደሉም። ይህንን ችግር የምንፈታው የተገላቢጦሽ ፕሮክሲን በመጠቀም ነው፡-
በ .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 ማዘዝ
10.50.173.106 staging_BRANCH-1831_cluster.dev
ስለዚህ፣ የተገለሉ የመድረክ ስብስቦችን መዘርጋት ተተግብሯል እና ገንቢዎች አሁን ተግባራቸውን ለመፈተሽ በበቂ ቁጥር ማሄድ ይችላሉ።
የወደፊት ዕቅዶች፡-
- ክፍሎቻችንን እንደ አገልግሎት ይለያዩዋቸው
- ለእያንዳንዱ Dockerfile ይኑርዎት
- በቆለሉ ውስጥ ያነሱ የተጫኑ አንጓዎችን በራስ-ሰር ያግኙ
- አንጓዎችን በስም ጥለት ይግለጹ (መታወቂያውን በአንቀጹ ላይ ከመጠቀም ይልቅ)
- ቁልል መበላሸቱን ያረጋግጡ
- ...