Автор выбрал Фонд открытого Интернета/Свободы слова для получения пожертвования в рамках программы Write for DOnations.

Введение

Kubernetes — это мощный инструмент оркестрации контейнеров, который позволяет развертывать контейнерные приложения и управлять ими, но иногда для управления базовой инфраструктурой может потребоваться время. Бессерверная парадигма помогает пользователям развертывать приложения, не беспокоясь о базовой инфраструктуре. С появлением Serverless 2.0 многие платформы и инструменты теперь позволяют развертывать бессерверные приложения в Kubernetes.

Knative — это платформа на базе Kubernetes, которая предоставляет компоненты для развертывания и управления бессерверными рабочими нагрузками. Knative предлагает интеграцию Kubernetes с открытым исходным кодом, облачную агностицизм, строительные блоки и расширяемость. Такие инструменты, как Openshift от Red Hat, также используют Knative, чтобы пользователи могли развертывать свои бессерверные рабочие нагрузки поверх Kubernetes.

В Knative есть два основных компонента: Eventing и Serving. Eventing управляет событиями, которые запускают бессерверные рабочие нагрузки. Обслуживание — это набор компонентов для развертывания и управления бессерверными рабочими нагрузками. Knative Serving позволяет разработчикам развертывать бессерверные приложения и управлять ими поверх Kubernetes. С помощью Knative Serving разработчики могут быстро и легко развертывать новые сервисы, масштабировать их вверх и вниз и подключать к другим сервисам и источникам событий. Эта функция позволяет разработчикам создавать и развертывать современные облачные приложения, которые являются гибкими, масштабируемыми и простыми в обслуживании.

В этом руководстве вы будете использовать Knative Serving для развертывания приложения Node.js в качестве бессерверной рабочей нагрузки в кластере DigitalOcean Kubernetes. Вы будете использовать doctl (CLI DigitalOcean) и kn (CLI Knative) для создания кластера Kubernetes и развертывания приложения.

Предварительные условия

Чтобы выполнить это руководство, вам понадобится следующее:

  • Учетная запись DigitalOcean, которую вы будете использовать для запуска кластера Kubernetes с объемом оперативной памяти не менее 4 ГБ и двумя ядрами ЦП. Если у вас его нет, зарегистрируйте новую учетную запись. Эта установка будет использовать кластер DigitalOcean Kubernetes. Чтобы создать кластер Kubernetes в облачной панели DigitalOcean, ознакомьтесь с нашим кратким руководством по Kubernetes.
  • Чтобы следовать этому руководству с удаленного сервера, вы можете настроить сервер Ubuntu 22.04 с пользователем без полномочий root и брандмауэром, выполнив нашу первоначальную настройку сервера. Чтобы начать работу с дроплетом DigitalOcean, вы можете воспользоваться нашим кратким руководством по дроплету.
  • Клиент командной строки DigitalOcean, doctl , установленный на вашем компьютере. Рекомендуется использовать вариант GitHub Download . Дополнительную информацию об использовании doctl см. в разделе «Как использовать doctl .
  • kubectl установленный на вашем компьютере, который вы можете настроить с помощью документации по установке Kubernetes.
  • На вашем компьютере установлен Docker, который вы можете настроить, выполнив шаги 1 и 2 нашего руководства по установке и использованию Docker.
  • Пример приложения Node.js, настроенный в соответствии с руководством «Как создать приложение Node.js с помощью Docker» для создания приложения и отправки его образа контейнера в Docker Hub.
  • Учетная запись в Docker Hub для хранения образов Docker, которую вы создадите в ходе этого руководства.

Шаг 1 — Запуск кластера DigitalOcean Kubernetes

Поскольку Knative — это платформа на базе Kubernetes, вы будете использовать ее с кластером Kubernetes в DigitalOcean. Существует несколько способов запустить кластер Kubernetes в DigitalOcean. Вы можете использовать интерфейс DigitalOcean Cloud, интерфейс командной строки DigitalOcean или поставщика Terraform.

