Автор оригинала: 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
Кубернеты
Kubernetes (K8S) – это система OpenSource для оркестрации контейнеров с полным набором подключенных функций, таких как мониторинг, вход, объемы и другие, использующие API стандартизации. Это означает, что каждая функция может использовать нативную реализацию K8S или может быть переопределено каким-то другим набором инструментов для реализации определенной функции. Также почему почти все хостинг поставщики, такие как Google, AWS, Azure, IBM, Digital Ocean и т. Д., имеют собственную реализацию K8S.
С K8s мы можем автозависимо от наших контейнеров и хозяев на основе его внутреннего мониторинга. Разверните контейнер, претензий на тому объем или опубликовать его на внешний мир, довольно просто на основе файлов YAML.
Однако это не так просто установить и поддерживать полную функциональную кластер Kubernetes с нуля. Вам нужно будет поддерживать не только ваш контейнер, но сам инфраструктуру Kubernetes. Из-за этого много DataCenter создал свой собственный сервис на основе K8S. Вам нужно только сообщить, сколько рабочих узлов вы хотите, и разверните ваши контейнеры.
Docker Rame.
Докерный рой с другой стороны проще, чем 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/