Рубрики
Без рубрики

Создание стека Docker Rasa с террафом (TerraScript Python), постоянные тома и динамический гаапокси.

Эта статья демонстрирует, как создать кластер Docker Cluster с объемом, брандмауэром, DNS и балансом нагрузки с использованием террафора, обернутых сценарием Python.

Автор оригинала: Joao Gilberto Magalhães.

Прежде чем кто-то обвиняет меня о том, почему я не использую Kubernetes, AWS ECS, MESOS или что-нибудь, кроме роя Ответ прост: Docker Rash – недорогой и очень простой тонкий оркестратор. Из-за этого он упускает много функций, которые Kubernetes уже реализованы по умолчанию. Большинство важных центров обработки данных (Google, AWS, Azure, Oracle, IBM, Digital Ocean и т. Д.) Уже реализовали каких-то Kubernetes, как услуга позволяет легко его принятие. Тем не менее, Docker Swarm не имеет ни одного обработки данных, не реализуют его и создают некоторые из структуры, готовые к работе, так как K8S.

В этой статье я расскажу о некоторых концепциях, и после этого я продемонстрирую, как создать полную инфраструктуру Docker Rash, используя TerraScript с очень базовым требованием громкости без какого-либо специального плагина и очень базовый контроллер входа с помощью HAProxy и контейнера -Вот и динамическая конфигурация. Я разработал эту инфраструктуру, и я использую для себя в моих проектах.

Сначала давайте поговорим о некоторых очень основных концепциях

Контейнерная оркестровка

Если мы развертываем несколько контейнеров в той же машине, нет причин даже знать, что такое оркестровка контейнера. Просто бегите и будь счастлив. Однако, когда мы должны развернуть сто или тысячи контейнеров в большом кластере машин, и каждый контейнер нуждается в некоторых типах ресурсов, то запрещено оркестровка контейнера имеет смысл.

Ортестография контейнера:

«Система для автоматизации развертывания, масштабирования и управления контейнерными приложениями».

Когда я развернул контейнер с использованием оркестратора контейнера, мне просто нужно сообщить изображение, количество контейнеров и ресурсов, которым необходимо запустить, и Orchestrator создаст необходимые экземпляры и выделяют ресурсы для вас. Неважно, если я использую Kubernetes, Amazon ECS, Docker Rash или любой другой. Они гарантируют, что развертывание было успешно, и если все не удастся, вы будете знать, почему.

Если вам интересно узнать немного больше о контейнерных оркестрации и K8S, вы можете взглянуть на презентацию, которую я сделал для Дня Google Developer Winnipeg [1]

Docker Swarm vs Kubernetes

Кубернеты

img1.png.png.png

Kubernetes (K8S) – это система OpenSource для оркестрации контейнеров с полным набором подключенных функций, таких как мониторинг, вход, объемы и другие, использующие API стандартизации. Это означает, что каждая функция может использовать нативную реализацию K8S или может быть переопределено каким-то другим набором инструментов для реализации определенной функции. Также почему почти все хостинг поставщики, такие как Google, AWS, Azure, IBM, Digital Ocean и т. Д., имеют собственную реализацию K8S.

С K8s мы можем автозависимо от наших контейнеров и хозяев на основе его внутреннего мониторинга. Разверните контейнер, претензий на тому объем или опубликовать его на внешний мир, довольно просто на основе файлов YAML.

Однако это не так просто установить и поддерживать полную функциональную кластер Kubernetes с нуля. Вам нужно будет поддерживать не только ваш контейнер, но сам инфраструктуру Kubernetes. Из-за этого много DataCenter создал свой собственный сервис на основе K8S. Вам нужно только сообщить, сколько рабочих узлов вы хотите, и разверните ваши контейнеры.

Docker Rame.

IMG2.PNG

