Go-приложение с бессерверной архитектурой на Kubernetes с Knative

Автор оригинала: Gaurav Agarwal
  • Перевод
Автор нашей новой переводной статьи утверждает, что Knative — лучшее, что только могли придумать во Вселенной! Вы согласны?

Если вы уже используете Kubernetes, то, вероятно, слышали о бессерверной архитектуре (serverless). Хотя обе платформы, Kubernetes и Knative, являются масштабируемыми, именно бессерверная архитектура делает всё возможное, чтобы предоставлять разработчикам работающий код и не беспокоить их проблемами инфраструктуры. Кроме того, такая архитектура сокращает расходы на инфраструктуру за счет виртуального масштабирования экземпляров приложения с нуля.


С другой стороны, вы можете использовать преимущества Kubernetes без ограничений, следуя традиционной модели хостинга и продвинутым методам управления трафиком. Благодаря этому, нам открываются различные возможности, например, сине-зеленый деплой (blue-green deployments) и A/B-тестирование.

Knative — это попытка взять лучшее из обоих миров! Как облачная платформа с открытым исходным кодом, Knative позволяет запускать ваши serverless-приложения на Kubernetes, реализуя все возможности последнего, а также гарантирует простоту и гибкость бессерверной архитектуры.

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

Кроме того, Knative позволяет разработчикам писать слабо связанный (loosely coupled) код со своим фреймворком обработки событий, который обеспечивает универсальную подписку, доставку и управление событиями. Это означает, что вы можете объявить возможность подключения к событиям, и ваши приложения могут подписаться на определенные потоки данных.

Возглавляемая Google, данная open-source платформа была включена в Cloud Native Computing Foundation. Это подразумевает отсутствие привязки к вендору, что в противном случае является существенным ограничением текущих облачных бессерверных решений FaaS. Вы можете запустить Knative в любом кластере Kubernetes.

Для кого Knative?


Knative помогает самым разным специалистам, у каждого из которых свои знания, опыт и обязанности.



Инженеры могут сосредоточиться на управлении кластером Kubernetes, а также на установке и обслуживании экземпляров Knative с помощью kubectl, а разработчики занимаются созданием и развертыванием приложений с использованием интерфейса Knative API.

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

Почему Knative стоит использовать?


Большинство организаций, использующих Kubernetes, имеют сложный процесс управления развертыванием и поддержанием workloads. Это приводит к тому, что разработчики обращают внимание на детали, о которых им не нужно беспокоиться. Разработчикам следует сосредоточиться на написании кода, а не думать о сборках и развертываниях.

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

Кластер Kubernetes занимает ресурсы инфраструктуры, так как требует, чтобы у всех приложений был хотя бы один запущенный контейнер. Knative управляет этим аспектом за вас и заботится об автоматическом масштабировании контейнеров в кластере с нуля. Это позволяет администраторам Kubernetes упаковать множество приложений в один кластер.

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

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

Кроме того, он довольно хорошо интегрируется с движком Eventing и упрощает задачу в проектировании несвязанных систем. Код приложения может оставаться полностью свободным от какой-либо конфигурации конечной точки, и вы можете публиковать и подписываться на события, объявляя конфигурации на уровне Kubernetes. Это значительное преимущество для сложных микросервисных приложений!

Как Knative работает?


Knative предоставляет интерфейс kn API с помощью операторов Kubernetes и CRD. Используя их, вы можете развертывать приложения с помощью командной строки. В фоновом режиме Knative создаст все необходимое в Kubernetes (развертывание, сервисы, входящие данные и т. д.) для запуска приложений, и вам не придется об этом беспокоиться.

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



Knative предоставляет конечные точки приложения с использованием собственного домена в формате [app-name].[namespace].[custom-domain].

Это помогает однозначно идентифицировать приложение. Похоже на то, как Kubernetes обрабатывает сервисы, но вам нужно создать A-записи собственного домена, чтобы указать на шлюз Istio ingress. Istio управляет всем трафиком, который проходит через ваш кластер в фоновом режиме.

