መተግበሪያዎችን በDocker Swarm ያሰማሩ

እየሰራንበት ያለው የመስመር ላይ የቪዲዮ ይዘት ምክር ስርዓት ዝግ የንግድ ልማት ነው እና በቴክኒካል ባለብዙ-ክፍል የባለቤትነት እና የክፍት ምንጭ አካላት ስብስብ ነው። የዚህ ጽሁፍ አላማ የዶክተር መንጋ ክላስተር ሲስተም ለዝግጅት ጣቢያ በተወሰነ ጊዜ ውስጥ የተቀመጠውን የስራ ሂደት ሳያስተጓጉል ተግባራዊነቱን ለመግለጽ ነው። ለእርስዎ ትኩረት የቀረበው ትረካ በሁለት ክፍሎች የተከፈለ ነው. የመጀመሪያው ክፍል ዶከር መንጋ ከመጠቀምዎ በፊት CI / ሲዲ ይገልፃል ፣ ሁለተኛው ደግሞ የአተገባበሩን ሂደት ይገልጻል። የመጀመሪያውን ክፍል ለማንበብ ፍላጎት የሌላቸው ሰዎች በደህና ወደ ሁለተኛው መሄድ ይችላሉ.

ክፍል I

ወደ ሩቅ ፣ ሩቅ ዓመት ፣ የ CI / ሲዲ ሂደቱን በተቻለ ፍጥነት ማዋቀር አስፈላጊ ነበር። ከሁኔታዎች አንዱ ዶከርን አለመጠቀም ነበር። ለማሰማራት በተለያዩ ምክንያቶች የተገነቡ አካላት-

  • በምርት ውስጥ ይበልጥ አስተማማኝ እና የተረጋጋ የሥራ ክፍሎች (ይህም በእውነቱ ቨርቹዋልን ያለመጠቀም መስፈርት ነው)
  • መሪ ገንቢዎች ከዶከር ጋር መስራት አልፈለጉም (የሚገርም ነገር ግን እንደዛ ነበር)
  • በ R&D አስተዳደር ርዕዮተ ዓለም ግምት መሠረት

ለMVP መሠረተ ልማት፣ ቁልል እና ግምታዊ የመጀመሪያ መስፈርቶች እንደሚከተለው ቀርበዋል፡

  • 4 Intel® X5650 አገልጋዮች ከዲቢያን ጋር (አንድ ተጨማሪ ኃይለኛ ማሽን ሙሉ በሙሉ ተዘጋጅቷል)
  • የራሳቸው ብጁ አካላት ልማት በ C ++ ፣ Python3 ውስጥ ይከናወናል
  • ጥቅም ላይ የዋሉ ዋና የሶስተኛ ወገን መሳሪያዎች፡ ካፍካ፣ ክሊክሀውስ፣ የአየር ፍሰት፣ ሬዲስ፣ ግራፋና፣ ፖስትግሬስqል፣ ማይስክል፣…
  • ለማረም እና ለመልቀቅ በተናጠል ክፍሎችን ለመገንባት እና ለመሞከር የቧንቧ መስመሮች

በመነሻ ደረጃ ላይ መታየት ከሚያስፈልጋቸው የመጀመሪያ ጥያቄዎች ውስጥ አንዱ ብጁ አካላት በማንኛውም አካባቢ (ሲአይ / ሲዲ) ውስጥ እንዴት እንደሚሰማሩ ነው ።

የሶስተኛ ወገን ክፍሎችን በስርዓት ለመጫን እና በስርዓት ለማዘመን ወስነናል. በC++ ወይም Python ውስጥ የተገነቡ ብጁ አፕሊኬሽኖች በተለያዩ መንገዶች ሊሰማሩ ይችላሉ። ከነሱ መካከል ለምሳሌ: የስርዓት ፓኬጆችን መፍጠር, ወደ የተገነቡ ምስሎች ማከማቻ መላክ እና ከዚያም በአገልጋዮች ላይ መጫን. ባልታወቀ ምክንያት ሌላ ዘዴ ተመርጧል፡- ሲአይን በመጠቀም አፕሊኬሽን ሊተገበሩ የሚችሉ ፋይሎች ይዘጋጃሉ፣ ምናባዊ የፕሮጀክት አካባቢ ይፈጠራል፣ py ሞጁሎች ከ መስፈርቶች.txt ተጭነዋል እና እነዚህ ሁሉ ቅርሶች ከቅንጅቶች፣ ስክሪፕቶች እና አብሮ የመተግበሪያ አካባቢ ወደ አገልጋዮች. በመቀጠል ትግበራዎች ያለአስተዳዳሪ መብቶች እንደ ምናባዊ ተጠቃሚ ይጀመራሉ።