В этом руководстве вы будете использовать doctl , клиент командной строки DigitalOcean, для запуска кластера Kubernetes. Если вы еще не установили doctl , следуйте инструкциям в официальном руководстве по установке.

Чтобы эффективно использовать Knative в этом руководстве, вам понадобится кластер Kubernetes как минимум с 4GB RAM и 2 CPU cores . Вы можете запустить кластер с именем knative-tutorial с этими спецификациями, выполнив команду doctl со следующими флагами:

  • --size указывает размер удаленного сервера.
  • --count указывает количество узлов, которые будут созданы как часть кластера.

Чтобы создать кластер DigitalOcean Kubernetes, выполните следующую команду:

С помощью этой команды вы создаете кластер с именем knative-tutorial с size 4 ГБ ОЗУ, 2 ядрами ЦП и count узлов 3 .

Note: Вы также можете использовать флаг --region , чтобы указать, в каком регионе будет расположен сервер, хотя в этом руководстве этот параметр не используется. Если вы используете удаленный сервер, например Droplet, возможно, вы захотите разместить свой кластер в том же регионе, что и сервер. Если вы используете панель управления DigitalOcean для создания кластера, вы можете выбрать регион центра обработки данных и сеть VPC. Для получения дополнительной информации о региональной доступности DigitalOcean вы можете обратиться к нашей Матрице региональной доступности.

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

Теперь кластер готов к использованию.

Теперь вы можете проверить, настроен ли kubectl в вашей системе и может ли он получить доступ к кластеру DigitalOcean Kubernetes, с помощью следующей команды:

Вы должны получить аналогичный вывод:

Поскольку в выводе перечислены URL-адреса control plane и службы CoreDNS (выделены в блоке вывода), вы знаете, что kubectl правильно настроен в вашей системе и может связаться с кластером.

В рамках процесса создания кластера doctl автоматически настраивает контекст kubectl для использования нового кластера. Вы можете убедиться в этом, выполнив следующую команду:

Эта команда вернет имя текущего контекста.

Вы должны получить следующий вывод:

Вывод указывает, что текущий контекст — do-nyc1-knative-tutorial , который представляет собой имя созданного вами кластера с указанием региона, в котором он расположен ( nyc1 ).

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

Команда kubectl get nodes выводит список всех узлов в кластере, а также их статус и другую информацию.

Вы должны получить следующий вывод:

В выходных данных указано, что в кластере есть три узла, готовых принимать рабочие нагрузки.

На этом этапе вы запустили кластер Kubernetes в DigitalOcean. Теперь вы можете установить Knative для развертывания бессерверной рабочей нагрузки в Kubernetes.

Шаг 2 — Установка Knative Serving

На этом этапе вы установите Knative Serving в свой кластер Kubernetes. Knative Serving отвечает за развертывание и управление вашими бессерверными рабочими нагрузками.

Чтобы установить Knative Serving, вам потребуются основные компоненты Knative и специальные ресурсы. Запустите эти команды, чтобы установить основные компоненты:

Команда kubectl apply устанавливает основные компоненты Knative и пользовательские ресурсы в ваш кластер. Флаг -f указывает файл, содержащий изменения конфигурации. В этом случае изменения конфигурации находятся в файлах YAML, которые вы загружаете из репозитория Knative.

Выполнение этих команд займет несколько минут. Вы получите следующий вывод (вывод ниже сокращен для краткости):

Этот вывод указывает на то, что основные компоненты Knative и пользовательские ресурсы находятся в вашем кластере. Все компоненты находятся в пространстве имен knative-serving .

После завершения загрузки вы можете убедиться, что Knative Serving установлен:

Команда kubectl get pods получит список всех модулей, запущенных в кластере в пространстве имен knative-serving . Эта команда определяет модули в вашем кластере, их текущий статус, количество контейнеров в модуле и имена контейнеров в определенном пространстве имен.

Вы должны получить аналогичный вывод:

В выводе отображаются все модули, работающие в пространстве имен knative-serving . Модули отвечают за различные компоненты Knative Serving.

Knative требует сетевого уровня для маршрутизации входящего трафика к вашим сервисам. Сетевой уровень в Knative позволяет развертывать и обмениваться микросервисами в распределенной среде. Knative Serving поддерживает Istio, Contour и Kourier в качестве сетевого уровня.

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

Установите Kourier с помощью этой команды:

Вы должны получить следующий вывод:

В выходных данных перечислены все ресурсы, такие как Namespaces и ConfigMaps , созданные в рамках процесса установки Kourier в кластере Kubernetes.

Чтобы настроить Knative для использования Kourier в качестве сетевого уровня, вы отредактируете ConfigMap config-network .

Для этого вам нужно использовать команду kubectl patch для обновления полей объекта в кластере Kubernetes. Вам также придется включить некоторые флаги в эту команду:

  • --namespace указывает, где вы можете найти объект, который хотите исправить.
  • --type указывает, какой патч выполнять при применении конфигураций с помощью команды patch . Доступные типы: json , merge и strategic .
  • --patch указывает данные исправления непосредственно в командной строке, а не в файле.

Запустите эту команду со связанными флагами:

Команда kubectl patch исправляет configmap/config-network , присваивая namespace knative-serving и type merge .

Тип исправления merge позволяет выполнять более целевые обновления, тогда как типы исправлений json или strategic обновления позволяют выполнять более комплексные обновления. Тип исправления merge указывает отдельные поля для обновления без включения всей конфигурации ресурса в команду исправления, как в случае с другими типами. Исправляемые данные идентифицируются флагом patch .

Вы должны получить следующий вывод:

Вывод этой команды гарантирует, что Kourier правильно настроен в кластере.

Наконец, получите внешний IP-адрес балансировщика нагрузки Kourier с помощью следующей команды:

Команда kubectl get svc получает информацию о сервисах, запущенных в кластере Kubernetes в указанном пространстве имен (в данном случае kourier-system ). Эта команда выведет список всех служб в кластере с указанием связанных с ними IP-адресов и номеров портов.

Вы должны получить следующий вывод:

Вывод команды включает имя службы, тип службы (например, ClusterIP , NodePort и т. д.), IP-адрес кластера и номер порта, а также внешний IP-адрес и номер порта. Числа, перечисленные здесь, являются примерами, поэтому в результатах будут отображаться разные числа.

Подготовка балансировщика нагрузки может занять несколько минут. Вы можете увидеть пустое значение или для поля EXTERNAL-IP . В этом случае подождите несколько минут и повторите команду.

Note: Прежде чем продолжить работу с этим руководством, вам потребуется подготовить балансировщик нагрузки. После заполнения поля EXTERNAL-IP для LoadBalancer вы можете продолжить. В противном случае у вас могут возникнуть проблемы при настройке службы DNS.

Вы также можете настроить DNS для вашего доменного имени, чтобы он указывал на внешний IP-адрес балансировщика нагрузки. Knative предоставляет задание Kubernetes под названием default-domain , которое автоматически настраивает Knative Serving для использования sslip.io в качестве DNS-суффикса по умолчанию.

sslip.io — это служба динамического DNS (системы доменных имен), которая позволяет пользователям получать доступ к своим устройствам, используя собственное доменное имя вместо IP-адреса. Использование sslip.io улучшает удаленный доступ пользователей к своим устройствам без необходимости запоминать сложные IP-адреса.

Чтобы настроить DNS-суффикс по умолчанию, вам необходимо выполнить следующую команду:

Вы получите следующий результат:

Ресурсы, необходимые для запуска службы Magic DNS, успешно настроены.

Note: При желании вы также можете добавить домен, но это выходит за рамки данной статьи. Вам необходимо настроить поставщика DNS (например, Cloud DNS или Route53) и создать запись A для входного шлюза Knative, которая сопоставлена с IP-адресом вашего кластера Knative. Затем вы обновите конфигурацию входного шлюза Knative, чтобы использовать зону DNS и созданную вами запись A. Вы можете проверить конфигурацию DNS, получив доступ к обслуживающему домену Knative и убедившись, что он разрешается во входной шлюз.

