Русский
Русский
English
Статистика
Реклама

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

Автор нашей новой переводной статьи утверждает, что 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=10Creating 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 podNo resources found in default namespace.


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

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

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

$ kubectl get podNAME                                               READY   STATUS    RESTARTS   AGEhelloworld-go-zglmv-1-deployment-6d4b7fb4f-ctz86   2/2     Running   0          50s


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

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

$ kubectl get pod -wNAME                                               READY   STATUS    RESTARTS   AGEhelloworld-go-zglmv-1-deployment-6d4b7fb4f-d9ks6   2/2     Running   0          7shelloworld-go-zglmv-1-deployment-6d4b7fb4f-d9ks6   2/2     Terminating   0          67shelloworld-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.3187Total data:   159822 bytes  Size/request: 13 bytesResponse 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 secsDetails (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 secsStatus code distribution:  [200] 12294 responses


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

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


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

Заключение


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

Спасибо, что прочитали мою статью! Надеюсь, она вам понравилась.
Источник: habr.com
К списку статей
Опубликовано: 29.12.2020 20:14:34
0

Сейчас читают

Комментариев (0)
Имя
Электронная почта

Блог компании timeweb

Devops

Kubernetes

Knative

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru