Быстрое развертывание любого приложения вместе с Waypoint

Автор оригинала: Mitchell Hashimoto
  • Перевод

К публикуемым в нашем блоге авторским статьям и переводным материалам про лайфхаки/интересные находки мы решили добавить разбор нового проекта. Waypoint — опенсорсный проект, предоставляющий разработчикам последовательный рабочий процесс сборки, развертывания и релиза приложений на любой платформе. Waypoint позволяет разработчикам провести свои приложения от разработки до производственной среды в одном файле и развертывать приложения с помощью одной команды: waypoint up. Waypoint из коробки поддерживает Kubernetes, HashiCorp Nomad, Amazon ECS, Google Cloud Run, экземпляры контейнеров Azure, Docker, Buildpacks и не только. Читайте дальше, чтобы увидеть небольшой пример, узнать больше о функциях Waypoint и о проблемах, которые решает инструмент.



Waypoint полностью расширяем и основан на системе плагинов, позволяющей работать с любым инструментом или платформой. После развертывания Waypoint предоставляет логирование и многое другое для проверки и отладки любых развертываний. Это программное обеспечение, которое вы самостоятельно загружаете и размещаете для управления развертыванием приложений, работающих на вашей инфраструктуре или платформах. Далее сам основатель HashiCorp расскажет о Waypoint подробнее.

Упрощение развертывания


Waypoint был создан нами по одной простой причине: разработчики хотят просто развертывать приложения. У HashiCorp есть возможность работать со всеми типами организаций и отдельных лиц нашего сообщества, что ставит нас перед проблемами, с которыми сталкиваются разработчики при развертывании приложений и в разрезе доступности для пользователей. Мы общаемся с десятками отдельных пользователей каждый день через GitHub Issues, дискуссионные форумы, электронную почту и т.д. Каждую неделю мы встречаемся более чем с 500 компаниями, чтобы обсудить их текущие разработки и операционные проблемы.

Благодаря взаимодействию мы увидели, что разработчики, особенно в организациях среднего и крупного размера, завалены сложностью: контейнеры, планировщики, файлы YAML, бессерверность и не только это. Сложность сделала приложения лучше во многих аспектах, но стоимость, которую видно по кривой обучения, требуется, чтобы просто развернуть первое приложение.

Другая проблема, которую мы увидели, зависит от приложения, ведь инструменты часто самые разные: Docker и kubectl для Kubernetes, HashiCorp Packer и Terraform для виртуальных машин, свои инструменты у каждой бессерверной платформы и т.д. Эта фрагментация снова создает проблему обучения отдельного человека. Для команд это уже проблемы последовательности и сложности.

С помощью Waypoint мы стремимся решить эти две проблемы. Waypoint предоставляет одну простую команду для развертывания любого приложения: «waypoint up». Рабочий процесс одинаков для любой платформы: Kubernetes, Nomad, EC2, Google Cloud Run и еще более десятка других будет поддерживаться к моменту запуска. Waypoint расширяется с помощью плагинов для любой логики сборки, развертывания и релиза. Разработчики просто хотят развертывать приложения. Waypoint просто делает это.

Функциональность


Waypoint предлагает ряд функций, предоставляющих рабочий процесс развертывания приложений, а также проверки и отладки развертывания. Эти функции делают Waypoint мощным инструментом для развертывания любых приложений на любой платформе.

  • waypoint up: единственная команда для сборки, развертывания и релиза приложения. Waypoint использует файл конфигурации, хранящийся вместе с кодом приложения, для определения того, как будет работать. Подробнее о жизненном цикле приложения Waypoint рассказывается в документации Waypoint.
  • URL-адреса развертывания и приложения: Разворачиваемые с помощью Waypoint приложения получают общедоступный URL waypoint.run с действующим сертификатом TLS, который генерируется Let's Encrypt. Используйте этот адрес, чтобы быстро просмотреть развернутые приложения и поделиться ими с другими людьми.
  • Выполнение команд: выполняйте команды в контексте развертывания через waypoint exec. Вы можете использовать exec для открытия оболочки в вашем приложении, а через нее выполнять отладку, миграцию и другие задачи. Здесь можно узнать больше о команде waypoint exec.
  • Логи: Waypoint предоставляет доступ к моментальному снимку журналов вашего приложения в режиме реального времени. Эти журналы полезны, когда вам нужно отладить поведение развивающегося приложения. Однако они не заменяют комплексные решения для логирования, такие как Datadog или Splunk. Логи агрегируются и доступны через CLI и веб-интерфейс. Здесь можно узнать больше о логах.
  • Веб-интерфейс: в дополнение к простому и мощному CLI, в Waypoint есть веб-интерфейс, позволяющий просматривать сборки, развертывания и релизы проектов и приложений. Сегодня веб-интерфейс можно только читать. Мы непрерывно разрабатываем его и расширим функциональность в будущем. Более того, в графическом интерфейсе будут подсказки о том, как использовать интерфейс командной строки
  • Плагины: логика сборки, развертывания и выпуска полностью расширяема с помощью плагинов. Waypoint поставляется с более чем десятком встроенных плагинов, и любой желающий может расширить функциональность Waypoint, написав свой собственный плагин.


Пример рабочего процесса


Покажем на примере различные особенности Waypoint. Пропущены некоторые шаги настройки, поэтому, если вы хотите попробовать полный пример самостоятельно, пожалуйста, ознакомьтесь с нашими руководствами по началу работы. В этом примере мы развернем приложение в Kubernetes. Создадим рядом с приложением файл waypoint.hcl. Этот файл описывает все этапы жизненного цикла приложения.

project = "HashiCorp Waypoint"
app "waypoint-up" {
    build {
        use "docker" {}
        registry {
            use "docker" {
                image = "hashicorp/wpmini"
                tag = gitrefpretty()
            }
         }        
      }
    deploy {
        use "kubernetes" {
            probe_path="/"
            service_port=80
        }
     }
    release {
        use "kubernetes" {
            load_balancer=true
            port=80
         }
     }
}

Сборка, развертывание, релиз


Файл конфигурации Waypoint описывает три основных этапа жизненного цикла приложения: сборку, развертывание и релиз.

  • Сборка берет исходный код приложения и конвертирует в артефакт. Процесс сборки может включать опциональную конфигурацию реестра для отправки собранного артефакта в реестр таким образом, чтобы он был доступен платформам развертывания. Например, на этом этапе исходный код конвертируется в образ Docker, EC2 AMI и т.д.

  • Развертывание берет собранный на предыдущем этапе артефакт и помещает его на целевую платформу развертывания, делая развертывание доступным по URL или через другие внутренние методы

Релиз активирует развертывание и открывает его основному трафику. В будущем мы добавим в Waypoint поддержку продвижения приложений между средами, откат развертываний и релизов и постепенное перемещение трафика между серверами после релиза.

Поднимаем Waypoint


Команда waypoint up выполняет сборку, развертывание и релиз приложения. В конце выводится один или несколько адресов, по которым доступно приложение. Неважно, какое это приложение и для какой платформы, вы всегда можете ввести в терминал waypoint up для развертывания.



Можно выполнять этапы жизненного цикла отдельно друг от друга. Это полезно при взаимодействии с Github Actions и инструментами CI/CD, подобными CricleCI и Jenkins. Узнать больше об автоматизации рабочего процесса приложения с помощью Waypoint можно здесь.

Адреса приложения и развертывания


Развернутые с помощью Waypoint приложения получают общедоступный URL вида waypoint.run с действительным сертификатом TLS, автоматически сгенерированным Let's Encrypt. Используйте этот адрес, чтобы быстро посмотреть развернутые приложения и поделиться ими. Мы предоставляем этот URL через бесплатный общедоступный сервис компании HashiCorp. Функция необязательна и может быть отключена. В примере выше наш URL recently-pleasant-duck--v1.waypoint.run. Обратите внимание, что этот адрес уже не работает, приложение выполнялось только для этого поста в блоге. Вы можете посмотреть определенную версию развертывания по ссылке вида recently-pleasant-duck--vN.waypoint.run, где N — номер версии развертывания. Эта функция очень полезна, чтобы поделиться предрелизной версией вашего приложения с вашей командой.



Логирование в Waypoint


Waypoint дает доступ к моментальному снимку логов приложения в режиме реального времени. Эти логи полезны, когда нужно отладить поведение развивающегося приложения. Однако они не заменяют комплексные решения для логирования. Логи агрегируются и доступны для просмотра через интерфейс командной строки и веб-интерфейс. Эта функция логов работает вне зависимости от платформы. Используете ли вы Kubernetes, EC2, Google Cloud Run или другую платформу, вы можете согласовано просматривать логи. С помощью пользовательского интерфейса можно просматривать логи нескольких развернутых на разных платформах приложений.



Waypoint exec


Вы можете выполнять команды в контексте развернутого приложения с помощью команды waypoint exec. Эта функция позволяет открывать оболочку, запускать скрипты и делать все, что вы хотите делать с вашими развертываниями. Как и логирование, waypoint exec работает на всех поддерживаемых Waypoint платформах.



Другие возможности


Этот список — только краткий обзор некоторых функций Waypoint. Waypoint может применяться для управления конфигурацией приложения через переменные окружения, интегрируется с вашей CI или Github. Рабочие пространства при меняются, чтобы создавать отдельные среды для отдельных веток. Кроме того, вы можете написать плагин и это еще не всё.Waypoint — это бренд нового проекта. Мы рассчитываем, что продолжим добавлять новую функциональность в ближайшие месяцы.

Waypoint и существующие приложения


Если у вас уже есть приложение и рабочий процесс развертывания, вы можете почувствовать сомнение в том, сможете ли использовать…. Мы не ждем, что команды разработки немедленно перестроят и с нуля перестроят свой рабочий процесс для Waypoint. Но у нас есть плагин docker pull и возможность локального выполнения, позволяющая адаптировать Waypoint для приложения с уже настроенным рабочим процессом. Кроме того, у нас есть документация, которая описывает интеграцию Waypoint в другие CI: CircleCI или Jenkins. Эта функция позволяет просмотреть историю развертывания в интерфейсе Waypoint, выполнять команду exec, логирование, конфигурацию приложения и не только это. Приложив немного усилий, вы получаете преимущества Waypoint, пока обдумываете, хотите ли перейти на более управляемый плагин. Когда у вас много приложений, этот подход позволяет сочетать рабочие процессы и сравнивать их.

Полная расширяемость плагинами


Логика жизненного цикла полностью расширяемая. Waypoint работает на той же системе плагинов, что и Terraform. мы полагаем, что написать плагин для Waypoint так же просто (если не проще), чем для Terraform. В Waypoint встроено более десятка плагинов с самого начала. Мы надеемся и ожидаем, что со временем, с помощью сообщества открытого ПО, это число резко возрастет. У Terraform при запуске было около 6 провайдеров. Сегодня у Terraform 300 провайдеров. Мы верим, что такое возможно и для развертывания приложений. Если вам интересно написать плагин, пожалуйста, прочитайте наше руководство для авторов плагинов и посмотрите исходный код встроенных плагинов Waypoint 0.1 на Github.

Ссылки проекта
  • Попробуйте Waypoint, посетив страницу начала работы, чтобы посмотреть демонстрацию быстрого старта или выполнить инструкции, которые ссылаются на примеры приложений NodeJS, Python, Ruby, Java и многих других языках, фреймворках и облачных платформах. 
  • Дайте нам обратную связь. Waypoint как проект все еще находится на ранней стадии, и мы хотели бы обратиться к сообществу за обратной связью через дискуссионный форум HashiCorp. Вы также можете посетить страницу сообщества и узнать, как внести свой вклад в проект.
  • Напишите плагин. Мы будем рады вашей помощи в продолжении улучшения Waypoint. Если у вас есть идея плагина Waypoint, опубликуйте ее на GitHub или предложите ее на форуме Waypoint в HashiCorp.
  • Поделитесь своим приложением. Если вы развернули приложение с помощью Waypoint, сделайте снимок экрана, где оно работает, с URL-адресом Waypoint, и опубликуйте в Twitter с тегом #WaypointUp HashiCorp. Если вы хотите, чтобы другие люди увидели работу приложения, поделитесь URL Waypoint. Мы выделим приложения сообщества в ближайшие недели.