Теперь вы успешно установили Knative Serving в свой кластер Kubernetes. Теперь вы можете развернуть бессерверную рабочую нагрузку с помощью Knative Serving в своем кластере Kubernetes.

Шаг 3. Развертывание бессерверной рабочей нагрузки

На этом этапе вы развернете бессерверную рабочую нагрузку поверх Knative, который в настоящее время работает в вашем кластере Kubernetes. Вы будете использовать приложение Node.js, которое вы создали в рамках предварительных условий.

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

Эта команда создаст новое пространство имен под названием serverless-workload .

Вы должны получить следующий вывод:

Вывод гарантирует, что пространство имен было успешно создано.

Knative Serving использует специальный ресурс под названием Service для развертывания и управления бессерверными рабочими нагрузками. Ресурс Service определяется Knative Serving API.

Как только вы создадите или измените ресурс Service , Knative Serving автоматически создаст новую Revision . Revision — это моментальный снимок вашей рабочей нагрузки на определенный момент времени.

Всякий раз, когда создается новая Revision , трафик будет направляться к новой Revision по Route . Knative Serving автоматически создает Route для каждой службы. Вы можете получить доступ к своей рабочей нагрузке, используя доменное имя из Route .

Чтобы развернуть бессерверную рабочую нагрузку на Knative, необходимо создать ресурс Service . Вы можете добиться этого двумя разными способами:

  • Используя kn , официальный инструмент Knative CLI.
  • Использование инструмента командной строки kubectl для применения файлов YAML к вашему кластеру Kubernetes.

В следующих подразделах вы будете использовать каждый из этих методов.

Вариант 1 — Использование Knative CLI

Knative CLI, kn , представляет собой интерфейс командной строки, позволяющий взаимодействовать с Knative.

Сначала установите kn , загрузив последнюю версию двоичного файла Knative CLI:

Команда wget получит инструмент.

Затем переместите двоичный файл в папку kn :

Затем сделайте его исполняемым с помощью следующей команды:

Наконец, переместите исполняемый двоичный файл в каталог по вашему PATH :

Убедитесь, что kn установлен:

Вы должны получить аналогичный вывод:

В выводе этой команды указано, что kn установлен.

Чтобы развернуть приложение Node.js с помощью kn , вы будете использовать команду kn service create . С помощью этой команды вы добавите несколько флагов:

  • --image указывает образ контейнера, который вы хотите развернуть.
  • --port указывает порт, который прослушивает ваше приложение.
  • --name указывает имя Service , которую вы хотите создать.
  • --namespace указывает пространство имен, в котором вы хотите развернуть рабочую нагрузку.

Чтобы развернуть приложение Node.js, выполните следующую команду и обновите выделенную часть своим именем пользователя DockerHub:

Команда kn service создает Knative Service с именем node-service с port , установленным на 8080 , и флагом namespace , установленным на serverless-workload . Флаг image указывает расположение контейнера приложения, загруженного в Dockerhub.

Вы должны получить следующий вывод:

Эти выходные данные предоставляют статус создания Service Knative. После создания Service вы найдете URL-адрес Route , связанного с Service .

Выполните следующую команду, чтобы убедиться, что ресурс Service создан:

Команда kn service list перечисляет все службы, развернутые в настоящее время с помощью Knative Serving в определенном пространстве имен в кластере Kubernetes. Эта команда позволяет вам получить доступ к сведениям о каждой службе, включая ее имя, статус и URL-адрес.

Вы должны получить аналогичный вывод:

Из этих выходных данных вы можете убедиться, что новая Service Knative была создана командой kn service , которую вы выполнили ранее. Вы также найдете URL-адрес Route , Age и Status службы.

В этом разделе вы установили Knative CLI и использовали его для развертывания бессерверной рабочей нагрузки для вашего приложения Node.js.

