Глава 5. Применение Funktion для приложений без серверов

Прежде чем мы перейдём к запуску кластера Kubernetes в общедоступных облачных решениях, мы собираемся взглянуть на ещё один локальный образец; на это раз мы намереваемся взглянуть на Funktion. Мы собираемся рассмотреть следующие предметы:

  • Введение в Funktion

  • Установку и настройку Funktion

  • Исполнение нашей первой функции с помощью Funktion

  • Поток Twitter

Прежде чем мы пройдём сквозь установку Funktion, нам следует потратить мгновение на обсуждение того что он делает, поскольку он слегка отличается от прочих инфраструктур, рассматриваемых в данной книге.

Введение в Funktion

Подзаголовок Funktion описывает его как основанное на событиях Lambda программирование для Kubernetes. На первый взгляд, Funktion кажется достаточно схожим с Kubeless и другой инфраструктурой, Serverless, которые мы обсуждали в предыдущих главах. Однако, он имеет свой собственный наворот, который отличает его от прочих рассматриваемых нами инфраструктур.

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

  • HTTP: Именно здесь данные передаются в нашу инфраструктуру с применением стандартного запроса HTTP; обычно все данные будут отправляться как некий объект JSON

  • Подписка (Subscription): Здесь наша инфраструктура ожидает тем в некотором потоке событий, например, Kubeless применяет Apache Kafka (https://kafka.apache.org/)

Funktion расширяет имеющееся число типов событий - на самом дел он поддерживает около 200 различных типов событий. Это существенный скачок! Он достигает этого за счёт использования Apache Camel (https://camel.apache.org/). Apache Camel является инфраструктурой с открытым исходным кодом Java, которая действует как система трубопроводов для разработчиков, которая позволяет им одновременно как заглатывать, так и публиковать данные.

Чтобы дать понять вам какую- то идею некоторых потоков событий, которые поддерживаются Apache Camel, а тем самым и Funktion, вот некоторые основные факты:

  • AWS-SNS поддержка для работы с Simple Notification Service (SNS) Amazon

  • Braintree делает возможным взаимодействие со службой платёжного шлюза Braintree

  • etcd позволяет вам кооперироваться с хранилищем значений ключей etcd

  • Facebook открывает полный API Facebook

  • GitHub позволяет вам ожидать события из GitHub

  • Kafka - как и Kubeless, вы можете подписываться на Kafka

  • Twitter даёт вам возможность ожидать хэштеги, отправки (посты) и много чего ещё

Существует ещё множество прочих, таких как LinkedIn, Slack, различные SQL и NoSQL базы данных, файловые службы, подобные S3 от AWS, Dropbox, а также Box, вот ряд названий, не исчерпывающих перечень.

Всё это делает данный выбор достаточно хорошим предложением по сравнению с прочими инфраструктурами, которые мы будем рассматривать.

Имеются различные компоненты, которые осуществляют оснастку Funktion. Для запуска у нас имеется function; это основной код са м по себе, который управляется через Kubernetes ConfigMap.

function сам по себе не слишком полезен, так как он присутствует только как данные в рамках ConfigMap. Из- за этого нам нужен runtime, развёртывание Kubernetes, которое берёт function и исполняет его при вызове. Runtimes автоматически создаются когда operator Funktion (о нём чуть похже) обнаруживает что добавлена некая новая функция.

Далее у нас имеется connector; он является представлением некоторого источника событий, таких как те которые обсуждались ранее в данном разделе - он содержит информацию об определённом типе события, его настройках (таких как полномочия API), а также параметры искомых данных.

Затем у нас следует flow; это последовательность шагов, которые могут потреблять события из connector и которая вызывает function.

Наконец, у нас есть Funktion operator. Это некий под, исполняемый в Kubernetes, который отслеживает все имеющиеся компоненты, которые составляют оснастку Funktion, такую как function, runtime, connector и flow. Он отвечает за создание служб Kubernetes, которые предоставляют функциональность Funktion.

[Замечание]Замечание

Funktion является открытым исходным кодом и реализуется в соответствии с Apache License 2.0; он был разработан fabric8, который является неким восходящим проектом платформы ПО промежуточного уровня JBoss Red Hat. fabric8 сам по себя является сосредоточенной на Java платформой микрослужб, базирующихся на Docker, Kubernetes и Jenkins. Он также достаточно хорошо работает с собственной платформой Red Hat OpenShift.

Теперь, когда мы слегка взглянули на основу того чем Funktion отличается от прочих инфраструктур, мы можем рассмотреть его установку в своём кластере Kubernetes из одного узла.

Установка и настройка Funktion

Для получения поднятым и исполняемым Funktion имеются три шага, которые нужно осуществить. Во- первых, вам нужно установить собственно командную строку. Именно в ней сваливаются команды, которые развёртывают наше оснащение Funktion и управляют им, когда мы в него войдём. После того как клиент командной строки установлен, мы можем запустить свой кластер Kubernetes из одного узла при помощи Minikube, прежде чем воспользоваться CLI Funktion для начальной загрузки нашей среды.

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

Как и большинство рассмотренных нами инфраструктур, Funktion написан на Go. Это означает, что имеются различные отдельные исполняемый файлы для наших трёх платформ.

Однако, на время написания данной книги, не имелось доступных установщиков ни для Homebrew в macOS, ни для Chocolatey под Windows 10 Professional, что означет, что мы будем делать установку вручную на всех трёх своих платформах.

Все исполняемые файлы доступны для выгрузки со страницы выпусков проекта в GitHub, которую вы можете обнаружить по ссылке https://github.com/funktionio/funktion/releases/. На момент написания текущей версией являлась 1.0.14, поэтому последующие инструкции рассматривают установку именно этой версии; если вы устанавливаете более позднюю версию, пожалуйста, измените номер версии во всех последующих командах.

Давайте начнём работу с того что мы осуществим установку на macOS.

macOS 10.13 High Sierra

Установка на macOS является простой, так как этот проект публикуется в виде не заархивированных отдельно располагающихся исполняемых файлов. Всё что нам нужно сделать, так это выгрузить правильную версию пакета и сделать её исполняемой. Для этого выполните следующие команды:


$ curl -L https://github.com/funktionio/funktion/releases/download/v1.0.14/funktion-darwin
$ chmod +x /usr/local/bin/funktion
		

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


$ funktion version
		

Версия Funktion будет возвращена следующим образом:

 

Рисунок 5-1



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


$ brew update
$ brew upgrade
		

Как бы то ни было, если вам понадобится обновить версию, вам придётся удалить текущую и загрузтить новую версию на её место.

Windows 10 Professional

Процесс установки клиента командной строки Funktion в Windows аналогичен процессу в macOS. Прежде всего откройте окно PowerShell с правами администратора выбрав Run as Administrator в меню PowerShell из своей панели задач. Когда он раскроется, вам следует убедиться что вы находитесь в папке C:\WINDOWS\system32; если это не так, выполните:


$ cd C:\WINDOWS\system32
		

Как только вы окажетесь в папке C:\WINDOWS\system32, выполните следующую команду:


$ Invoke-WebRequest -Uri https://github.com/funktionio/funktion/releases/download/v1.0.14/funktion-windows-amd64.exe -UseBasicParsing -OutFile funktion.exe
		

У вас должна появиться возможность выполнения приводимой ниже команды для проверки номера версии вашего установленного и исполняемого клиента командной строки Funktion:


$ funktion version
		

Результат версии Funktion возвратит следующее:

 

Рисунок 5-2



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

Ubuntu 17.04

Последним у нас идёт Ubuntu 17.04. Весь процеесс его установки достаточно схож с теми командами, которые мы исполняли для macOS. Однако, убедитесь что выгрузили верные исполняемые файлы и что мы применяем команду sudo в качестве разрешающей полномочия в папке /usr/local/bin, которая может слегка разниться между версиями операционных систем:


$ sudo sh -c "curl -L https://github.com/funktionio/funktion/releases/download/v1.0.14/funktion-linux-amd64 > /usr/local/bin/funktion"
$ sudo chmod +x /usr/local/bin/funktion
		

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


$ funktion version
		

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

 

Рисунок 5-3



Сейчас, когда у нас имеется установленным клиент командной строки в наших трёх операционных системах, мы можем перейти процессу развёртывания.

Запуск кластера Kubernetes из одного узла

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

Прежде чем мы запустим свой кластер Kubernetes из одного узла при помощи Minikube, мы можем убедиться нет ли у нас каких =то обновлений выполнив последующие команды. Пользователи macOS 10.13 High Sierra могут исполнить:


$ brew update
$ brew upgrade
		

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


$ brew cask outdated
		

Она представит вам перечень всех пакетов, которые могут быть обновлены. Если там перечислен Minikube, исполните такую команду:


$ brew cask reinstall minikube
		

Пользователи Windows 10 Professional могут выполнить:


$ choco upgrade all
		

Пользователям Ubuntu 17.04 понадобится проверить текущую страницу выпусков, что описано в Главе 3, Локальная установка Kubernetes, удалить старые исполняемые файлы и построить весь процесс установки применив более новый выпуск.

После того как вы проверили Minikube на обновления, вы можете запустить свой кластер, исполнив:


$ minikube start
		

Как и в Главе 3, Локальная установка Kubernetes, а также в Главе 4, Введение в функционирование Kubeless, она запустит ващ еластер Kubernetes из одного узла и настроит вашего локального клиента для взаимодействия с ним. Если вы обновили Minikube, вы также можете отметить, что выгружается и устанавливается более новая версия Kubernetes:

 

Рисунок 5-4



Раз вы обновили Minikube, вы можете убедиться что всё в рабочем состоянии, исполнив следующие команды:


$ minikube status
$ kubectl get all
$ minikube dashboard
		

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

Самораскрутка Funktion

Установка Funktion достаточно прямолинейна - на самом деле это всего одна команда:


$ funktion install platform
		

Она отобразит следующий вывод:

 

Рисунок 5-5



После одной или двух минут вы должны получить возможность исполнить:


$ kubectl get pods
$ kubectl get deployments
		

Предыдущая команда проверит состояние вашего развёртывания:

 

Рисунок 5-6



Вы должны иметь возможность обозревать Pods and Deployments в своей инструментальной панели Kubernetes:

 

Рисунок 5-7



Выполнение приводимой далее команды должно вернуть пустой список:


$ funktion get function
		

Это доказывает что ваш клиент командной строки Funktion может подключиться к вашему только что остановленному развёртыванию Funktion и взаимодействовать с ним.

Развёртывание примера функции

Теперь, когда у нас имеется поднятым и работающим Funktion, мы можем рассмотреть на реальный пример развёртывания hello world. В нашей папке /Chapter05/hello-world/src из репозитория GitHub, который поддерживает данную книгу, вы можете обнаружить файл с названием hello.js. Этот файл содержит следующий код:


module.exports = function(context, callback) {
  var name = context.request.query.name || context.request.body || "World";
  callback(200, "Hello " + name + "!!");
};
		

Исполнение следующей команды в нашей папке /Chapter05/hello-world/src создаст нашу первую функцию, применяющую приведённый выше код:


$ funktion create fn -f src/hello.js
		

Вывод должен выглядеть так:

 

Рисунок 5-8



Как вы можете видеть из данного вывода Терминала, была создана function с названием hello. Теперь, когда у нас есть function, исполним следующую команду:


$ funktion get function
		

Она должна вернуть некоторые результаты. Как вы можете увидеть из последующего вывода, мы теперь можем видеть перечисленными NAME, PODS и URL.

 

Рисунок 5-9



Мы можем выполнить команды для возвращения только URL данной function, либо открыв их в нашем браузере:


$ funktion url fn hello
$ funktion url fn hello -o
		

Вы должны обнаружить следующие результаты:

 

Рисунок 5-10



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

 

Рисунок 5-11



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


$ funktion logs function hello
		

Это выдаст поток содержимого регистрационных записей в реальном масштабе времени в окно вашего Терминала. Вы можете видеть его путём обновления своего браузера несколько раз - вы должны видеть регистрационные записи запросов к своей странице совместно с запросами проверки внутренней жизнеспособности.

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


$ funktion install connector http4 timer twitter
		

Теперь у нас есть немного установленных connector и мы можем установить flow. Наш первый поток будет применять соединитель таймера:


$ funktion create flow timer://foo?period=5000 http://hello/
		

Это создаст некий поток с названием foo, который будет исполняться каждые 5000 миллисекунд, который будет иметь целью нашу функцию с названием hello. Для получения информации о данном потоке, вы можете исполнить следующую команду:


$ funktion get flow
		

Вы должны обнаружить следующее:

 

Рисунок 5-12



Как вы можете видеть, наш поток имеет название timer-foo1; нам требуется применять это название когда мы взаимодействуем м ним. К при меру, вы можете проверить его регистрационные записи выполним такую команду:


$ funktion logs flow timer-foo1
		

Либо в инструментальной панели Kubernetes вы можете отыскать его под с названием timer-foo1 и проверить его регистрационные записи там:

 

Рисунок 5-13



Проверьте записи регистрации данной выполняемой вами функции исполнив такую команду:


$ funktion logs function hello
		

Вы должны обнаружить, что имеется некий запрос страницы, появляющийся каждые пять секунд со стороны клиента с агентом пользователя Apache-HttpClient/4.5.2. Вот его временной поток:

 

Рисунок 5-14



Для удаления этого потока просто выполните:


$ funktion delete flow timer-foo1
		

Эта команда удалит тот под, который исполняется данным соединением (connector) и ваша функция прекратит получение автоматически создаваемых запросов.

Вернувшись обратно в свою инструментальную панель Kubernetes и кликнув по Config Maps мы должны получить отображение перечня всего созданного этой Funktion. Как вы можете видеть, основная часть Funktion имеет Config Maps:

 

Рисунок 5-15



Нажатие в Config Maps по hello отобразит вам нечто, выглядящее аналогично приводимой ниже странице:

 

Рисунок 5-16



Как вы можете видеть, она содержит сам код для нашей функции, а также автоматически обнаруживается что он записан в Node.js, а также то, что он был развёрнут из папки src.

Прежде чем мы рассмотрим более совершенные примеры, имеются ещё некоторые моменты, которые мы можем найти занятными, а именно интеграцию с инструментарием Chrome Dev. Для этого выполните такую команду:


$ funktion debug fn hello
		

Она откроет в фоновом режиме некий процесс и выдаст вам URL для его помещения в Google Chrome:

 

Рисунок 5-17



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

 

Рисунок 5-18



[Предостережение]Предостережение

Все выполняемые с применением Google Chrome изменения выполняются непосредственно внутри данного пода и они не останутся в случае, если вы перезапустите этот под; их следует применять исключительно для целей проверки.

Для удаления своей функции hello нам всего лишь нужно выполнить:


$ funktion delete function hello
		

Эта команда должна оставить нам чистую установку, готовую к более изощрённым примерам.

Потоки Twitter

Так как мы установили необходимый соединитель (connector) Twitter в своём предыдущем разделе, давайте взглянем на его настройку под активную доставку неких данных. Чтобы начать её, вы можете просмотреть свои опции настройки для имеющегося соединителя, исполнив команду:


$ funktion edit connector twitter -l
		

Вы должны обнаружить в Терминале вывода нечто похожее на приводимое далее:

 

Рисунок 5-19



Как вы можете видеть, вы можете настроить посредник (proxy) наряду с предоставлением accessToken, accessTokenSecret, consumerKey и consumerSecret. Вы должны получить их в предыдущей главе. Если их нет, повторно создайте их, применив инструкции из Главы 4, Введение в функционирование Kubeless.

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

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


$ funktion edit connector twitter \
    accessToken=1213091858-REJvMEEUeSoGA0WPKp7cv8BBTyTcDeRkHBr6Wpj \
    accessTokenSecret=WopER9tbSJtUtASEz62lI8HTCvhlYBvDHcuCIof5YzyGg \
    consumerKey=aKiWFB6Q7Ck5byHTWu3zHktDF \
    consumerSecret=uFPEszch9UuIlHt6nCxar8x1DSYqhWw8VELqp3pMPB571DwnDg
		

Вы должны получить подтверждение того, что ваш соединитель был обновлён. Теперь мы имеем возможность запустить некий поток (flow), который воспользуется адаптером Twitter. Для этого выполните такую команду:


$ funktion create flow --name twitsearch "twitter://search?type=polling&keywords=kubernete
$ funktion get flows
		

Мы увидим следующее:

 

Рисунок 5-20



Когда вы запустите свой под, вы сможете проверить его регистрационные записи исполнив следующее:


$ funktion logs flow twitsearch
		

Либо просмотрев все регистрационные записи для своего пода twitsearch в основной инструментальной панели:

 

Рисунок 5-21



Как вы можете обнаружить, Camel печатает некий поток твитов, которые содержат всю работу Kubernetes. Ваше приложение может подписаться на этот поток и вы затем можете осуществлять твиты. Наконец, исполнив следующую команду, мы удалим данный поток:


$ funktion logs flow twitsearch
		

Затем вы можете удалить свою машину Minikube воспользовавшись командой minikube delete.

Выводы

В этой главе мы бросили беглый взгляд на Funktion. Мы установили клиента командной строки и затем установили его в своём кластере Kubernetes из единственного узла. После его развёртывания мы запустили некую проверочную функцию и осуществили взаимодействие с ней, прежде чем воспользовались одним из множества потоков событий для поиска твитов, содержащих Kubernetes.

Funktion всё ещё пребывает на своём начальном этапе разработки и в настоящее время имеет небольшое, но активное сообщество, вносящее вклад в проекты на страницах GitHub. По этой причине, на время написания имелось не так много примеров полноценных приложений, которые пользуются преимуществами множества имеющихся поддерживаемых Funktion потоков через Apache Camel. Я рекомендую вам следит одним глазом за Funktion, если вы планируете какие- то приложения, которые поглощают данные и затем обрабатывают их.

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