
V tomto článku budu nastavovat pracovní prostředí pro vývoj hry „Bylyny“, a také rozčlením samotnou hru na části použitelné v OpenFaaS. Všechny úkony provedu na Linuxu, Kubernetes rozběhnu v minikube s použitím VirtualBoxu. Na mém pracovním stroji jsou 2 procesorové jádra a 12 GB RAM, jako systémový disk používám SSD. Jako hlavní systém pro vývoj budu používat Debian 8, s nainstalovanými balíčky emacs, sudo, git a virtualbox, ostatní software nainstaluji stažením z GitHubu a dalších zdrojů. Tyto aplikace nainstalujeme do /usr/local/bin, pokud není uvedeno jinak. Pusťme se do toho!
Příprava pracovního prostředí
Instalace Go
Postupujte podle pokynů z oficiálního webu:
$ 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' >> ~/.profileOvěříme funkčnost:
$ mkdir -p ~/go/src/hello && cd ~/go/src/hello
$ echo 'package main
import "fmt"
func main() {
fmt.Printf("hello, world\n")
}' > hello.go
$ go build
$ ./hello
hello, worldInstalace faas-cli
Postupujte podle pokynů z oficiálního webu:
$ curl -sSL https://cli.openfaas.com | sudo -E sh
x86_64
Stahování balíčku https://github.com/openfaas/faas-cli/releases/download/0.11.3/faas-cli jako /tmp/faas-cli
Stahování dokončeno.
Běh s dostatečnými oprávněními, abychom se pokusili přesunout faas-cli do /usr/local/bin
Nová verze faas-cli byla nainstalována do /usr/local/bin
Vytvoření aliasu 'faas' pro 'faas-cli'.
___ _____ ____
/ _ _ __ ___ _ __ | ___|_ _ __ _/ ___|
| | | | '_ / _ '_ | |_ / _` |/ _` ___
| |_| | |_) | __/ | | | _| (_| | (_| |___) |
___/| .__/ ___|_| |_|_| __,_|__,_|____/
|_|
CLI:
commit: 73004c23e5a4d3fdb7352f953247473477477a64
verze: 0.11.3Dále lze připojit práci s bash-completion:
faas-cli completion --shell bash | sudo tee /etc/bash_completion.d/faas-cliInstalace a konfigurace Kubernetes
Pro vývoj stačí minikube, takže ho nainstalujeme a kubelet do /usr/local/bin, pro instalaci aplikací také nainstalujeme 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/binSpouštíme minikube:
$ minikube start
minikube v1.6.2 na Debianu 8.11
Automaticky vybrán ovladač 'virtualbox' (alternativy: [])
Stahování obrazu pro zavedení 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
Vytváření virtuálního stroje virtualbox (CPU=2, Paměť=8192MB, Disk=20000MB) ...
Příprava Kubernetes v1.17.0 na Dockeru '19.03.5' ...
Stahování kubeadm v1.17.0
Stahování kubelet v1.17.0
Stahování obrazů ...
Spouštění Kubernetes ... Čekání na online cluster ...
Hotovo! kubectl je nyní nakonfigurován k použití "minikube"Kontrolujeme:
$ kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-6955765f44-knlcb 1/1 Probíhá 0 29m
kube-system coredns-6955765f44-t9cpn 1/1 Probíhá 0 29m
kube-system etcd-minikube 1/1 Probíhá 0 28m
kube-system kube-addon-manager-minikube 1/1 Probíhá 0 28m
kube-system kube-apiserver-minikube 1/1 Probíhá 0 28m
kube-system kube-controller-manager-minikube 1/1 Probíhá 0 28m
kube-system kube-proxy-hv2wc 1/1 Probíhá 0 29m
kube-system kube-scheduler-minikube 1/1 Probíhá 0 28m
kube-system storage-provisioner 1/1 Probíhá 1 29mInstalace OpenFaaS
Vývojáři doporučují vytvořit 2 namespace pro práci:
$ kubectl apply -f https://raw.githubusercontent.com/openfaas/faas-netes/master/namespaces.yml
namespace/openfaas vytvořen
namespace/openfaas-fn vytvořenPřidání repozitáře pro helm:
$ helm repo add openfaas https://openfaas.github.io/faas-netes/
"openfaas" byl přidán do vašich repozitářůV chartě je možnost zadat heslo před instalací, využijeme ji a uložíme přihlašovací údaje jako secret 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 vytvořenProvádíme nasazení:
$ helm repo update
Držte se, zatímco stahujeme nejnovější informace z vašich chart repozitářů...
...Úspěšně bylo získáno aktualizace z repozitáře chartů "openfaas"
Aktualizace dokončena. Šťastné Helming!
$ helm upgrade openfaas --install openfaas/openfaas --namespace openfaas --set functionNamespace=openfaas-fn --set generateBasicAuth=false
Release "openfaas" neexistuje. Instalace nyní.
NAME: openfaas
POSLEDNÍ NASAZENÍ: Pá Dec 25 10:28:22 2019
NAMESPACE: openfaas
STATUS: nasazeno
REVIZE: 1
TESTOVACÍ SADA: Žádná
POZNÁMKY:
Pro ověření, že openfaas byl spuštěn, spusťte:
kubectl -n openfaas get deployments -l "release=openfaas, app=openfaas"Po chvíli spouštíme navrhovaný příkaz:
$ kubectl -n openfaas get deployments -l "release=openfaas, app=openfaas"
NAME READY UP-TO-DATE AVAILABLE AGE
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 114sOvěříme funkčnost:
$ 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 ReplicasInstalace Mongodb
Instalujeme vše pomocí 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_PASSWORDKontrolujeme:
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.14Stiskněte ctrl+D pro opuštění kontejneru.
Nastavení emacs
V podstatě bylo vše již nastavena podle , takže nebudu podrobně rozepisovat.
Rozdělení hry na funkce
Interakce s funkcemi probíhá prostřednictvím protokolu http, průchozí autentizace mezi různými funkcemi je zajištěna pomocí JWT. Pro ukládání tokenů, jakož i stavu hry, dat hráčů, sekvencí tahů všech her a dalších informací se používá mongodb. Pojďme se podívat podrobněji na nejzajímavější funkce.
Registrace
Tato funkce přijímá JSON s herním pseudonymem a heslem. Při vyvolání této funkce se provádí kontrola, zda pseudonym není v databázi, po úspěšné kontrole se pseudonym a hash hesla vloží do databáze. Registrace je nezbytná pro aktivní účast ve hře.
Přihlášení
Na vstupu funkce je JSON s herním pseudonymem a heslem. Pokud je pseudonym v databázi a heslo je úspěšně ověřeno, vrátí se JWT, který je třeba předat dalším funkcím při jejich volání. Také se provádí vložení různých provozních záznamů do databáze, například času posledního přihlášení atd.
Zobrazení seznamu her
Jakýkoli 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ýsledkem funkce je JSON obsahující seznamy her (identifikátor hry, čitelné jméno atd.).
Vytvoření hry
Funkce funguje pouze pro autorizované uživatele, na vstupu přijímá maximální počet hráčů a parametry hry (například které 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 vytvořit neveřejné hry. Ve výchozím nastavení se vytváří veřejná hra. Výsledkem provedení funkce je JSON, ve kterém se nachází pole úspěšnosti vytvoření, jedinečný identifikátor hry a další parametry.
Připojení k hře
Funkce funguje pouze pro autorizované uživatele, na vstupu se nachází identifikátor hry a její heslo, pokud se jedná o neveřejnou hru, na výstupu je JSON s parametry hry. Autorizovaný uživatel, který se připojil k hře, a také tvůrce hry, jsou dále označováni jako účastníci hry.
Zobrazení událostí hry
Jakýkoli neautorizovaný uživatel může požádat o seznam událostí neaktivních her, autorizovaný uživatel pak může získat seznam událostí jakékoli aktivní hry. Dalším parametrem funkce může být číslo události, které uživatel již má. V tomto případě se v seznamu vrátí pouze ty události, které nastaly později. Periodicky spouští tuto funkci autorizovaný uživatel, aby zjistil, co se v hře děje. Tato funkce také vrací žádost o akci, na kterou může uživatel reagovat pomocí funkce odeslání události hry.
Odeslání události hry
Funkce pracuje pouze pro účastníky hry: umožňuje spustit hru, udělat tah, hlasovat, napsat textovou zprávu, která se zobrazuje v seznamu herních událostí atd.
Autorizovaný uživatel, který hru založil, zahajuje rozdělování rolí všem účastníkům hry, včetně sebe, a ti musí svou roli potvrdit pomocí této funkce. Jakmile jsou všechny role potvrzeny, hra automaticky přechází do nočního režimu.
Statistika hry
Funkce pracuje pouze pro účastníky hry, zobrazuje stav hry, seznam a počet hráčů (přezdívky), role a jejich stav (tah byl učiněn, nebo ne), a také další informace. Stejně jako u předchozí funkce, vše funguje pouze pro účastníky hry.
Pravidelně spouštěné funkce
Pokud hra nebyla spuštěna po určitou dobu, uvedenou při vytvoření hry — bude automaticky odstraněna ze seznamu aktivních her pomocí funkce úklidu.
Další pravidelný úkol — nucené přepínání režimu hry z noci na den a zpět pro hry, kde k tomu nedošlo během tahu (například hráč, který musí reagovat na herní událost, nedodal své rozhodnutí z jakýchkoli důvodů).
Oznámení
- Nastavení vývojového prostředí, rozdělení úkolu na funkce
- Práce na backendu
- Práce na frontendu
- Nastavení CICD, organizace testování
- Spuštění zkušební hry
- Závěry
Zdroj: habr.com
