
In diesem Artikel werde ich die Entwicklungsumgebung für das Spiel „Byliny“ einrichten und das Spiel selbst in Teile aufteilen, die für die Verwendung in OpenFaaS geeignet sind. Alle Manipulationen werde ich unter Linux durchführen, Kubernetes werde ich in minikube mit VirtualBox bereitstellen. Mein Arbeitsgerät hat 2 Prozessorkerne und 12 GB RAM. Als Systemlaufwerk verwende ich eine SSD. Als Hauptsystem zur Entwicklung werde ich Debian 8 verwenden, mit installierten Paketen wie Emacs, Sudo, Git und VirtualBox. Alles andere werde ich durch das Herunterladen von GitHub und anderen Quellen installieren. Diese Anwendungen werden in /usr/local/bin installiert, sofern nicht anders angegeben. Fangen wir an!
Vorbereitung der Arbeitsumgebung
Go installieren
Befolgen Sie die Anweisungen von der offiziellen Webseite:
$ 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' >> ~/.profileÜberprüfung der Funktionsfähigkeit:
$ 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, worldInstallation von faas-cli
Befolgen Sie die Anweisungen von der offiziellen Webseite:
$ curl -sSL https://cli.openfaas.com | sudo -E sh
x86_64
Herunterladen des Pakets https://github.com/openfaas/faas-cli/releases/download/0.11.3/faas-cli als /tmp/faas-cli
Download abgeschlossen.
Ausführung mit ausreichenden Berechtigungen, um zu versuchen, faas-cli nach /usr/local/bin zu verschieben
Neue Version von faas-cli in /usr/local/bin installiert
Erstellen eines Alias 'faas' für 'faas-cli'.
___ _____ ____
/ _ _ __ ___ _ __ | ___|_ _ __ _/ ___|
| | | | '_ / _ '_ | |_ / _` |/ _` ___
| |_| | |_) | __/ | | | _| (_| | (_| |___) |
___/| .__/_ ___|_| |_|_| __,_|__,_|____/
|_|
CLI:
commit: 73004c23e5a4d3fdb7352f953247473477477a64
version: 0.11.3Zusätzlich kann die Bash-Vervollständigung aktiviert werden:
faas-cli completion --shell bash | sudo tee /etc/bash_completion.d/faas-cliInstallation und Konfiguration von Kubernetes
Für die Entwicklung ist minikube ausreichend, also werden wir es und kubelet in /usr/local/bin installieren; zur Installation von Anwendungen werden wir auch helm installieren:
$ 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/binStarten Sie minikube:
$ minikube starten
minikube v1.6.2 auf Debian 8.11
Automatisch den 'virtualbox' Treiber ausgewählt (Alternativen: [])
Lade VM-Boot-Image herunter ...
> 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
Erstelle VirtualBox-VM (CPUs=2, Arbeitsspeicher=8192MB, Festplatte=20000MB) ...
Bereite Kubernetes v1.17.0 auf Docker '19.03.5' vor ...
Lade kubeadm v1.17.0 herunter
Lade kubelet v1.17.0 herunter
Ziehe Bilder ...
Starte Kubernetes ... Warte, bis der Cluster online ist ...
Fertig! kubectl ist jetzt konfiguriert, um "minikube" zu verwendenÜberprüfen:
$ kubectl pods --all-namespaces abrufen
NAMENSPACE NAME READY STATUS NEUSTARTS ALTER
kube-system coredns-6955765f44-knlcb 1/1 Ausgeführt 0 29m
kube-system coredns-6955765f44-t9cpn 1/1 Ausgeführt 0 29m
kube-system etcd-minikube 1/1 Ausgeführt 0 28m
kube-system kube-addon-manager-minikube 1/1 Ausgeführt 0 28m
kube-system kube-apiserver-minikube 1/1 Ausgeführt 0 28m
kube-system kube-controller-manager-minikube 1/1 Ausgeführt 0 28m
kube-system kube-proxy-hv2wc 1/1 Ausgeführt 0 29m
kube-system kube-scheduler-minikube 1/1 Ausgeführt 0 28m
kube-system storage-provisioner 1/1 Ausgeführt 1 29mInstallation von OpenFaaS
Die Entwickler empfehlen, 2 Namespaces für die Arbeit zu erstellen:
$ kubectl apply -f https://raw.githubusercontent.com/openfaas/faas-netes/master/namespaces.yml
namespace/openfaas erstellt
namespace/openfaas-fn erstelltFügen Sie das Repository für Helm hinzu:
$ helm repo add openfaas https://openfaas.github.io/faas-netes/
"openfaas" wurde zu Ihren Repositories hinzugefügtIm Chart besteht die Möglichkeit, ein Passwort vor der Installation festzulegen. Lassen Sie uns dies nutzen und die Zugangsdaten als k8s-Secret speichern:
$ PASSWORD=sehrsichererandompasswordstring
$ kubectl -n openfaas create secret generic basic-auth --from-literal=basic-auth-user=admin --from-literal=basic-auth-password="$PASSWORD"
secret/basic-auth erstelltWir führen das Deployment durch:
$ helm repo update
Halten Sie sich fest, während wir die neuesten Informationen von Ihren Chart-Repositories abrufen...
...Erfolgreich ein Update vom "openfaas" Chart-Repository erhalten
Update abgeschlossen. Viel Freude beim Helm!
$ helm upgrade openfaas --install openfaas/openfaas --namespace openfaas --set functionNamespace=openfaas-fn --set generateBasicAuth=false
Release "openfaas" existiert nicht. Installiere jetzt.
NAME: openfaas
LETZTES DEPLOYMENT: Fr 25. Dez 2019 10:28:22
NAMESPAce: openfaas
STATUS: bereitgestellt
REVISION: 1
TESTSUITE: Keine
HINWEISE:
Um zu überprüfen, ob OpenFaaS gestartet ist, führen Sie Folgendes aus:
kubectl -n openfaas get deployments -l "release=openfaas, app=openfaas"Nach einiger Zeit führen wir den vorgeschlagenen Befehl aus:
$ kubectl -n openfaas get deployments -l "release=openfaas, app=openfaas"
NAME READY UP-TO-DATE VERFÜGBAR ALTER
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 114sÜberprüfung der Funktionsfähigkeit:
$ kubectl rollout status -n openfaas deploy/gateway
das Deployment "gateway" wurde erfolgreich ausgerollt
$ kubectl port-forward -n openfaas svc/gateway 8080:8080 &
[1] 6985
Weiterleitung von 127.0.0.1:8080 -> 8080
$ echo -n $PASSWORD | faas-cli login --username admin --password-stdin
Aufrufen des OpenFaaS-Servers zur Validierung der Anmeldedaten...
Verbindung wird für 8080 hergestellt
WARNING! Die Kommunikation ist nicht sicher, bitte ziehen Sie in Betracht, HTTPS zu verwenden. Letsencrypt.org bietet kostenlose SSL/TLS-Zertifikate an.
Anmeldedaten für admin http://127.0.0.1:8080 gespeichert
$ faas-cli list
Funktion Aufrufe ReplikateInstallation von Mongodb
Wir installieren alles mit Helm:
$ helm repo add stable https://kubernetes-charts.storage.googleapis.com/
"stable" wurde zu Ihren Repositories hinzugefügt
$ helm install stable/mongodb --generate-name
NAME: mongodb-1577466908
LETZTE INSTALLATION: Fr 25 Dez 11:15:11 2019
NAMESPACHT: standard
STATUS: installiert
REVISION: 1
TESTSUITE: Keine
NOTIZEN:
** Bitte haben Sie Geduld, während das Chart installiert wird **
MongoDB kann über den Port 27017 unter folgendem DNS-Namen von innerhalb Ihres Clusters erreicht werden:
mongodb-1577466908.default.svc.cluster.local
Um das Root-Passwort abzurufen, führen Sie aus:
export MONGODB_ROOT_PASSWORD=$(kubectl get secret --namespace default mongodb-1577466908 -o jsonpath="{.data.mongodb-root-password}" | base64 --decode)
Um sich mit Ihrer Datenbank zu verbinden, führen Sie den folgenden Befehl aus:
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
Um sich von außerhalb des Clusters mit Ihrer Datenbank zu verbinden, führen Sie die folgenden Befehle aus:
kubectl port-forward --namespace default svc/mongodb-1577466908 27017:27017 &
mongo --host 127.0.0.1 --authenticationDatabase admin -p $MONGODB_ROOT_PASSWORDÜberprüfen:
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)
Wenn Sie keine Eingabeaufforderung sehen, versuchen Sie es mit der Enter-Taste.
> db.version();
4.0.14Drücken Sie ctrl+D, um den Container zu verlassen.
Konfiguration von Emacs
Im Grunde war alles bereits nach , eingerichtet, also werde ich nicht im Detail darauf eingehen.
Aufteilung des Spiels in Funktionen
Die Interaktion mit den Funktionen erfolgt über das HTTP-Protokoll, die durchgehende Authentifizierung zwischen verschiedenen Funktionen wird durch JWT gewährleistet. Zur Speicherung von Tokens, sowie des Spielstands, der Spielerinformationen, der Spielzüge aller Partien und anderer Informationen wird Mongodb verwendet. Lassen Sie uns die interessantesten Funktionen genauer betrachten.
Registrierung
Der Eingang dieser Funktion ist ein JSON mit dem Spiel-Pseudonym und Passwort. Bei dem Aufruf dieser Funktion wird geprüft, ob dieses Pseudonym nicht in der Datenbank vorhanden ist; nach erfolgreicher Prüfung wird das Pseudonym sowie der Passwort-Hash in die Datenbank eingefügt. Die Registrierung ist erforderlich, um aktiv am Spiel teilzunehmen.
Eingang
Bei der Eingabe der Funktion handelt es sich um JSON mit dem Spielernamen und Passwort. Wenn der Name in der Datenbank vorhanden ist und das Passwort erfolgreich überprüft wird, wird ein JWT zurückgegeben, das bei Aufrufen anderer Funktionen übergeben werden muss. Außerdem wird in die Datenbank eine Vielzahl von Verwaltungsprotokollen eingefügt, zum Beispiel die Uhrzeit des letzten Logins und ähnliches.
Spielübersicht
Jeder nicht autorisierte Benutzer kann eine Liste aller Spiele anfordern, außer den aktiven. Ein autorisierter Benutzer sieht auch die Liste der aktiven Spiele. Das Ergebnis der Funktion ist ein JSON, das die Spiel-Listen (Spiel-ID, lesbarer Name etc.) enthält.
Spielerstellung
Die Funktion funktioniert nur für autorisierte Benutzer, als Eingabe wird die maximale Anzahl von Spielern sowie die Spielparameter (z. B. welche Charaktere in diesem Spiel aktiviert werden sollen, maximale Spieleranzahl etc.) genommen. Ein separater Parameter des Spiels ist das Vorhandensein eines Passworts für den Beitritt, was ermöglicht, nicht öffentlich zugängliche Spiele zu erstellen. Standardmäßig wird ein öffentliches Spiel erstellt. Das Ergebnis der Funktion ist ein JSON, das ein erfolgreiches Erstellungsergebnis, die eindeutige Spiel-ID sowie andere Parameter enthält.
Beitritt zu einem Spiel
Die Funktion funktioniert nur für autorisierte Benutzer; als Eingabe werden die Spiel-ID und ihr Passwort entgegengenommen, falls es sich um ein nicht öffentlich zugängliches Spiel handelt. Ausgegeben wird ein JSON mit den Spielparametern. Der autorisierte Benutzer, der dem Spiel beigetreten ist, sowie der Spielemacher werden anschließend als Spielteilnehmer bezeichnet.
Spielereignisse anzeigen
Jeder nicht autorisierte Benutzer kann eine Liste der Ereignisse in inaktiven Spielen anfordern; ein autorisierter Benutzer kann die Liste der Ereignisse in jedem aktiven Spiel erhalten. Ein zusätzlicher Parameter der Funktion kann die Ereignisnummer sein, die der Benutzer bereits hat. In diesem Fall werden nur die Ereignisse zurückgegeben, die später aufgetreten sind. Durch wiederholtes Aufrufen dieser Funktion kann der autorisierte Benutzer beobachten, was im Spiel passiert. Diese Funktion gibt auch eine Anfrage zur Aktion zurück, auf die der Benutzer mit der Funktion zum Senden von Spielevents reagieren kann.
Spielevent senden
Die Funktion funktioniert nur für Spielteilnehmer: Es besteht die Möglichkeit, das Spiel zu starten, einen Zug zu machen, abzustimmen, eine Textnachricht zu schreiben, die in der Ereignisliste des Spiels angezeigt wird, usw.
Der autorisierte Benutzer, der das Spiel erstellt hat, verteilt die Rollen an alle Teilnehmer, einschließlich sich selbst; sie müssen ihre Rolle mit derselben Funktion bestätigen. Sobald alle Rollen bestätigt sind, wechselt das Spiel automatisch in die Nachtphase.
Spielstatistik
Die Funktion funktioniert nur für Spielteilnehmer, zeigt den Status des Spiels, die Liste und Anzahl der Spieler (Nicknames), Rollen und deren Status (Zug gemacht oder nicht) sowie weitere Informationen an. Wie bei der vorherigen Funktion funktioniert alles nur für Spielteilnehmer.
Periodic gestartete Funktionen
Wenn das Spiel für eine bestimmte Zeit, die bei der Erstellung des Spiels angegeben wurde, nicht gestartet wurde, wird es automatisch mit der Bereinigungsfunktion aus der Liste der aktiven Spiele entfernt.
Eine weitere regelmäßige Aufgabe besteht darin, den Spielmodus von Nacht auf Tag und zurück zu wechseln für Spiele, bei denen dies während eines Zuges nicht erfolgt ist (zum Beispiel, wenn ein Spieler, der auf ein Spielevent reagieren muss, aus irgendwelchen Gründen seine Entscheidung nicht gesendet hat).
Ankündigung
- Einrichtung der Entwicklungsumgebung, Aufteilung der Aufgabe in Funktionen
- Arbeiten am Backend
- Arbeiten am Frontend
- Einrichtung von CICD, Organisation von Tests
- Start einer Testspiel-Session
- Ergebnisse
Quelle: habr.com
