У гэтым артыкуле я буду наладжваць працоўнае асяроддзе для распрацоўкі гульні «Быліны», а таксама выканаю разбіццё самой гульні на часткі, прыдатныя для выкарыстання ў OpenFaaS. Усе маніпуляцыі буду рабіць на Linux, Kubernetes буду разгортваць у minikube з выкарыстаннем VirtualBox. У маёй працоўнай машыне 2 працэсарных ядра і 12гб аператыўнай памяці, у якасці сістэмнай кружэлкі я ўжываю SSD. У якасці асноўнай сістэмы для распрацоўкі буду выкарыстоўваць debian 8, з усталяванымі пакетамі emacs, sudo, git і virtualbox, усё астатняе ўсталюю шляхам запампоўкі з GitHub і іншых крыніц. Гэтыя прыкладанні будзем усталёўваць у /usr/local/bin, калі не паказана іншае. Прыступім!
Распрацоўнікі рэкамендуюць стварыць 2 namespace для працы:
$ kubectl apply -f https://raw.githubusercontent.com/openfaas/faas-netes/master/namespaces.yml
namespace/openfaas created
namespace/openfaas-fn created
Дадаем рэпазітар для helm:
$ helm repo add openfaas https://openfaas.github.io/faas-netes/
"openfaas" has been added to your repositories
У чарце ёсць магчымасць задаць пароль перад усталёўкай, скарыстаемся ёю і захаваем дадзеныя доступу ў выглядзе сакрэту k8s:
$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "openfaas" chart repository
Update Complete. Happy Helming!
$ helm upgrade openfaas --install openfaas/openfaas --namespace openfaas --set functionNamespace=openfaas-fn --set generateBasicAuth=false
Release "openfaas" does not exist. Installing it now.
NAME: openfaas
LAST DEPLOYED: Fri Dec 25 10:28:22 2019
NAMESPACE: openfaas
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
To verify that openfaas has started, run:
kubectl -n openfaas get deployments -l "release=openfaas, app=openfaas"
$ kubectl rollout status -n openfaas deploy/gateway
deployment "gateway" successfully rolled out
$ kubectl port-forward -n openfaas svc/gateway 8080:8080 &
[1] 6985
Forwarding from 127.0.0.1:8080 -> 8080
$ echo -n $PASSWORD | faas-cli login --username admin --password-stdin
Calling the OpenFaaS server to validate the credentials...
Handling connection for 8080
WARNING! Communication is not secure, please consider using HTTPS. Letsencrypt.org offers free SSL/TLS certificates.
credentials saved for admin http://127.0.0.1:8080
$ faas-cli list
Function Invocations Replicas
Ўстаноўка Mongodb
Ставім усё з выкарыстаннем helm:
$ helm repo add stable https://kubernetes-charts.storage.googleapis.com/
"stable" has been added to your repositories
$ helm install stable/mongodb --generate-name
NAME: mongodb-1577466908
LAST DEPLOYED: Fri Dec 25 11:15:11 2019
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
** Please be patient while the chart is being deployed **
MongoDB can be accessed via port 27017 on the following DNS name from within your cluster:
mongodb-1577466908.default.svc.cluster.local
To get the root password run:
export MONGODB_ROOT_PASSWORD=$(kubectl get secret --namespace default mongodb-1577466908 -o jsonpath="{.data.mongodb-root-password}" | base64 --decode)
To connect to your database run the following command:
kubectl run --namespace default mongodb-1577466908-client --rm --tty -i --restart='Never' --image bitnami/mongodb --command -- mongo admin --host mongodb-1577466908 --authenticationDatabase admin -u root -p $MONGODB_ROOT_PASSWORD
To connect to your database from outside the cluster execute the following commands:
kubectl port-forward --namespace default svc/mongodb-1577466908 27017:27017 &
mongo --host 127.0.0.1 --authenticationDatabase admin -p $MONGODB_ROOT_PASSWORD
правяраем:
kubectl run --namespace default mongodb-1577466908-client --rm --tty -i --restart='Never' --image bitnami/mongodb --command -- mongo admin --host mongodb-1577466908 --authenticationDatabase admin -u root -p $(kubectl get secret --namespace default mongodb-1577466908 -o jsonpath="{.data.mongodb-root-password}" | base64 --decode)
If you don't see a command prompt, try pressing enter.
> db.version();
4.0.14
Ціснем ctrl+D для выхаду з кантэйнера.
Настройка emacs
У прынцыпе, усё было ўжо настроена па гэтым артыкуле, так што не буду падрабязна распісваць.
Разбіццё гульні на функцыі
Узаемадзеянне з функцыямі ажыццяўляецца з дапамогай пратаколу http, скразная аўтэнтыфікацыя паміж рознымі функцыямі забяспечваецца JWT. Для захоўвання токенаў, а таксама станы гульні, дадзеных гульцоў, паслядоўнасцяў хадоў усіх гульняў і іншай інфармацыі выкарыстоўваецца mongodb. Давайце разгледзім падрабязней найбольш цікавыя функцыі.
Рэгістрацыя
На ўваходзе гэтай функцыі - JSON з гульнявым псеўданімам і паролем. Пры выкліку гэтай функцыі выконваецца праверка адсутнасці гэтага псеўданіма ў базе дадзеных, пры паспяховай праверцы - устаўка псеўданіма і хэша пароля ў базу. Рэгістрацыя неабходна для актыўнага ўдзелу ў гульні.
Уваход
На ўваходзе функцыі - JSON з гульнявым псеўданімам і паролем, пры наяўнасці псеўданіма ў базе і паспяховай праверцы пароля з захаваным раней у базе вяртаецца JWT, які трэба перадаваць іншым функцый пры іх выкліку. Таксама выконваецца ўстаўка ў базу розных службовых запісаў, напрыклад часу апошняга ўваходу і да т.п.
Прагляд спісу гульняў
Любы неаўтарызаваны карыстальнік можа запытаць спіс усіх гульняў, акрамя актыўных. Аўтарызаваны карыстач таксама бачыць і спіс актыўных гульняў. Вынік функцыі - JSON, які змяшчае спісы гульняў (ідэнтыфікатар гульні, чалавекачытаемае імя і да т.п.).
Стварэнне гульні
Функцыя працуе толькі з аўтарызаванымі карыстальнікамі, на ўваходзе прымаецца максімальная колькасць гульцоў, а таксама параметры гульні (напрыклад, якіх персанажаў актываваць у гэтай гульні, максімальная колькасць гульцоў і да т.п.). Асобным параметрам гульні з'яўляецца наяўнасць пароля на далучэнне, што дазваляе стварыць непублічныя гульні. Па-змаўчанні ствараецца публічная гульня. Вынікам выканання функцыі з'яўляецца JSON, у якім ёсць поле паспяховасці стварэння, унікальны ідэнтыфікатар гульні, а таксама іншыя параметры.
Далучэнне да гульні
Функцыя працуе толькі з аўтарызаванымі карыстальнікамі, на ўваходзе - ідэнтыфікатар гульні і яе пароль, калі гэта непублічная гульня, на выхадзе - JSON з параметрамі гульні. Аўтарызаваны карыстач, які далучыўся да гульні, а таксама стваральнік гульні далей клічуцца ўдзельнікамі гульні.
Прагляд падзей гульні
Любы неаўтарызаваны карыстальнік можа запытаць спіс падзей неактыўных гульняў, а аўтарызаваны - атрымаць спіс падзей і любой актыўнай гульні. Дадатковым параметрам функцыі можа перадавацца нумар падзеі, які ўжо ёсць у карыстальніка. У гэтым выпадку ў спісе вернуцца толькі тыя падзеі, якія адбыліся пазней. Перыядычна запускаючы гэтую функцыю аўтарызаваны карыстач глядзіць, што адбываецца ў гульні. Таксама гэтая функцыя вяртае запыт на дзеянне, на якое карыстач можа адрэагаваць з дапамогай функцыі адпраўкі падзеі гульні.
Адпраўка падзеі гульні
Функцыя працуе толькі для ўдзельнікаў гульні: рэалізуецца магчымасць запусціць гульню, зрабіць ход, прагаласаваць, напісаць тэкставае паведамленне, якое адлюстроўваецца ў спісе падзей гульні і да т.п.
Аўтарызаваны карыстач, які стварыў гульню, запускае раздачу роляў усім удзельнікам гульні, уключаючы сябе, яны павінны пацвердзіць сваю ролю з дапамогай гэтай жа функцыі. Як толькі ўсе ролі пацверджаны, гульня аўтаматычна пераходзіць у рэжым ночы.
Статыстыка гульні
Функцыя працуе толькі для ўдзельнікаў гульні, паказвае стан гульні, спіс і колькасць гульцоў (псеўданімы), ролі і іх статус (зроблены ход, ці не), а таксама іншую інфармацыю. Як і для папярэдняй функцыі, усё працуе толькі для ўдзельнікаў гульні.
Перыядычна якія запускаюцца функцыі
Калі гульня не была запушчана на працягу некаторага часу, указанага пры стварэнні гульні - яна будзе аўтаматычна выдалена са спісу актыўных гульняў з дапамогай функцыі зачысткі.
Яшчэ адна перыядычная задача - прымусовае пераключэнне рэжыму гульні з ночы ў дзень і назад для гульняў, у якіх гэтага не адбылося падчас ходу (напрыклад, гулец, якому трэба адрэагаваць на гульнявую падзею, не даслаў сваё рашэнне па якіх-небудзь прычынах).