Вариант 2. Создание ресурса службы с использованием файлов YAML.

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

Сначала вы создадите подкаталог в каталоге, содержащем ваш Dockerfile . В этом руководстве для подкаталога используется имя knative . Создайте папку:

Далее вы создадите файл YAML с именем service.yaml в каталоге knative :

Во вновь созданный файл service.yaml добавьте следующие строки, чтобы определить Service , которая будет развертывать ваше приложение Node.js:

~/node_project/knative/service.yaml

YAML-файл Knative Service содержит следующую информацию:

  • name в первом разделе metadata указывает name ресурса Service .
  • namespace указывает namespace , в котором вы хотите развернуть рабочую нагрузку.
  • name в первом разделе spec указывает name Revision .
  • image во втором разделе spec указывает image контейнера, который вы хотите развернуть.
  • containerPort указывает port прослушивает ваше приложение.

Обязательно обновите выделенный текст информацией, которую вы выбрали для своего приложения и системы, а также своим именем пользователя DockerHub.

Сохраните и закройте файл.

Теперь вы можете развернуть ресурс Service , выполнив следующую команду:

Вы должны получить следующий вывод:

Вывод показывает, что ресурс Service был успешно создан.

Выполните следующую команду, чтобы убедиться, что ресурс Service создан:

Команда kn service list перечисляет все службы, развернутые в настоящее время с помощью Knative Serving в определенном пространстве имен. Эта команда позволяет вам получить доступ к подробной информации о каждой услуге.

Вы должны получить следующий вывод:

Вы можете убедиться, что новая Service Knative была создана на основе YAML-файла Knative Service, который вы выполнили ранее. В этом разделе вы создали node-yaml-service . Вы также можете найти URL-адрес Knative Route .

В этом разделе вы использовали файл YAML для создания бессерверной рабочей нагрузки для вашего приложения Node.js.

На этом этапе вы создали ресурс Knative Service , используя инструмент kn CLI и файл YAML. Далее вы получите доступ к рабочей нагрузке приложения, которое вы развернули с помощью Knative.

Шаг 4. Доступ к рабочей нагрузке приложения

Теперь, когда вы развернули бессерверную рабочую нагрузку, вы можете получить к ней доступ с помощью URL-адреса из Knative Route , созданного как часть бессерверной рабочей нагрузки. Knative Route определяет, как входящий HTTP-трафик должен направляться к определенной службе или приложению.

Чтобы получить список всех маршрутов Knative, выполните следующую команду:

Команда kn route list перечисляет все маршруты Knative в определенном пространстве имен в кластере Kubernetes.

Вы должны получить аналогичный вывод:

Вы будете использовать URL-адреса, сгенерированные для Knative Routes, чтобы убедиться, что все работает должным образом.

Откройте любой из URL-адресов в браузере. Когда вы заходите на сайт в браузере, загружается целевая страница вашего приложения Node:

Снимок экрана приложения Node.js, развернутого с помощью Knative Бессерверная рабочая нагрузка

Вы успешно развернули бессерверную рабочую нагрузку с помощью Knative в своем кластере Kubernetes.

Заключение

В этом руководстве вы развернули бессерверную рабочую нагрузку с помощью Knative. Вы создали ресурс Knative Service с помощью инструмента kn CLI и файлов YAML. Этот ресурс развернул приложение Node.js в вашем кластере Kubernetes, к которому вы получили доступ с помощью URL-адреса Route .

Дополнительные сведения о функциях, предлагаемых Knative, таких как автоматическое масштабирование модулей, постепенное внедрение трафика в версию и компонент Eventing, см. в официальной документации Knative.

Чтобы продолжить сборку с помощью DigitalOcean Kubernetes (DOKS), обратитесь к нашей документации Kubernetes How-To. Вы также можете узнать больше о DOKS, например о функциях и доступности. Для устранения неполадок DOKS вы можете обратиться к нашим руководствам по поддержке Kubernetes.

Продолжайте разработку с помощью управляемого DockerHosting.

Инженер-программист

Технический редактор