
V tem članku bom nastavil delovno okolje za razvoj igre 'Bajke' ter razdelil samo igro na dele, primerne za uporabo v OpenFaaS. Vse manipulacije bom izvajal na Linuxu, Kubernetes bom razvil v minikube z uporabo VirtualBoxa. Na mojem delovnem računalniku sta 2 procesorski jedri in 12 GB RAM-a, kot sistemsko napravo uporabljam SSD. Kot glavni sistem za razvoj bom uporabljal debian 8, z nameščenimi paketi emacs, sudo, git in virtualbox, vse ostalo pa bom namestil z nalaganjem iz GitHub-a in drugih virov. Te aplikacije bomo namestili v /usr/local/bin, razen če ni navedeno drugače. Začnimo!
Priprava delovnega okolja
Namestitev Go
Sledite navodilom z uradne strani:
$ curl -L0 https://dl.google.com/go/go1.13.5.linux-amd64.tar.gz -o go.tar.gz
$ sudo tar -C /usr/local -xzf go.tar.gz
$ echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.profilePreverimo delovanje:
$ mkdir -p ~/go/src/hello && cd ~/go/src/hello
$ echo 'package main
import "fmt"
func main() {
fmt.Printf("hello, worldn")
}' > hello.go
$ go build
$ ./hello
hello, worldNamestitev faas-cli
Sledite navodilom z uradne strani:
$ curl -sSL https://cli.openfaas.com | sudo -E sh
x86_64
Prenos paketa https://github.com/openfaas/faas-cli/releases/download/0.11.3/faas-cli na /tmp/faas-cli
Prenos končan.
Izvaja se z dovolj dovoljenji, da poskusi premakniti faas-cli v /usr/local/bin
Nova različica faas-cli nameščena v /usr/local/bin
Ustvarjanje psevdonima 'faas' za 'faas-cli'.
___ _____ ____
/ _ _ __ ___ _ __ | ___|_ _ __ _/ ___|
| | | | '_ / _ '_ | |_ / _` |/ _` ___
| |_| | |_) | __/ | | | _| (_| | (_| |___) |
___/| .__/ ___|_| |_|_| __,_|__,_|____/
|_|
CLI:
commit: 73004c23e5a4d3fdb7352f953247473477477a64
različica: 0.11.3Dodatno lahko omogočite delo bash-completion:
faas-cli completion --shell bash | sudo tee /etc/bash_completion.d/faas-cliNamestitev in nastavitev Kubernetes
Za razvoj je dovolj minikube, zato ga bomo namestili skupaj s kubelet v /usr/local/bin, za namestitev aplikacij bomo prav tako namestili helm:
$ curl https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 -o minikube && chmod +x minikube && sudo mv minikube /usr/local/bin/
$ curl https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl -o kubectl && chmod +x kubectl && sudo mv kubectl /usr/local/bin/
$ curl https://get.helm.sh/helm-v3.0.2-linux-amd64.tar.gz | tar -xzvf - linux-amd64/helm --strip-components=1; sudo mv helm /usr/local/binZagnemo minikube:
$ minikube start
minikube v1.6.2 na Debian 8.11
Samodejno izbran 'virtualbox' gonilnik (alternativa: [])
Prenos slike za zagon VM ...
> minikube-v1.6.0.iso.sha256: 65 B / 65 B [--------------] 100.00% ? p/s 0s
> minikube-v1.6.0.iso: 150.93 MiB / 150.93 MiB [-] 100.00% 5.67 MiB p/s 27s
Ustvarjanje virtualbox VM (CPU=2, Pomnilnik=8192MB, Disk=20000MB) ...
Priprava Kubernetes v1.17.0 na Docker '19.03.5' ...
Prenos kubeadm v1.17.0
Prenos kubelet v1.17.0
Pridobivanje slik ...
Zagon Kubernetes ... Čakanje, da bo klaster na spletu ...
Končano! kubectl je zdaj konfiguriran za uporabo "minikube"Preverimo:
$ kubectl get pods --all-namespaces
IMENSKO PROSTOR IME PRIPRAVLEN STATUS ZNOVA STAROST
kube-system coredns-6955765f44-knlcb 1/1 Deluje 0 29m
kube-system coredns-6955765f44-t9cpn 1/1 Deluje 0 29m
kube-system etcd-minikube 1/1 Deluje 0 28m
kube-system kube-addon-manager-minikube 1/1 Deluje 0 28m
kube-system kube-apiserver-minikube 1/1 Deluje 0 28m
kube-system kube-controller-manager-minikube 1/1 Deluje 0 28m
kube-system kube-proxy-hv2wc 1/1 Deluje 0 29m
kube-system kube-scheduler-minikube 1/1 Deluje 0 28m
kube-system storage-provisioner 1/1 Deluje 1 29mNamestitev OpenFaaS
Razvijalci priporočajo ustvariti 2 imenska prostora za delo:
$ kubectl apply -f https://raw.githubusercontent.com/openfaas/faas-netes/master/namespaces.yml
namespace/openfaas ustvarjen
namespace/openfaas-fn ustvarjenDodajamo repozitorij za helm:
$ helm repo add openfaas https://openfaas.github.io/faas-netes/
"openfaas" je bil dodan v vaše repozitorijeV chartu je mogoče nastaviti geslo pred namestitvijo, izkoristimo to in shranimo podatke za dostop v obliki skrivnosti k8s:
$ PASSWORD=verysecurerandompasswordstring
$ kubectl -n openfaas create secret generic basic-auth --from-literal=basic-auth-user=admin --from-literal=basic-auth-password="$PASSWORD"
secret/basic-auth ustvarjenIzvajamo namestitev:
$ helm repo update
Samo trenutek, medtem ko pridobivamo najnovejše iz vaših repozitorijev s charti...
...Uspešno smo dobili posodobitev iz repozitorija "openfaas"
Posodobitev zaključena. Veselo Helming!
$ helm upgrade openfaas --install openfaas/openfaas --namespace openfaas --set functionNamespace=openfaas-fn --set generateBasicAuth=false
Izdaja "openfaas" ne obstaja. Namestitev zdaj.
IME: openfaas
ZADNJA NAMESTITEV: Pet Dec 25 10:28:22 2019
IMENSKO PROSTOR: openfaas
STATUS: nameščen
REVIZIJA: 1
TESTNA ENOTA: Ni
OPOMBE:
Da preverite, da se je openfaas zagnal, zaženite:
kubectl -n openfaas get deployments -l "release=openfaas, app=openfaas"Po nekaj trenutnem zagonu zaženite predlagano ukaz:
$ kubectl -n openfaas get deployments -l "release=openfaas, app=openfaas"
IME PRIPRAVLEN DO-DATUM NA VOLJO STAROST
alertmanager 1/1 1 1 114s
basic-auth-plugin 1/1 1 1 114s
faas-idler 1/1 1 1 114s
gateway 1/1 1 1 114s
nats 1/1 1 1 114s
prometheus 1/1 1 1 114s
queue-worker 1/1 1 1 114sPreverimo delovanje:
$ kubectl rollout status -n openfaas deploy/gateway
deployment "gateway" успешно развернут
$ kubectl port-forward -n openfaas svc/gateway 8080:8080 &
[1] 6985
Перенаправление с 127.0.0.1:8080 -> 8080
$ echo -n $PASSWORD | faas-cli login --username admin --password-stdin
Обращение к серверу OpenFaaS для проверки учетных данных...
Обработка соединения для 8080
ПРЕДУПРЕЖДЕНИЕ! Связь не защищена, пожалуйста, рассмотрите возможность использования HTTPS. Letsencrypt.org предлагает бесплатные SSL/TLS сертификаты.
учетные данные сохранены для admin http://127.0.0.1:8080
$ faas-cli list
Функция Вызовы РепликиУстановка MongoDB
Устанавливаем всё с помощью helm:
$ helm repo add stable https://kubernetes-charts.storage.googleapis.com/
"stable" был добавлен в ваши репозитории
$ helm install stable/mongodb --generate-name
ИМЯ: mongodb-1577466908
ПОСЛЕДНЕЕ РАЗВЕРТЫВАНИЕ: Пт Дек 25 11:15:11 2019
ПРОСТРАНСТВО: default
СТАТУС: развернут
РЕВИЗИЯ: 1
ТЕСТОВЫЙ НАБОР: Нет
ПРИМЕЧАНИЯ:
** Пожалуйста, будьте терпеливы, пока осуществляется развертывание чарта **
MongoDB можно будет получить через порт 27017 по следующему DNS-имени изнутри вашего кластера:
mongodb-1577466908.default.svc.cluster.local
Чтобы получить корневой пароль выполните:
export MONGODB_ROOT_PASSWORD=$(kubectl get secret --namespace default mongodb-1577466908 -o jsonpath="{.data.mongodb-root-password}" | base64 --decode)
Чтобы подключиться к вашей базе данных выполните следующую команду:
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
Чтобы подключиться к вашей базе данных из-за пределов кластера выполните следующие команды:
kubectl port-forward --namespace default svc/mongodb-1577466908 27017:27017 &
mongo --host 127.0.0.1 --authenticationDatabase admin -p $MONGODB_ROOT_PASSWORDPreverimo:
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)
Если вы не видите командную строку, попробуйте нажать Enter.
> db.version();
4.0.14Нажимаем ctrl+D для выхода из контейнера.
Настройка emacs
В принципе, все уже было настроено по , так что не буду подробно расписывать.
Разбиение игры на функции
Взаимодействие с функциями осуществляется посредством протокола http, сквозная аутентификация между различными функциями обеспечивается JWT. Для хранения токенов, а также состояния игры, данных игроков, последовательностей ходов всех игр и другой информации используется MongoDB. Давайте подробнее рассмотрим наиболее интересные функции.
Registracija
На входе этой функции — JSON с игровым псевдонимом и паролем. При вызове этой функции выполняется проверка на отсутствие этого псевдонима в базе данных, при успешной проверке — вставка псевдонима и хэша пароля в базу. Регистрация необходима для активного участия в игре.
Vhod
Na vstupu funkce je JSON s herním pseudonymem a heslem, pokud je pseudonym v databázi a bylo úspěšně ověřeno heslo, vrátí se JWT, který je třeba předat jiným funkcím při jejich volání. Také se provádí vkládání různých systémových záznamů do databáze, například čas posledního přihlášení a podobně.
Prohlížení seznamu her
Každý neautorizovaný uživatel může požádat o seznam všech her kromě aktivních. Autorizovaný uživatel také vidí seznam aktivních her. Výsledek funkce je JSON, obsahující seznamy her (identifikátor hry, čitelné jméno atd.).
Ustvarjanje igre
Funkce funguje pouze s autorizovanými uživateli, na vstupu se přijímá maximální počet hráčů a parametry hry (například, jaké postavy aktivovat v této hře, maximální počet hráčů atd.). Samostatným parametrem hry je existence hesla pro připojení, což umožňuje vytvářet neveřejné hry. Ve výchozím nastavení se vytváří veřejná hra. Výsledkem provedení funkce je JSON, který obsahuje pole úspěšnosti vytvoření, unikátní identifikátor hry a další parametry.
Připojení k hře
Funkce funguje pouze s autorizovanými uživateli, na vstupu — identifikátor hry a její heslo, pokud se jedná o neveřejnou hru, na výstupu — JSON s parametry hry. Autorizovaný uživatel, který se připojil k hře, a také její tvůrce se nazývají účastníci hry.
Prohlížení událostí hry
Každý neautorizovaný uživatel může požádat o seznam událostí neaktivních her, zatímco autorizovaný — může získat seznam událostí jakékoli aktivní hry. Dalším parametrem funkce může být předán číslo události, kterou již má uživatel. V takovém případě se v seznamu vrátí pouze ty události, které se staly později. Periodicky spouštěním této funkce autorizovaný uživatel sleduje, co se děje ve hře. Tato funkce také vrací požadavek na akci, na kterou může uživatel reagovat pomocí funkce odeslání události hry.
Odeslat událost hry
Funkcija deluje samo za udeležence igre: omogoča možnost, da zaženete igro, naredite potezo, glasujete, napišete besjedilo, ki se prikaže na seznamu dogodkov igre itd.
Avtorizirani uporabnik, ki je ustvaril igro, dodeli vloge vsem udeležencem igre, vključno s seboj, ki morajo potrditi svojo vlogo s to isto funkcijo. Ko so vse vloge potrjene, igra samodejno preide v nočni način.
Statistika igre
Funkcija deluje samo za udeležence igre, prikazuje stanje igre, seznam in število igralcev (vzdevki), vloge in njihov status (ali je bila poteza narejena ali ne), ter druge informacije. Tako kot za prejšnjo funkcijo, vse deluje samo za udeležence igre.
Periodično zagnane funkcije
Če igra ni bila zagnana v določenem času, navedenem ob ustvarjanju igre — bo samodejno odstranjena s seznama aktivnih iger s funkcijo čiščenja.
Še ena periodična naloga — prisilno preklapljanje načina igre iz nočnega v dnevni in obratno za igre, ki tega niso storile med potezo (na primer, igralec, ki se mora odzvati na dogodek igre, ni poslal svoje rešitve iz kakršnega koli razloga).
Najava
- Namestitev okolja za razvoj, razdelitev naloge na funkcije
- Delo na backendu
- Delo na frontend
- Nastavitev CICD, organizacija testiranja
- Zagon preizkusne seje igre
- Zaključki
Izvor: habr.com