Специально для хабровчан мы сделали промокод HABR, дающий дополнительную скидку 10% к скидке указанной на баннере.

image




Рекомендуемые статьи


SkillFactory
Школа Computer Science. Скидка 10% по коду HABR

Комментарии 6

    0
    Кажется, они изобрели заново свой же Vagrant, только теперь для контейнерной инфраструктуры.
      0
      На первый взгляд похоже на пайплайны, которые есть, например, в том же GitLab. Только вот я не очень себе представляю, что может побудить разработчиков перенести сборку и выкладку из уже существующего инструмента, который встроен в тот же GitLab, куда-то в отдельное место.
        +2
        Это для таких как мы, кто себя добровльно почти намертво привязал к другим продуктам «Хашишкорпа» некоторое время назад.
        hcl, всё та же боль с багами, которые могут не фиксить по несколько лет или до тех пор пока не «подгорит» и не пошлётся пулл-реквест, узнаваемый Го внутри, известная структура документации, всё тот же круг знакомых лиц, кто этим добром пользуется и успеет быстрее вас наступить на очередные грабли и рассказать об этом.
        «Всё просто и знакомо. Милый дом.»

        </почти-сарказм>
        +1
        Напомнило язык программирования Ballerina. Две команды (сборка и деплой), и приложение уже запущено в кластере (в примере ниже — в Kubernetes):
        ballerina build kubernetes_deployment.bal && kubectl apply -f ./kubernetes/


        kubernetes_deployment.bal:
        import ballerina/config;
        import ballerina/http;
        import ballerina/log;
        import ballerina/kubernetes;
        @kubernetes:Service {
            serviceType: "NodePort"
        }
        Service type is NodePort.
        @kubernetes:Ingress {
            hostname: "abc.com"
        }
        listener http:Listener helloWorldEP = new(9090, config = {
            secureSocket: {
                keyStore: {
                    path: "./security/ballerinaKeystore.p12",
                    password: "ballerina"
                },
                trustStore: {
                    path: "./security/ballerinaTruststore.p12",
                    password: "ballerina"
                }
            }
        });
        @kubernetes:ConfigMap {
            conf: "./ballerina.conf"
        }
        @kubernetes:Deployment {
            livenessProbe: true,
            image: "kubernetes:v.1.0"
        }
        @http:ServiceConfig {
            basePath: "/helloWorld"
        }
        service helloWorld on helloWorldEP {
            @http:ResourceConfig {
                methods: ["GET"],
                path: "/config/{user}"
            }
            resource function getConfig(http:Caller outboundEP, http:Request request, string user) {
                string userId = getConfigValue(user, "userid");
                string groups = getConfigValue(user, "groups");
                json payload = {
                    userId: userId,
                    groups: groups
                };
                var responseResult = outboundEP->respond(payload);
                if (responseResult is error) {
                    error err = responseResult;
                    log:printError("Error sending response", err);
                }
            }
        }
        function getConfigValue(string instanceId, string property) returns (string) {
            string key = <@untainted string> (instanceId + "." + property);
            return config:getAsString(key, "Invalid User");
        }


        ballerina.conf (просто для демонстрации чтения конфига):
        [john]
        userid="john@ballerina.com"
        groups="apim,esb"
        [jane]
        userid="jane3@ballerina.com"
        groups="esb"
          0

          Прочитал


          The "exec" plugin is meant to be an escape hatch from Waypoint. In working this way, you will lose many Waypoint benefits. For example, "waypoint destroy" functionality will not work with deploys created with the exec plugin.

          увидел, что какого-нибудь ssh/shell плагина нет, и продолжил поиски хорошей базы для CI/CD где-то ещё.

            0
            бессерверность

            Вот не пойму, зачем serverless переводить в лоб? зачем вообще переводить такого рода термины? Вы бы еще active directory перевели как активный каталог)

            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

            Самое читаемое