Кластеризация приложения

и настройка своего облачного сервиса

Занятие 16

Профессия
Node.js & React.js developer
продвинутый курс

  • Что такое кластеризация
  • Какие есть решения на рынке
  • Настройка своего облачного сервиса

План

1

Кластеризация приложения

Дисклеймер

и история

я не DevOps - я просто программист

Что такое кластер

слабо связанная совокупность нескольких вычислительных систем, работающих совместно для выполнения общих приложений, и представляющихся пользователю единой системой

Когда нужен кластер

  • Увеличить производительность системы
  • Увеличить скорость отклика системы по географии
  • Увеличить Up-time системы

Какие проблемы нужно решить кластеру

 

  • Общение нод между собой
  • Распределение нагрузки
  • Распределение реплик приложений между нодами
  • Балансировка нагруки
  • Увеличить скорость отклика системы по географии
  • Увеличить Up-time системы

Что нужно знать, перед кластеризацией

2

Решения на рынке

2

  • Node.js из коробки
  • PM2 - Cluster Mode
  • SAAS (Heroku)
  • Контейнеры (Оркестраторы)

Для Node.js

3

  • Docker container
  • Non docker container

Контейреные решения

2

  • Kubernetes
  • Docker Swarm
  • Mesos
  • Nomad
  • Rancher
  • ...others

Оркестраторы

2

  • Amazon Web Services (AWS)
  • Google Cloud Platform (GCP)
  • Microsoft Azure

Где хоститься

  • DigitalOcean

3

Kubernetes

  • 2014
  • by Google
  • платформа для автоматического развёртывания, масштабирования, управления приложениями на кластерах или отдельных хостах

3

Kubernetes

3

Docker Swarm

  • 2016
  • by Docker

3

Docker Swarm

Feature highlights

  1. Cluster management integrated with Docker Engine
  2. Decentralized design
  3. Declarative service model
  4. Scaling
  5. Desired state reconciliation
  6. Multi-host networking
  7. Service discovery
  8. Load balancing
  9. Secure by default
  10. Rolling updates

Терминология

 

  • Image
  • Контейнер
  • Registry
  • Оркестратор
  • Нода
  • Master - нода
  • Slave - нода
  • Реплика
  • Service discovery

3

Настройка своего облачного сервиса

 

3

  1. Покупаем Хостинг
  2. Устанавливаем Docker
  3. Настраиваем кластер
  4. Устанавливаем утилиты
  5. Создаем проект
  6. Настраиваем CI

Мой путь

3

  1. DigitalOcean
  2. Ubuntu 16.04
  3. +20% за бекапы

1. Покупаем хостинг

3

2. Устанавливаем Docker

3

3. Настраиваем кластер

CLI:

  • swarm init
  • swarm join
  • service create
  • service inspect
  • service ls
  • service rm
  • service scale
  • service ps
  • service update

3

4. Устанавливаем утилиты

  1. gitlab
  2. gitlab-runner
  3. docker-registry
  4. dockprom
    1. prometheus
    2. alertmanager
    3. grafana
  5. nginx
    1. nginx-proxy
    2. docker-flow-proxy
  6. docker-swarm-visualizer

3

5. Создаем проект

3

6. Настраиваем CI

Text

# .gitlab-ci.yml

image: docker:latest
cache:
  key: cache_npm
  paths:
    - .npm
stages:
  - npm_install
  - npm_build
  - create_image
  - test
  - deploy

variables:
  CONTAINER_IMAGE: ${CI_REGISTRY}/${CI_PROJECT_PATH}:${CI_COMMIT_REF_NAME}_${CI_COMMIT_SHA}
  CONTAINER_IMAGE_TAG: ${CI_REGISTRY}/${CI_PROJECT_PATH}:${CI_COMMIT_REF_NAME}
  CONTAINER_IMAGE_CONCAT: ${CI_PROJECT_PATH_SLUG}-${CI_COMMIT_REF_NAME}

npm_install:
  stage: npm_install
  image: node:6.9.2
  before_script:
    - npm config set cache ./.npm
  script:
    - npm install
  variables:
    NODE_ENV: production
  artifacts:
    paths:
     - .npm/
     - node_modules/

npm_install_client:
  stage: npm_install
  image: node:6.9.2
  before_script:
    - npm config set cache ./.npm
  script:
    - cd client
    - npm install
  variables:
    NODE_ENV: production
  artifacts:
    paths:
     - .npm/
     - client/node_modules/

npm_build:
  stage: npm_build
  image: node:6.9.2
  script:
    - cd client
    - npm run build
    - cd ../
    - cp -r client/build public

  dependencies:
    - npm_install
    - npm_install_client
  artifacts:
    paths:
     - public/

create_image:
  stage: create_image
  image: docker:latest
  script:
    - docker login -u gitlab-ci-token -p ${CI_BUILD_TOKEN} ${CI_REGISTRY}
    - docker build -t ${CONTAINER_IMAGE} .
    - docker tag ${CONTAINER_IMAGE} ${CONTAINER_IMAGE_TAG}
    - docker push ${CONTAINER_IMAGE}
    - docker push ${CONTAINER_IMAGE_TAG}

test:
  stage: test
  image: docker:latest
  script:
    - echo "ok"


.depoy: &deploy
  stage: deploy
  script:
    - docker stack deploy --with-registry-auth --compose-file=docker-compose.yml ${CONTAINER_IMAGE_CONCAT}

deploy_master:
  <<: *deploy
  environment:
    name: master
    url: https://master.demo.test
  variables:
    STAGE: master
    EXPOSE_PORTTT: 8001
  only:
    - master
  when: manual

deploy_develop:
  <<: *deploy
  environment:
    name: develop
    url: https://develop.demo.test
  variables:
    STAGE: develop
    EXPOSE_PORTTT: 8002
  only:
    - develop
  
deploy_staging:
  <<: *deploy
  environment:
    name: staging
    url: https://staging.demo.test
  variables:
    STAGE: staging
    EXPOSE_PORTTT: 8003
  only:
    - staging
  


3

6. Настраиваем CI

# Dockerfile

FROM node:6.9.2
COPY . .

EXPOSE 8080
CMD [ "npm", "start" ]
# .docker-compose.yml

version: "3"
services:
  web:
    image: "${CONTAINER_IMAGE}"
    deploy:
      replicas: 3
      restart_policy:
        condition: on-failure
      resources:
        limits:
          cpus: "0.1"
          memory: 50M
    expose:
      - 8000
    environment:
      - VIRTUAL_HOST=demo.test
    # labels:
    #   - com.df.notify=true
    #   - com.df.distribute=true
    #   - com.df.servicePath=/
    #   - com.df.reqMode=tcp
    #   - com.df.reqPathSearch=/
    #   - com.df.reqPathReplace=/
    #   - com.df.port=8080
    #   - com.df.srcPort=8080
    networks:
      - visualizer
      - proxy
    volumes:
      - "/root/projects/public:/public"

3

6. Настраиваем CI

4

Оффтоп

или как я обновил все зависимости до самых актуальных и что нового узнал

Игорь Суворов

Thanks!

any questions?

программист-предприниматель

Кластеризация приложения. Настройка своего облачного хостинга.

By Igor Suvorov

Кластеризация приложения. Настройка своего облачного хостинга.

  • 994