Докерный рой с другой стороны проще, чем K8s. Вам не нужно много учиться о рожде, чтобы развернуть свой первый стек, потому что вы будете использовать Docker Compose файл. Мы можем ожидать хорошего и дешевого контейнерного оркестрации и управления DNS контейнеров. Однако не хватает много особенностей, существующих в K8S. Например, вы не можете автосервировать ваш контейнер. Это можно сделать вручную без усилий или сторонних компонентов. У нас нет входа или мониторинга. Если вы хотите, чтобы вы должны были установлены самим собой как стек кластера роя.

Простота роя состоит в том, что использует первоначальный докер API. Концепция тоже довольно просто. У вас есть узлы менеджера, которые разделяют между собой базу данных с помощью состояния Docker Swarm и рабочими узлами, которые являются просто машинами для запуска контейнера и не имеют специальной функции или услуг. Любое развертывание или действие на Docker Barm необходимо выполнить в узле менеджера.

Docker Swarm может запустить кластер с одним машиной в качестве менеджера и в качестве рабочего одновременно. Вы знаете, что далеко не использовалось в производственных условиях, однако довольно дешево начать его и понять его. Для DataCenter я выбрал цифровой океан, потому что он дешевый, и я могу создать функциональный и довольно надежный кластер с 3 узлами, начиная от всего 15 долларов США/месяц.

Инфраструктура я полагался на террафору. Фактически, для создания ресурсов и сохранения состояния структуры террафоруют выполнять задачу довольно хорошо. Я не могу винить это за это. Но Terraform имеет огромную проблему: он использует язык HCl [2]. Этот язык не хватает большого важных ресурсов программирования, которые следует считать языком программирования. Неважно, что довольно чертовски трудно повторно повторно использовать код. После того, как я делаю много террафора, я могу заверить вам, сколько взлома я должен поставить в TF-код, чтобы его запустить.

Чтобы избежать программирования непосредственно в Terraform HCl, я выбираю использовать код, называемый «Python-TerraScript» [3]. Это не что иное, как код Python, который обернет ресурсы, данные и провайдеры террафора. Но великая вещь, которую я могу программировать на реальном языке программирования – Python – и у всех хороших вещей я могу сделать с террафом.

В этом рецепте больше 2 штуки. Один код, который я разработан под названием RARM TF [4]. Это пакет Python Pip, который я использую для создания моей ройной инфраструктуры. Второй кусок является еще одним кодом, который я разработан под названием Docker Easy Haproxy [5]. Это Docker Image на основе HAProxy, который имеет сервисный автоматическое открытие на основе тегов докера. Нет установки, нет конфигурации, без простоя. Просто запустите его

Дочсерская ройная структура этого проекта

Docker Swarm требует, чтобы узлы были или менеджером или рабочим узлом. Менеджеры содержат всю базу данных рома кластера. Работает только с одним узлом, но группа странных менеджеров лучше. В идеале 3 или 5 делают задачу очень хорошо.

В нашем проекте SWARM TF у меня есть два класса Python: Менеджер и Работник Отказ Я могу создать разные набор работников, например работников высокой емкости или работников с объемом. Этот рабочие и менеджеры могут быть созданы в разных регионах, а также улучшить высокую доступность. Вы также можете подключиться к другим центром данных, но это еще не реализовано.

Начать

Установите требования:

Терраформ:

wget https://releases.hashicorp.com/terraform/0.11.14/terraform_0.11.14_linux_amd64.zip
unzip terraform_0.11.14_linux_amd64.zip
sudo mv terraform /usr/local/bin/

Python (рекомендуется виртуальная среда)

sudo apt install python3.6 virtualenv
mkdir -p ~/work/swarm
cd ~/work/swarm
virtualenv -p /usr/bin/python3.6 venv
source venv/bin/activate
pip install swarm_tf

Давайте рок-код и код

Сначала нам нужно создать сценарий Python под названием main.py и создать наш репозиторий TerraScript,

