
In diesem Artikel werde ich meine Umgebung für die Entwicklung des Spiels „Byliny“ einrichten und das Spiel in Teile zerlegen, die für die Nutzung in OpenFaaS geeignet sind. Alle Schritte werden unter Linux durchgeführt, und ich werde Kubernetes mit minikube in VirtualBox installieren. Mein Arbeitsrechner verfügt über 2 Prozessorkerne und 12 GB RAM, als Systemlaufwerk verwende ich eine SSD. Für die Entwicklung setze ich auf Debian 8 mit installierten Paketen wie Emacs, sudo, git und VirtualBox. Alles andere werde ich über Downloads von GitHub und anderen Quellen installieren. Diese Anwendungen installieren wir in /usr/local/bin, sofern nichts anderes angegeben ist. Lassen Sie uns beginnen!
Einrichtung der Arbeitsumgebung
Installation von Go
Befolgen Sie die Anweisungen von der offiziellen Website:
$ 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üfen wir die 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 Website:
$ curl -sSL https://cli.openfaas.com | sudo -E sh
x86_64
Lade Paket https://github.com/openfaas/faas-cli/releases/download/0.11.3/faas-cli nach /tmp/faas-cli herunter
Download abgeschlossen.
Ausführen mit ausreichenden Berechtigungen, um faas-cli nach /usr/local/bin zu verschieben
Neue Version von faas-cli in /usr/local/bin installiert
Alias 'faas' für 'faas-cli' erstellt.
___ _____ ____
/ _ _ __ ___ _ __ | ___|_ _ __ _/ ___|
| | | | '_ / _ '_ | |_ / _` |/ _` ___
| |_| | |_) | __/ | | | _| (_| | (_| |___) |
___/| .__/ ___|_| |_|_| __,_|__,_|____/
|_|
CLI:
commit: 73004c23e5a4d3fdb7352f953247473477477a64
version: 0.11.3Zusätzlich kann die bash-completion integriert werden:
faas-cli completion --shell bash | sudo tee /etc/bash_completion.d/faas-cliInstallation und Einrichtung von Kubernetes
Für die Entwicklung reicht minikube aus, also installieren wir es und kubelet in /usr/local/bin sowie helm für die Anwendungsinstallation:
$ 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/binWir starten minikube:
$ minikube start
minikube v1.6.2 auf Debian 8.11
Automatisch den 'virtualbox'-Treiber ausgewählt (Alternativen: [])
VM-Boot-Image wird heruntergeladen ...
> 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, Speicher=8192MB, Disk=20000MB) ...
Bereite Kubernetes v1.17.0 auf Docker '19.03.5' vor ...
Lade kubeadm v1.17.0 herunter
Lade kubelet v1.17.0 herunter
Bilder werden abgerufen ...
Starte Kubernetes ... Warten auf Cluster-Aktivierung ...
Fertig! kubectl ist jetzt konfiguriert, um "minikube" zu verwendenÜberprüfen wir:
$ kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-6955765f44-knlcb 1/1 Running 0 29m
kube-system coredns-6955765f44-t9cpn 1/1 Running 0 29m
kube-system etcd-minikube 1/1 Running 0 28m
kube-system kube-addon-manager-minikube 1/1 Running 0 28m
kube-system kube-apiserver-minikube 1/1 Running 0 28m
kube-system kube-controller-manager-minikube 1/1 Running 0 28m
kube-system kube-proxy-hv2wc 1/1 Running 0 29m
kube-system kube-scheduler-minikube 1/1 Running 0 28m
kube-system storage-provisioner 1/1 Running 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 haben Sie die Möglichkeit, ein Passwort vor der Installation festzulegen. Nutzen wir diese Funktion und speichern die Zugangsdaten als k8s-Secret:
$ 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 erstelltWir führen das Deployment durch:
$ helm repo update
Bitte warten Sie, während wir die neuesten Daten von Ihren Chart-Repositories abrufen...
...Erfolgreich haben wir ein Update vom "openfaas" Chart-Repository erhalten.
Update abgeschlossen. Viel Spaß beim Helmen!
$ helm upgrade openfaas --install openfaas/openfaas --namespace openfaas --set functionNamespace=openfaas-fn --set generateBasicAuth=false
Release "openfaas" existiert nicht. Installiere es jetzt.
NAME: openfaas
LETZTE INSTALLATION: Fr 25. Dez 2019 10:28:22
NAMENSSPACE: openfaas
STATUS: bereitgestellt
REVISION: 1
TESTSUITE: Keine
HINWEISE:
Um zu überprüfen, ob openfaas gestartet wurde, führen Sie Folgendes aus:
kubectl -n openfaas get deployments -l "release=openfaas, app=openfaas"Nach einer Weile führen wir den vorgeschlagenen Befehl aus:
$ 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 114sÜberprüfen wir die Funktionsfähigkeit:
$ kubectl rollout status -n openfaas deploy/gateway
die Bereitstellung "gateway" wurde erfolgreich durchgeführt
$ 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
Aufruf des OpenFaaS-Servers zur Validierung der Anmeldeinformationen...
Verbindung wird für 8080 verarbeitet
WARNUNG! Die Kommunikation ist nicht sicher, bitte in Betracht ziehen, HTTPS zu verwenden. Letsencrypt.org bietet kostenlose SSL/TLS-Zertifikate an.
Anmeldeinformationen für admin gespeichert http://127.0.0.1:8080
$ faas-cli list
Funktion Aufrufe ReplikateInstallation von MongoDB
Installation aller Komponenten mit Helm:
$ helm repo add stable https://kubernetes-charts.storage.googleapis.com/
"stable" wurde erfolgreich zu Ihren Repositories hinzugefügt
$ helm install stable/mongodb --generate-name
NAME: mongodb-1577466908
LETZTE BEREITSTELLUNG: Fr Dec 25 11:15:11 2019
NAMENSPACE: default
STATUS: bereitgestellt
REVISION: 1
TESTSUITE: Keine
HINWEISE:
** Bitte haben Sie Geduld, während das Chart bereitgestellt wird **
MongoDB kann über Port 27017 unter folgendem DNS-Namen innerhalb Ihres Clusters aufgerufen 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 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 wir:
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 kein Eingabeaufforderung sehen, drücken Sie die Eingabetaste.
> db.version();
4.0.14Drücken Sie ctrl+D, um den Container zu verlassen.
Emacs-Konfiguration
Im Grunde war schon alles nach , eingerichtet, daher werde ich nicht ins Detail gehen.
Aufteilung des Spiels in Funktionen
Die Interaktion mit den Funktionen erfolgt über das HTTP-Protokoll, die durchgehende Authentifizierung zwischen den verschiedenen Funktionen wird durch JWT gewährleistet. MongoDB wird zum Speichern von Tokens sowie von Spielstatus, Spieldaten, Bewegungsfolgen aller Spiele und anderen Informationen verwendet. Lassen Sie uns die interessantesten Funktionen näher betrachten.
Registrierung
Diese Funktion erwartet ein JSON mit dem Spiel-Pseudonym und dem Passwort. Bei Aufruf dieser Funktion wird überprüft, ob dieses Pseudonym nicht bereits in der Datenbank vorhanden ist. Bei erfolgreicher Prüfung wird das Pseudonym und der Passwort-Hash in die Datenbank eingefügt. Die Registrierung ist notwendig, um aktiv am Spiel teilzunehmen.
Anmeldung
Die Funktion liefert ein JSON-Objekt mit dem Spielernamen und dem Passwort. Wenn der Benutzername in der Datenbank vorhanden ist und das Passwort erfolgreich überprüft wurde, wird ein JWT zurückgegeben, das bei der Aufrufung anderer Funktionen übergeben werden muss. Zudem erfolgt die Einfügung verschiedener Dienstleistungsdatensätze in die Datenbank, wie z.B. der Zeitpunkt der letzten Anmeldung und ähnliches.
Spieleliste anzeigen
Jeder nicht autorisierte Benutzer kann die Liste aller Spiele anfordern, ausgenommen die aktiven. Ein autorisierter Benutzer sieht auch die Liste der aktiven Spiele. Das Ergebnis der Funktion ist ein JSON-Objekt, das die Spiellisten (Spiel-ID, lesbarer Name usw.) enthält.
Spielerstellung
Die Funktion arbeitet nur mit autorisierten Benutzern. Eingehend wird die maximale Spieleranzahl sowie die Spielparameter entgegengenommen (z.B. welche Figuren in diesem Spiel aktiviert werden sollen, die maximale Anzahl der Spieler usw.). Ein separates Spielparameter ist das Vorhandensein eines Passworts für den Beitritt, was es ermöglicht, nicht öffentliche Spiele zu erstellen. Standardmäßig wird ein öffentliches Spiel erstellt. Das Ergebnis der Funktion ist ein JSON-Objekt, das ein Erstellungsstatusfeld, die eindeutige Spiel-ID sowie weitere Parameter enthält.
Spielbeitritt
Die Funktion ist nur für autorisierte Nutzer verfügbar. Bei der Anmeldung benötigt man die Spiel-ID und das Passwort, sofern es sich um ein privates Spiel handelt. Die Ausgabe erfolgt in JSON-Format mit den Spielparametern. Der autorisierte Nutzer, der dem Spiel beitritt, sowie der Spieleschöpfer werden als Teilnehmer des Spiels bezeichnet.
Spielereignisse anzeigen
Jeder nicht autorisierte Nutzer kann eine Liste von Ereignissen in inaktiven Spielen anfordern. Autorisierte Nutzer hingegen können die Ereignisse eines aktiven Spiels einsehen. Als zusätzlicher Parameter kann die Ereignisnummer übergeben werden, die der Nutzer bereits besitzt. In diesem Fall werden nur die Ereignisse aufgelistet, die später aufgetreten sind. Indem autorisierte Nutzer diese Funktion regelmäßig aufrufen, können sie sehen, was im Spiel passiert. Diese Funktion liefert auch eine Anfrage zu Aktionen, auf die der Nutzer durch die Funktion zur Ereignisübermittlung reagieren kann.
Spielereignis senden
Die Funktion steht nur für Spielteilnehmer zur Verfügung: Es besteht die Möglichkeit, das Spiel zu starten, einen Zug zu machen, abzustimmen, eine Textnachricht zu schreiben, die in der Liste der Spielereignisse angezeigt wird, usw.
Der autorisierte Benutzer, der das Spiel erstellt hat, verteilt die Rollen an alle Teilnehmer, einschließlich sich selbst. Diese 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 steht nur für Spielteilnehmer zur Verfügung und zeigt den Stand des Spiels, die Liste und Anzahl der Spieler (Pseudonyme), Rollen und deren Status (Zug gemacht oder nicht) sowie weitere Informationen an. Wie bei der vorherigen Funktion funktioniert auch dies nur für die Teilnehmer.
Periodisch gestartete Funktionen
Wenn das Spiel für eine gewisse Zeit, die beim Erstellen des Spiels angegeben wurde, nicht gestartet wurde, wird es automatisch aus der Liste der aktiven Spiele mithilfe der Bereinigungsfunktion entfernt.
Eine weitere wiederkehrende Aufgabe besteht darin, den Spielmodus von Nacht auf Tag und zurück zu wechseln, wenn dies während des Spiels nicht geschehen ist (zum Beispiel, wenn ein Spieler auf ein Spielereignis reagieren muss, jedoch aus irgendeinem Grund 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 der Tests.
- Start einer Testspielsession.
- Ergebnisse
Quelle: habr.com