Knative — это объединение множества продуктов CNCF и продуктов с открытым исходным кодом, таких как Kubernetes, Istio, Prometheus, Grafana, и движков потоковой передачи событий, таких как Kafka и Google Pub/Sub.

Установка Knative


Knative имеет разумную модульную структуру, и вы можете установить только необходимые компоненты. Knative предлагает компоненты событий, обслуживания и мониторинга. Установить их можно, применив пользовательские CRD.

Knative действительно имеет внешние зависимости и требования для каждого компонента. Например, если вы устанавливаете обслуживающий компонент, вам также необходимо установить Istio и надстройку DNS.

Установка Knative довольна сложна и достойна рассмотрения в отдельной статье. Но для демонстрации давайте начнем с установки обслуживающего компонента.

Для этого вам потребуется работающий кластер Kubernetes.

Установите Service CRD и основные обслуживающие компоненты (serving core components):

kubectl apply -f https://github.com/knative/serving/releases/download/v0.17.0/serving-crds.yaml
kubectl apply -f https://github.com/knative/serving/releases/download/v0.17.0/serving-core.yaml

Установите Istio для Knative:

curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.7.0 sh - && 

cd istio-1.7.0 && export PATH=$PWD/bin:$PATH

istioctl install --set profile=demo

kubectl label namespace knative-serving istio-injection=enabled

Подождите, пока Istio будет готов, проверив, выделил ли Kubernetes внешний IP-адрес шлюзу Istio Ingress:

kubectl -n istio-system get service istio-ingressgateway

Определите собственный домен и настройте DNS, чтобы он указывал на IP-адрес шлюза Istio ingress:

kubectl patch configmap/config-domain --namespace knative-serving --type merge  -p "{\"data\":{\"$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}').xip.io\":\"\"}}"

kubectl apply -f https://github.com/knative/net-istio/releases/download/v0.17.0/release.yaml

kubectl apply -f https://github.com/knative/serving/releases/download/v0.17.0/serving-default-domain.yaml

Установите надстройку Istio HPA:

kubectl apply -f https://github.com/knative/serving/releases/download/v0.17.0/serving-hpa.yaml

Установка Knative CLI


Установить Knative CLI просто. Необходимо загрузить последнюю версию бинарного файла Knative CLI в папку bin или указать соответствующий путь.

sudo wget https://storage.googleapis.com/knative-nightly/client/latest/kn-linux-amd64 -O /usr/local/bin/kn

sudo chmod +x /usr/local/bin/kn

kn version

Запуск приложения «Hello, World!»


А теперь давайте запустим наше первое «Hello, World!» приложение, чтобы понять, насколько просто оно разворачивается с помощью Knative.

Воспользуемся образцом приложения «Hello, World!» на Go для демонстрации. Это простой REST API, который возвращает Hello $TARGET, где $TARGET — это переменная среды, которую вы можете установить в контейнере.

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

$ kn service create helloworld-go --image gcr.io/knative-samples/helloworld-go --env TARGET="World" --annotation autoscaling.knative.dev/target=10
Creating service 'helloworld-go' in namespace 'default':
0.171s Configuration "helloworld-go" is waiting for a Revision to become ready.
  6.260s ...
  6.324s Ingress has not yet been reconciled.
  6.496s Waiting for load balancer to be ready
  6.637s Ready to serve.
Service 'helloworld-go' created to latest revision 'helloworld-go-zglmv-1' is available at URL:
http://helloworld-go.default.34.71.125.175.xip.io

kubectl get pod
No resources found in default namespace.

Запустим сервис helloworld.

$ curl http://helloworld-go.default.34.71.125.175.xip.io
Hello World!

И через некоторое время мы получаем ответ. Давайте посмотрим на поды.

$ kubectl get pod
NAME                                               READY   STATUS    RESTARTS   AGE
helloworld-go-zglmv-1-deployment-6d4b7fb4f-ctz86   2/2     Running   0          50s

Итак, как вы можете видеть, Knative развернул под в фоновом режиме за одно движение. Получается, что мы буквально масштабировали с нуля.

Если мы дадим немного времени, мы увидим, что под начинает завершаться. Давайте посмотрим, что происходит.

$ kubectl get pod -w
NAME                                               READY   STATUS    RESTARTS   AGE
helloworld-go-zglmv-1-deployment-6d4b7fb4f-d9ks6   2/2     Running   0          7s
helloworld-go-zglmv-1-deployment-6d4b7fb4f-d9ks6   2/2     Terminating   0          67s
helloworld-go-zglmv-1-deployment-6d4b7fb4f-d9ks6   1/2     Terminating   0          87s

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

Давайте пройдем еще немного дальше. Если вы посмотрите на аннотации, мы ограничили каждый под обработкой до 10 одновременных запросов. Итак, что произойдет, если мы загрузим наши функции сверх этого? Сейчас выясним!

Мы воспользуемся утилитой hey для нагрузки на приложение. Следующая команда отправляет 50 одновременных запросов к конечной точке в течение 30 секунд.

$ hey -z 30s -c 50 http://helloworld-go.default.34.121.106.103.xip.io
  Average:      0.1222 secs
  Requests/sec: 408.3187
Total data:   159822 bytes
  Size/request: 13 bytes
Response time histogram:
  0.103 [1]     |
  0.444 [12243] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  0.785 [0]     |
  1.126 [0]     |
  1.467 [0]     |
  1.807 [0]     |
  2.148 [0]     |
  2.489 [0]     |
  2.830 [0]     |
  3.171 [0]     |
  3.512 [50]    |
Latency distribution:
  10% in 0.1042 secs
  25% in 0.1048 secs
  50% in 0.1057 secs
  75% in 0.1077 secs
  90% in 0.1121 secs
  95% in 0.1192 secs
  99% in 0.1826 secs
Details (average, fastest, slowest):
  DNS+dialup:   0.0010 secs, 0.1034 secs, 3.5115 secs
  DNS-lookup:   0.0006 secs, 0.0000 secs, 0.1365 secs
  req write:    0.0000 secs, 0.0000 secs, 0.0062 secs
  resp wait:    0.1211 secs, 0.1033 secs, 3.2698 secs
  resp read:    0.0001 secs, 0.0000 secs, 0.0032 secs
Status code distribution:
  [200] 12294 responses

Теперь посмотрим на поды.

$ kubectl get pod
NAME                                                READY   STATUS    RESTARTS   AGE
helloworld-go-thmmb-1-deployment-77976785f5-6cthr   2/2     Running   0          59s
helloworld-go-thmmb-1-deployment-77976785f5-7dckg   2/2     Running   0          59s
helloworld-go-thmmb-1-deployment-77976785f5-fdvjn   0/2     Pending   0          57s
helloworld-go-thmmb-1-deployment-77976785f5-gt55v   0/2     Pending   0          58s
helloworld-go-thmmb-1-deployment-77976785f5-rwwcv   2/2     Running   0          59s
helloworld-go-thmmb-1-deployment-77976785f5-tbrr7   2/2     Running   0          58s
helloworld-go-thmmb-1-deployment-77976785f5-vtnz4   0/2     Pending   0          58s
helloworld-go-thmmb-1-deployment-77976785f5-w8pn6   2/2     Running   0          59s

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

Заключение


Knative сочетает в себе лучшие характеристики бессерверной архитектуры и возможности Kubernetes. Он постепенно движется к стандартному способу реализации FaaS. Поскольку Knative входит в CNCF и вызывает всё больший интерес среди технических специалистов, возможно, скоро мы обнаружим, что облачные провайдеры внедряют Knative в свои бессерверные продукты.

Спасибо, что прочитали мою статью! Надеюсь, она вам понравилась.
Timeweb
VDS, инфраструктура и решения для бизнеса

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

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

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