I denne artikel vil jeg sætte et arbejdsmiljø op til udvikling af spillet "Epics", og vil også bryde selve spillet op i dele, der egner sig til brug i OpenFaaS. Jeg vil udføre alle manipulationerne på Linux, jeg vil implementere Kubernetes i minikube ved hjælp af VirtualBox. Min arbejdsmaskine har 2 processorkerner og 12 GB RAM; jeg bruger en SSD som systemdisk. Jeg vil bruge debian 8 som mit primære udviklingssystem, med emacs, sudo, git og virtualbox-pakker installeret, alt andet vil blive installeret ved at downloade fra GitHub og andre kilder. Vi installerer disse programmer i /usr/local/bin, medmindre andet er angivet. Lad os komme igang!
Forberedelse af arbejdsmiljø
Installerer Go
Vi følger instruktionerne fra den officielle hjemmeside:
Udviklerne anbefaler at oprette 2 navnerum at arbejde med:
$ kubectl apply -f https://raw.githubusercontent.com/openfaas/faas-netes/master/namespaces.yml
namespace/openfaas created
namespace/openfaas-fn created
Tilføj et lager til ror:
$ helm repo add openfaas https://openfaas.github.io/faas-netes/
"openfaas" has been added to your repositories
Diagrammet har mulighed for at indstille en adgangskode før installation, lad os bruge det og gemme adgangsdataene som en k8s-hemmelighed:
$ 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
Installerer Mongodb
Vi installerer alt ved hjælp af ror:
$ 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
Vi tjekker:
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
Tryk på ctrl+D for at forlade beholderen.
Opsætning af emacs
I princippet var alt allerede konfigureret efter denne artikel, så jeg vil ikke gå i detaljer.
Opdeling af spillet i funktioner
Interaktion med funktioner udføres via http-protokollen, ende-til-ende-godkendelse mellem forskellige funktioner leveres af JWT. Mongodb bruges til at gemme tokens, såvel som spiltilstand, spillerdata, sekvenser af træk af alle spil og anden information. Lad os se nærmere på de mest interessante funktioner.
Tilmeld dig
Indgangen til denne funktion er JSON med spillets kaldenavn og adgangskode. Når denne funktion kaldes, kontrolleres det, at dette alias ikke er i databasen; hvis kontrollen lykkes, indsættes alias og password hash i databasen. Tilmelding er nødvendig for at deltage aktivt i spillet.
indgangen
Funktionsinputtet er JSON med et spilkaldenavn og adgangskode; hvis der er et kaldenavn i databasen, og adgangskoden er verificeret med den, der tidligere er gemt i databasen, returneres en JWT, som skal videregives til andre funktioner, når de er hedder. Forskellige serviceposter indsættes også i databasen, for eksempel sidste login-tidspunkt mv.
Se en liste over spil
Enhver uautoriseret bruger kan anmode om en liste over alle spil undtagen aktive. En autoriseret bruger ser også en liste over aktive spil. Resultatet af funktionen er JSON, der indeholder lister over spil (spil-id, navn, der kan læses af mennesker osv.).
Spil skabelse
Funktionen fungerer kun med autoriserede brugere; det maksimale antal spillere accepteres ved input, såvel som spilparametre (f.eks. hvilke karakterer der skal aktiveres i dette spil, det maksimale antal spillere osv.). En separat parameter i spillet er tilstedeværelsen af en adgangskode til at deltage, som giver dig mulighed for at oprette ikke-offentlige spil. Som standard oprettes et offentligt spil. Resultatet af funktionen er JSON, som indeholder et succesfelt for oprettelse, en unik spilidentifikator og andre parametre.
Deltager i et spil
Funktionen fungerer kun med autoriserede brugere, input er spil-id'et og dets adgangskode, hvis dette er et ikke-offentligt spil, er outputtet JSON med spilparametrene. Den autoriserede bruger, der deltog i spillet, samt skaberen af spillet, kaldes herefter spildeltagere.
Se spilbegivenheder
Enhver uautoriseret bruger kan anmode om en liste over begivenheder for inaktive spil, og en autoriseret bruger kan modtage en liste over begivenheder for ethvert aktivt spil. En yderligere parameter til funktionen kan være det hændelsesnummer, som brugeren allerede har. I dette tilfælde vil kun de hændelser, der opstod senere, blive returneret på listen. Ved periodisk at starte denne funktion, ser en autoriseret bruger, hvad der sker i spillet. Denne funktion returnerer også en handlingsanmodning, som brugeren kan svare på ved hjælp af spillets hændelsesafsendelsesfunktion.
Sender en spilbegivenhed
Funktionen fungerer kun for spildeltagere: det er muligt at starte spillet, foretage et træk, stemme, skrive en tekstbesked, der vises på listen over spilbegivenheder osv.
Den autoriserede bruger, der har oprettet spillet, begynder at distribuere roller til alle deltagere i spillet, inklusive dem selv, de skal bekræfte deres rolle ved hjælp af den samme funktion. Når alle roller er bekræftet, skifter spillet automatisk til nattilstand.
Spilstatistikker
Funktionen virker kun for spildeltagere; den viser spillets tilstand, listen og antallet af spillere (kaldenavne), roller og deres status (flyttet eller ej) samt anden information. Som med den tidligere funktion fungerer alt kun for spildeltagere.
Periodisk lancerede funktioner
Hvis spillet ikke har været lanceret i et stykke tid, som er angivet ved oprettelse af spillet, vil det automatisk blive fjernet fra listen over aktive spil ved hjælp af clear-funktionen.
En anden periodisk opgave er tvungen skift af spiltilstanden fra nat til dag og tilbage for spil, hvor dette ikke skete i løbet af turen (f.eks. sendte en spiller, der skal reagere på en spilbegivenhed, ikke sin løsning af en eller anden grund ).