I den här artikeln kommer jag att sätta upp en arbetsmiljö för att utveckla spelet "Epics", och kommer även att dela upp själva spelet i delar som lämpar sig för användning i OpenFaaS. Jag kommer att göra alla manipulationer på Linux, jag kommer att distribuera Kubernetes i minikube med VirtualBox. Min arbetsmaskin har 2 processorkärnor och 12 GB RAM; jag använder en SSD som systemdisk. Jag kommer att använda debian 8 som mitt huvudsakliga utvecklingssystem, med emacs, sudo, git och virtualbox-paket installerade, allt annat kommer att installeras genom nedladdning från GitHub och andra källor. Vi kommer att installera dessa applikationer i /usr/local/bin om inget annat anges. Låt oss börja!
Att förbereda arbetsmiljön
Installerar Go
Vi följer instruktionerna från den officiella webbplatsen:
Utvecklarna rekommenderar att du skapar två namnområden att arbeta med:
$ kubectl apply -f https://raw.githubusercontent.com/openfaas/faas-netes/master/namespaces.yml
namespace/openfaas created
namespace/openfaas-fn created
Lägg till ett förråd för rodret:
$ helm repo add openfaas https://openfaas.github.io/faas-netes/
"openfaas" has been added to your repositories
Diagrammet har möjlighet att ställa in ett lösenord före installation, låt oss använda det och spara åtkomstdata som en k8s-hemlighet:
$ 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
Installerar Mongodb
Vi installerar allt med hjälp av rodret:
$ 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 kontrollerar:
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
Tryck på ctrl+D för att lämna behållaren.
Konfigurera emacs
I princip var allt redan konfigurerat enligt den här artikeln, så jag går inte in på detaljer.
Dela upp spelet i funktioner
Interaktion med funktioner utförs via http-protokollet, end-to-end-autentisering mellan olika funktioner tillhandahålls av JWT. Mongodb används för att lagra tokens, såväl som spelstatus, spelardata, sekvenser av drag för alla spel och annan information. Låt oss ta en närmare titt på de mest intressanta funktionerna.
Bli medlem
Ingången för denna funktion är JSON med spelets smeknamn och lösenord. När den här funktionen anropas kontrolleras det att detta alias inte finns i databasen, om kontrollen lyckas infogas alias- och lösenordshashen i databasen. Registrering krävs för att aktivt delta i spelet.
ingång
Funktionsinmatningen är JSON med ett smeknamn och lösenord för spelet; om det finns ett smeknamn i databasen och lösenordet har verifierats med det som tidigare sparats i databasen, returneras en JWT, som måste skickas till andra funktioner när de är kallad. Olika serviceposter infogas också i databasen, till exempel senaste inloggningstid osv.
Visa en lista över spel
Alla obehöriga användare kan begära en lista över alla spel utom aktiva. En auktoriserad användare ser också en lista över aktiva spel. Resultatet av funktionen är JSON som innehåller listor över spel (spel-ID, mänskligt läsbart namn, etc.).
Spelskapande
Funktionen fungerar endast med auktoriserade användare; det maximala antalet spelare accepteras vid ingången, såväl som spelparametrar (till exempel vilka tecken som ska aktiveras i detta spel, det maximala antalet spelare, etc.). En separat parameter för spelet är närvaron av ett lösenord för att gå med, vilket gör att du kan skapa icke-offentliga spel. Som standard skapas ett offentligt spel. Resultatet av funktionen är JSON, som innehåller ett framgångsfält för skapande, en unik spelidentifierare och andra parametrar.
Gå med i ett spel
Funktionen fungerar endast med auktoriserade användare, ingången är spel-ID och dess lösenord, om detta är ett icke-offentligt spel är utgången JSON med spelparametrarna. Den auktoriserade användaren som gick med i spelet, såväl som skaparen av spelet, kallas hädanefter speldeltagare.
Visa spelhändelser
Alla obehöriga användare kan begära en lista över händelser för inaktiva spel, och en auktoriserad användare kan få en lista över händelser för alla aktiva spel. En ytterligare parameter till funktionen kan vara händelsenumret som användaren redan har. I det här fallet kommer endast de händelser som inträffade senare att returneras i listan. Genom att regelbundet starta den här funktionen ser en auktoriserad användare vad som händer i spelet. Denna funktion returnerar också en åtgärdsbegäran som användaren kan svara på med hjälp av spelets händelseutskickningsfunktion.
Skickar en spelhändelse
Funktionen fungerar endast för speldeltagare: det är möjligt att starta spelet, göra ett drag, rösta, skriva ett textmeddelande som visas i listan över spelhändelser, etc.
Den auktoriserade användaren som skapade spelet börjar distribuera roller till alla deltagare i spelet, inklusive sig själva, de måste bekräfta sin roll med samma funktion. När alla roller är bekräftade växlar spelet automatiskt till nattläge.
Spelstatistik
Funktionen fungerar endast för speldeltagare, den visar spelets tillstånd, listan och antalet spelare (smeknamn), roller och deras status (flyttning gjort eller inte), samt annan information. Precis som med den tidigare funktionen fungerar allt bara för speldeltagare.
Periodiskt lanserade funktioner
Om spelet inte har startat under en viss tid som angavs när spelet skapades, kommer det automatiskt att tas bort från listan över aktiva spel med hjälp av clear-funktionen.
En annan periodisk uppgift är att tvingas byta spelläge från natt till dag och tillbaka för spel där detta inte hände under tur (till exempel, en spelare som behöver reagera på en spelhändelse skickade inte sin lösning av någon anledning ).