5-минутная настройка OpenFunction на Minikube для запуска функций в Kubernetes
После более чем трех лет разработки Knative недавно объявил о запуске Knative 1.0, пометив его основные компоненты (Serving, Eventing) как общедоступные. Это говорит о зрелости экосистемы бессерверных платформ Kubernetes, включая OpenFaaS, OpenWhisk, Kubeless, Fn и другие. Однако все эти платформы ориентированы исключительно на обслуживание функций, упакованных в виде контейнеров, и не предоставляют полнофункциональную платформу функции как услуга (FaaS).
OpenFunction — это проект с открытым исходным кодом, поддерживаемый командой KubeSphere, впервые выпущенный в мае 2021 года. Он направлен на улучшение существующих фреймворков и предоставление комплексной платформы FaaS для создания и обслуживания управляемых событиями функций в Kubernetes. .
Компоненты OpenFunction
В настоящее время OpenFunction делится на четыре определения пользовательских ресурсов (CRD):
- Функция:управляет жизненным циклом функции путем координации с компонентами Builder и Serving.
- Builder: компилирует, создает и публикует функцию в реестре контейнеров.
- Обслуживание: запускает функции и управляет масштабированием событий.
- Домен: обеспечивает точку входа для функций
Под капотом OpenFunction используется несколько проектов с открытым исходным кодом для выполнения каждой из CRD:
- Builder использует Shipwright и Cloud Native Build Packs для компиляции и сборки функционального кода в контейнеры.
- Обслуживание поддерживает Knative и OpenFuncAsync, который представляет собой среду выполнения на основе KEDA и Dapr.
- По умолчанию домен использует nginx-ingress.
- Кроме того, для склеивания всех частей вместе используются менеджер сертификатов и конвейеры Tekton.
OpenFunction предоставляет удобный cli для установки всех компонентов, но в этой демонстрации мы будем использовать исходный сценарий установки, чтобы управлять нашей установкой и запускать некоторые примеры функций на Minikube.
Запуск миникуба
OpenFunction должен работать с любым дистрибутивом Kubernetes, но для этой демонстрации мы будем использовать Minikube. Из-за компонентов, от которых зависит OpenFunction, для работы Minikube требуется как минимум 2 ЦП и 4 ГБ:
$ minikube start –cpus 2 –memory 4096
Примечание. Убедитесь, что на миникубе работает Kubernetes 1.19 или выше
Затем нам нужно предоставить учетные данные реестра образов для компонента Builder, чтобы отправлять изображения. Я буду использовать Docker, но подойдет любой реестр образов:
$ kubectl create secret docker-registry regcred — docker-server=https://index.docker.io/v1/ — docker-username=<myUsername> — docker-password=<myPassWord>
Установка OpenFunction
Теперь мы готовы установить OpenFunction. Клонируйте репозиторий OpenFunction и проверьте скрипт hack/deploy.sh
.
Для базовой демонстрации нам просто нужны Shipwright, Knative и cert-manager в качестве предпосылок:
$ sh hack/deploy.sh --with-shipwright --with-knative --with-cert-manager
Затем установите OpenFunction:
$ kubectl create -f https://github.com/OpenFunction/OpenFunction/releases/download/v0.4.0/bundle.yaml
Дождитесь, пока диспетчер контроллера заработает и будет работоспособен:
$ kubectl get pods — namespace openfunction -w NAME READY STATUS RESTARTS AGE openfunction-controller-manager-6955498c9b-hjql7 2/2 Running 0 2m2s
Развертывание функции
Все примеры приложений размещены в разделе примеры, но в настоящее время только документы golang содержат полные инструкции. Я также использую пример с golang, но выбираю любой из поддерживаемых языков и при необходимости изменяю следующий файл YAML (openfunction.yaml):
apiVersion: core.openfunction.io/v1alpha2 kind: Function metadata: name: function-sample spec: version: "v1.0.0" image: "<your-docker-registry>/sample-go-func:latest" imageCredentials: name: regcred port: 8080 # default to 8080 build: builder: openfunction/builder:v1 env: FUNC_NAME: "HelloWorld" FUNC_TYPE: "http" srcRepo: url: "https://github.com/OpenFunction/samples.git" sourceSubPath: "latest/functions/Knative/hello-world-go" serving: runtime: "Knative" # default to Knative template: containers: - name: function imagePullPolicy: Always
Создайте функцию:
$ kubectl create -f openfunction.yaml
Проверьте создаваемые модули и проверьте эти модули на наличие журналов на случай, если вы столкнетесь с ошибками (например, с неправильными учетными данными Docker):
$ kubectl get functions.core.openfunction.io $ kubectl get servings.core.openfunction.io
Тестирование примера функции
Как только рабочая нагрузка функции будет работоспособна и запущена, мы можем предоставить службе возможность инициировать событие.
На отдельном терминале создайте туннель к нашей конечной точке minikube:
$ minikube tunnel
Получите URL-адрес нашей функции, запустив:
$ kubectl get ksvc
Нажмите на конечную точку (замените URL на вашу конечную точку):
$ curl https://serving-rjgqg-ksvc-zf8j2.default.127.0.0.1.sslip.io
И мы должны увидеть наш «Hello, World!» сообщение.
Следующие шаги
Поскольку OpenFunction реализует Knative в качестве компонента времени выполнения, все примеры Knative будут совместимы. Исходя из личного опыта, для команд, уже использующих кластер Kubernetes, бессерверные фреймворки, как правило, работают лучше всего, позволяя разработчикам быстро выполнять произвольные бизнес-функции (например, отправлять электронное письмо, когда происходит событие X, запускать задание по преобразованию данных при срабатывании веб-перехватчика). Мы рассмотрим более реалистичный бессерверный сценарий во второй части этого поста.
Больше контента на blog.devgenius.io.