o = Terraobject()
o.terrascript.add(provider("digitalocean", token=do_token))
domain="example.com"

И тогда давайте создадим наш менеджер:

# ---------------------------------------------
# Creating Cluster
# ---------------------------------------------
managerVar = ManagerVariables()
managerVar.image = "ubuntu-18-04-x64"
managerVar.size = "s-1vcpu-1gb"
managerVar.name = "manager"
managerVar.domain = domain
managerVar.total_instances = 1
managerVar.user_data = get_user_data_script()
managerVar.tags = ["cluster", "manager"]
managerVar.ssh_keys = [sshkey.id]
managerVar.provision_ssh_key = ssh_key
managerVar.provision_user = "root"
managerVar.connection_timeout = "2m"

manager = Manager(o, managerVar)
manager.create_managers()

И давайте создадим одного работника:

# ---------------------------------------------
# Creating Worker Nodes
# ---------------------------------------------
workerVar = WorkerVariables()
workerVar.image = "ubuntu-18-04-x64"
workerVar.size = "s-1vcpu-1gb"
workerVar.name = "worker"
workerVar.region = region
workerVar.domain = domain
workerVar.total_instances = 1
workerVar.user_data = get_user_data_script()
workerVar.tags = ["cluster", "worker"]
workerVar.manager_private_ip = o.shared["manager_nodes"][0].ipv4_address_private
workerVar.join_token = function.lookup(o.shared["swarm_tokens"].result, "worker", "")
workerVar.ssh_keys = [sshkey.id]
workerVar.provision_ssh_key = ssh_key
workerVar.provision_user = "root"
workerVar.connection_timeout = "2m"

worker = Worker(o, workerVar)
worker.create_workers()

И до конца нам нужно выводить код Terraform, сгенерированный TerraScript Wrapper:

print(o.terrascript.dump())

Вы можете запустить что-то вроде Python Main.tf Чтобы получить код и запустить команды Terraform. Для того, чтобы облегчить, я создаю сценарий под названием TerraScript Это запускает Python, а затем называть террафору. Вам просто нужно:

terrascript plan -out my.tfplan

И применять:

terrascript apply my.tfplan

Это создаст наш кластер с 2 экземплярами. Помните, что вам нужно создать токен API на веб-сайте Digital Ocean.

Установка портнайнера в виде Cluster Manager

Portainer – это менеджер Docker Swarm. Вы можете развернуть стеки, масштабировать вверх и вниз по контейнеру и сделать много административных задач в чистом и функциональном интерфейсе. Как только наш кластер работает, и работает, мы можем установить его как стек Docker Rasa.

Как сказано, прежде чем нам нужно подключиться к менеджеру, чтобы развернуть наши стеки. Вместо этого для удаленного подключения мы можем подключиться к нему, запустив скрипт для подключения к менеджеру и запустить команды Docker там:

connect_to_manager -c
export DOCKER_HOST=tcp://localhost:2374

И с помощью Docker-Compose файла с именем AS Portainer.yml :

version: '3.2'

services:
  portainer:
    image: portainer/portainer:1.22.0
    ports:
      - "9000:9000"
    command: -H "tcp://tasks.agent:9001" --tlsskipverify
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - data:/data
    networks:
      - net
      - main
    deploy:
      replicas: 1
      labels:
        com.byjg.easyhaproxy.definitions: "http"
        com.byjg.easyhaproxy.port.http: "80"
        com.byjg.easyhaproxy.host.http: "admin.example.com"
        com.byjg.easyhaproxy.localport.http: "9000"
      placement:
        constraints: [node.role == manager]
      restart_policy:
        condition: on-failure
      resources:
        limits:
          cpus: '0.10'
          memory: 128M
        reservations:
          cpus: '0.05'
          memory: 10M

  agent:
    image: portainer/agent:1.4.0
    environment:
      AGENT_CLUSTER_ADDR: tasks.agent
      CAP_HOST_MANAGEMENT: 1
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /var/lib/docker/volumes:/var/lib/docker/volumes
      - /:/host
    networks:
      - net
    deploy:
      mode: global
      placement:
        constraints: [node.platform.os == linux]
      restart_policy:
        condition: on-failure
      resources:
        limits:
          cpus: '0.10'
          memory: 128M
        reservations:
          cpus: '0.05'
          memory: 10M

