Ebben a cikkben munkakörnyezetet alakítok ki az "Epics" játék fejlesztéséhez, és magát a játékot is felosztom OpenFaaS-ben használható részekre. Minden manipulációt megcsinálok Linuxon, a Kubernetes-t a minikube-ban VirtualBox segítségével telepítem. A munkagépemben 2 processzormag és 12 GB RAM van, rendszerlemezként SSD-t használok. Fő fejlesztőrendszerként a debian 8-at fogom használni, az emacs, sudo, git és virtualbox csomagokkal, minden mást GitHubról és más forrásokból letöltve telepítek. Ezeket az alkalmazásokat a /usr/local/bin könyvtárba fogjuk telepíteni, hacsak nincs másképp megadva. Kezdjük el!
A fejlesztők azt javasolják, hogy hozzon létre 2 névteret a munkához:
$ kubectl apply -f https://raw.githubusercontent.com/openfaas/faas-netes/master/namespaces.yml
namespace/openfaas created
namespace/openfaas-fn created
Adattár hozzáadása a kormányhoz:
$ helm repo add openfaas https://openfaas.github.io/faas-netes/
"openfaas" has been added to your repositories
A diagram képes jelszót beállítani a telepítés előtt, használjuk azt és mentsük el a hozzáférési adatokat k8s titkosként:
$ 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 telepítése
Sisak segítségével mindent telepítünk:
$ 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
Ellenőrizzük:
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
A tárolóból való kilépéshez nyomja meg a ctrl+D billentyűket.
Emacs beállítása
Elvileg már minden aszerint volt beállítva ezt a cikket, ezért nem részletezem.
A játék funkciókra bontása
A funkciókkal való interakció a http protokollon keresztül történik, a különböző funkciók közötti végpontok közötti hitelesítést a JWT biztosítja. A Mongodb tokenek, valamint a játék állapota, a játékos adatai, az összes játék lépéssorozata és egyéb információk tárolására szolgál. Nézzük meg közelebbről a legérdekesebb funkciókat.
Regisztráció
Ennek a funkciónak a bemenete a JSON a játék becenevével és jelszavával. A függvény meghívásakor a rendszer ellenőrzi, hogy ez az álnév nincs-e az adatbázisban; ha az ellenőrzés sikeres, az álnév és a jelszó hash bekerül az adatbázisba. A játékban való aktív részvételhez regisztráció szükséges.
Bemenet
A függvény bemenete JSON, játék becenévvel és jelszóval; ha van egy becenév az adatbázisban, és a jelszót sikeresen ellenőrizték az adatbázisban korábban elmentetttel, akkor a rendszer egy JWT-t ad vissza, amelyet át kell adni a többi funkciónak, amikor azok hívott. Különféle szolgáltatási rekordok is bekerülnek az adatbázisba, például az utolsó bejelentkezési idő stb.
Tekintse meg a játékok listáját
Bármely illetéktelen felhasználó kérheti az összes játék listáját, kivéve az aktívakat. A jogosult felhasználó az aktív játékok listáját is látja. A függvény eredménye egy JSON, amely a játékok listáit tartalmazza (játékazonosító, ember által olvasható név stb.).
Játék készítés
A funkció csak jogosult felhasználókkal működik, a bemeneten a játékosok maximális száma, valamint a játék paraméterei (például, hogy melyik karaktert kell aktiválni ebben a játékban, a játékosok maximális száma stb.) A játék külön paramétere a csatlakozáshoz szükséges jelszó megléte, amely lehetővé teszi nem nyilvános játékok létrehozását. Alapértelmezés szerint nyilvános játék jön létre. A függvény eredménye a JSON, amely egy sikeres létrehozási mezőt, egy egyedi játékazonosítót és egyéb paramétereket tartalmaz.
Csatlakozás a játékhoz
A funkció csak jogosult felhasználókkal működik, a bemenet a játék azonosítója és jelszava, ha nem publikus játékról van szó, akkor a kimenet JSON a játék paramétereivel. A játékhoz csatlakozott jogosult felhasználót, valamint a játék készítőjét a továbbiakban játékrésztvevőnek nevezzük.
Játékesemények megtekintése
Bármely jogosulatlan felhasználó kérhet eseménylistát az inaktív játékokhoz, és egy jogosult felhasználó kaphat egy eseménylistát bármely aktív játékhoz. A függvény további paramétere lehet az eseményszám, amellyel a felhasználó már rendelkezik. Ebben az esetben csak azok az események kerülnek vissza a listába, amelyek később történtek. A funkció rendszeres elindításával egy jogosult felhasználó figyeli, mi történik a játékban. Ez a funkció egy műveletkérést is visszaad, amelyre a felhasználó a játék eseményküldő funkciójával válaszolhat.
Játékesemény küldése
A funkció csak a játékban résztvevők számára működik: lehetőség van a játék elindítására, lépésre, szavazásra, szöveges üzenet írására, amely megjelenik a játékesemények listájában stb.
A játékot létrehozó jogosult felhasználó elkezdi a szerepek szétosztását a játékban részt vevő összes résztvevő számára, beleértve saját magát is, és meg kell erősítenie szerepét ugyanazzal a funkcióval. Az összes szerep megerősítése után a játék automatikusan éjszakai módba vált.
Játékstatisztika
A funkció csak a játékban résztvevők számára működik, megmutatja a játék állapotát, a játékosok listáját és számát (becenevek), szerepeket és állapotukat (mozgás megtörtént vagy sem), valamint egyéb információkat. Az előző funkcióhoz hasonlóan minden csak a játékban résztvevők számára működik.
Időnként elindított funkciók
Ha a játékot a játék létrehozásakor meghatározott ideig nem indították el, akkor a törlés funkcióval automatikusan törlődik az aktív játékok listájáról.
Egy másik időszakos feladat a játékmód kényszerített váltása éjjelről nappalira és vissza olyan játékoknál, amelyeknél ez nem történt meg a körben (például egy játékos, akinek reagálnia kell egy játékeseményre, valamiért nem küldte el a megoldást ).