Gitlab-CI እንደ CI/CD ስርዓት ተመርጧል። የተፈጠረው የቧንቧ መስመር ይህን ይመስላል።

መተግበሪያዎችን በDocker Swarm ያሰማሩ
በመዋቅር፣ 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

ሁሉም አስፈላጊ የስርዓት ፓኬጆች ቀደም ሲል የተጫኑ እና ሌሎች ቅንጅቶች በተሠሩበት ስብሰባው እና ሙከራው በራሱ ምስል ላይ መደረጉን ልብ ሊባል ይገባል።

ምንም እንኳን እነዚህ በስራዎች ውስጥ ያሉት እያንዳንዳቸው ስክሪፕቶች በራሱ መንገድ አስደሳች ናቸው, ግን በእርግጥ ስለእነሱ አልናገርም የእያንዳንዳቸው መግለጫ ብዙ ጊዜ ይወስዳል እና ይህ የጽሁፉ አላማ አይደለም. የማሰማራቱ ደረጃ የጥሪ ስክሪፕቶች ቅደም ተከተል ያለው ስለመሆኑ ብቻ ትኩረትዎን ይስባል፡-

  1. createconfig.py - ለቀጣይ ማሰማራት (ቅድመ-ዝግጅት ፣ ምርት ፣ ሙከራ ፣ ...) በተለያዩ አከባቢዎች ውስጥ ካሉ አካላት ቅንጅቶች ጋር settings.ini ፋይል ይፈጥራል።
  2. install_venv.sh - በአንድ የተወሰነ ማውጫ ውስጥ ለ py አካላት ምናባዊ አካባቢን ይፈጥራል እና ወደ የርቀት አገልጋዮች ይገለብጠዋል
  3. አዘጋጅ_init.d.py - በአብነት ላይ በመመስረት ለክፍለ-ነገር መነሻ-ማቆሚያ ስክሪፕቶችን ያዘጋጃል።
  4. ማሰማራት.py - መበስበስ እና አዲስ አካላትን እንደገና ያስጀምራል

ጊዜ አለፈ። የዝግጅት ደረጃ በቅድመ-ምርት እና ምርት ተተክቷል. ለአንድ ተጨማሪ ስርጭት (ሴንት ኦኤስ) ለምርቱ ድጋፍ ታክሏል። 5 ተጨማሪ ኃይለኛ አካላዊ አገልጋዮች እና ደርዘን ቨርቹዋል ታክለዋል። እና ለገንቢዎች እና ሞካሪዎች ከስራው ሁኔታ ጋር በተገናኘ ወይም ባነሰ አካባቢ ውስጥ ተግባራቸውን ለመፈተሽ የበለጠ አስቸጋሪ እየሆነ መጣ። በዚህ ጊዜ, ያለ እሱ ማድረግ የማይቻል መሆኑን ግልጽ ሆነ ...

ክፍል II

መተግበሪያዎችን በDocker Swarm ያሰማሩ

ስለዚህ፣ የእኛ ክላስተር በ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 Swarm ያሰማሩ
የቁልል ስም ከቅርንጫፉ ስም ጋር ይዛመዳል እና ይህ ልዩነት በቂ መሆን አለበት. በጥቅሉ ውስጥ ያሉ አገልግሎቶች ልዩ የአይፒ አድራሻዎችን እና ወደቦችን፣ ማውጫዎችን፣ ወዘተ ይቀበላሉ። ይገለላሉ, ነገር ግን ከቁልል እስከ ቁልል ተመሳሳይ (ምክንያቱም የውቅረት ፋይሉ ለሁሉም ቁልል አንድ አይነት ስለሆነ) - እኛ የምንፈልገው. እኛ በመጠቀም ቁልል (ክላስተር) እናሰማራለን 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 ይኑርዎት
  • በቆለሉ ውስጥ ያነሱ የተጫኑ አንጓዎችን በራስ-ሰር ያግኙ
  • አንጓዎችን በስም ጥለት ይግለጹ (መታወቂያውን በአንቀጹ ላይ ከመጠቀም ይልቅ)
  • ቁልል መበላሸቱን ያረጋግጡ
  • ...

ልዩ ምስጋና ጽሑፍ.

ምንጭ: hab.com

አስተያየት ያክሉ