volumes:
  data:

networks:
  main:
    external: true
  net:
    driver: overlay
    attachable: true

И развернуть его:

docker stack deploy -c portainer.yml portainer

Через несколько секунд вы можете получить доступ к платформе с: http://Manager_ip: 9000/ Отказ Вы также можете проверить, все в порядке, набрав: Docker Stack Services Portainer

Создание брандмауэра

Мы можем создать правило брандмауэра для защиты нашего приложения и узлов.

Просто добавьте после последнего создания узла:

# ---------------------------------------------
# Creating Firewall
# ---------------------------------------------
create_firewall(o, domain=domain, inbound_ports=[22, 80, 443, 9000], tag="cluster")

Настройте DNS для наших узлов.

Если домен управляется цифровым океаном, вы можете добавить в Менеджер или Wareervar Недвижимость create_dns Отказ Это создаст записи DNS после шаблона nodename - номер.domain.

Прикрепление тома к экземпляру

Сценарий также может создавать или использовать громкость, прикрепить и монтировать на узел. Это полезно, когда вам нужно создать службу, которая нуждается в постоянном хранении, например, в базе данных. Единственным вопросом с таким подходом является то, что вам нужно создать афишу со службой и узлом, где прилагается объем.

Чтобы создать громкость с 10 ГБ и прикрепите к первому узлу этой группы узлов, используйте команду ниже.

workerVar.persistent_volumes = [VolumeClaim(o, region, "volume-nyc3-01", 10)]

Динамическая гапроксия

Последняя часть здесь состоит в том, чтобы иметь вход в наш контейнер. Вам нужно развернуть ваши услуги, подвергающиеся портам контейнера. Просто установите Docker Easy Haproxy и установите этикетки на свой контейнер.

Создать файл lb.yml со следующим содержанием:

version: "3.4"
services:
  front:
    image: byjg/easy-haproxy:2.0
    deploy:
      restart_policy:
        condition: on-failure
      resources:
        limits:
          cpus: '0.20'
          memory: 128M
        reservations:
          cpus: '0.10'
          memory: 10M
      update_config:
        parallelism: 1
        delay: 10s
      replicas: 1
      placement:
        constraints: [node.labels.type == manager]
    environment:
      DISCOVER: "swarm"
      HAPROXY_USERNAME: "admin"
      HAPROXY_PASSWORD: "supersecretpassword"
      HAPROXY_STATS_PORT: "1936"
      HAPROXY_CUSTOMERRORS: "false"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - main
    ports:
      - 80:80
      - 443:443
      - 1936:1936
  main:
    external: true

И развернуть его:

docker stack deploy -c lb.yml lb

Теперь вам нужно развернуть ваши услуги, проходящие следующие метки:

  • com.byjg.easyhaproxy.definitions.
  • com.byjg.easyhaproxy.port.http.
  • com.byjg.easyhaproxy.host.http.
  • com.byjg.easyhaproxy.localport.http: “9000”

1. GDG Winnipeg – Kubernetes https://www.slidehare.net/byjg/kubernetes-k8s-basic-concepts/byjg/kubernetes-k8s-basic-concepts

2. Террафор HCl Язык https://www.terraform.io/docs/configuration/syntax.html.

3. Python TerraScript https://github.com/mjuenema/python-terraseprcript.

4. Рой TF https://opensource.byjg.com/swarm_tf/

5. Docker Easy Haproxy https://opensource.byjg.com/docker-easy-haproxy/