
I denne artikel vil jeg sætte et udviklingsmiljø op til spillet «Byer», samt opdele selve spillet i dele, der kan bruges i OpenFaaS. Alt arbejde vil blive udført på Linux, hvor Kubernetes vil blive oprettet i minikube med brug af VirtualBox. Min arbejdscomputer har 2 CPU-kerner og 12 GB RAM, og jeg bruger en SSD som systemdisk. Som hovedsystem til udvikling vil jeg bruge Debian 8, med installerede pakker som emacs, sudo, git og virtualbox, alt andet vil jeg installere ved at downloade fra GitHub og andre kilder. Disse applikationer skal installeres i /usr/local/bin, medmindre andet er angivet. Lad os komme i gang!
Forberedelse af udviklingsmiljø
Installation af Go
Følg instruktionerne fra det officielle websted:
$ 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' >> ~/.profileKontrollerer funktionalitet:
$ mkdir -p ~/go/src/hello && cd ~/go/src/hello
$ echo 'package main
import "fmt"
func main() {
fmt.Printf("hello, world\n")
}' > hello.go
$ go build
$ ./hello
hello, worldInstallation af faas-cli
Følg instruktionerne fra det officielle websted:
$ curl -sSL https://cli.openfaas.com | sudo -E sh
x86_64
Downloading package https://github.com/openfaas/faas-cli/releases/download/0.11.3/faas-cli as /tmp/faas-cli
Download complete.
Running with sufficient permissions to attempt to move faas-cli to /usr/local/bin
New version of faas-cli installed to /usr/local/bin
Creating alias 'faas' for 'faas-cli'.
___ _____ ____
/ _ _ __ ___ _ __ | ___|_ _ __ _/ ___|
| | | | '_ / _ '_ | |_ / _` |/ _` ___
| |_| | |_) | __/ | | | _| (_| | (_| |___) |
___/| .__/_ ___|_| |_|_| __,_|__,_|____/
|_|
CLI:
commit: 73004c23e5a4d3fdb7352f953247473477477a64
version: 0.11.3Derudover kan bash-completion tilføjes:
faas-cli completion --shell bash | sudo tee /etc/bash_completion.d/faas-cliInstallation og opsætning af Kubernetes
Til udvikling er minikube tilstrækkeligt, så lad os installere det og kubelet i /usr/local/bin, og til installationsapplikationer installerer vi også helm:
$ 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/binStarter minikube:
$ minikube start
minikube v1.6.2 på Debian 8.11
Automatisk valgt 'virtualbox' driver (alternativer: [])
Henter VM boot billede ...
> 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
Opretter virtualbox VM (CPU'er=2, Hukommelse=8192MB, Disk=20000MB) ...
Forbereder Kubernetes v1.17.0 på Docker '19.03.5' ...
Henter kubeadm v1.17.0
Henter kubelet v1.17.0
Henter billeder ...
Starter Kubernetes ... Venter på at klyngen er online ...
Færdig! kubectl er nu konfigureret til at bruge "minikube"Vi tjekker:
$ kubectl get pods --all-namespaces
NAVNSPACE NAVN KLAR STATUS GENSTARTS ALDER
kube-system coredns-6955765f44-knlcb 1/1 Kørende 0 29m
kube-system coredns-6955765f44-t9cpn 1/1 Kørende 0 29m
kube-system etcd-minikube 1/1 Kørende 0 28m
kube-system kube-addon-manager-minikube 1/1 Kørende 0 28m
kube-system kube-apiserver-minikube 1/1 Kørende 0 28m
kube-system kube-controller-manager-minikube 1/1 Kørende 0 28m
kube-system kube-proxy-hv2wc 1/1 Kørende 0 29m
kube-system kube-scheduler-minikube 1/1 Kørende 0 28m
kube-system storage-provisioner 1/1 Kørende 1 29mInstallation af OpenFaaS
Udviklere anbefaler at oprette 2 namespaces til brug:
$ kubectl apply -f https://raw.githubusercontent.com/openfaas/faas-netes/master/namespaces.yml
namespace/openfaas oprettet
namespace/openfaas-fn oprettetTilføjer repository til helm:
$ helm repo add openfaas https://openfaas.github.io/faas-netes/
"openfaas" er blevet tilføjet til dine repositoriesI chartet er der mulighed for at angive adgangskode inden installation, lad os bruge den og gemme adgangsoplysningerne som en k8s hemmelighed:
$ 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 oprettetUdfører deployment:
$ helm repo update
Vent venligst mens vi henter det nyeste fra dine chart repositories...
...Succesfuldt fået en opdatering fra "openfaas" chart repository
Opdatering komplet. God fornøjelse med Helm!
$ helm upgrade openfaas --install openfaas/openfaas --namespace openfaas --set functionNamespace=openfaas-fn --set generateBasicAuth=false
Udgivelsen "openfaas" eksisterer ikke. Installerer den nu.
NAVN: openfaas
SIDSTE UDRULNING: Fre Dec 25 10:28:22 2019
NAVNSPACE: openfaas
STATUS: udrullet
REVISION: 1
TESTSUITE: Ingen
NOTER:
For at verificere, at openfaas er startet, skal du køre:
kubectl -n openfaas get deployments -l "release=openfaas, app=openfaas"Efter lidt tid kører vi den foreslåede kommando:
$ kubectl -n openfaas get deployments -l "release=openfaas, app=openfaas"
NAVN KLAR OP-TO-DATE TILGÆNGELIG ALDER
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 114sKontrollerer funktionalitet:
$ kubectl rollout status -n openfaas deploy/gateway
deployment "gateway" rullet korrekt
$ kubectl port-forward -n openfaas svc/gateway 8080:8080 &
[1] 6985
Videregivelse fra 127.0.0.1:8080 -> 8080
$ echo -n $PASSWORD | faas-cli login --username admin --password-stdin
Kalder OpenFaaS-serveren for at validere legitimationsoplysningerne...
Håndterer forbindelse for 8080
ADVARSEL! Kommunikation er ikke sikker, overvej at bruge HTTPS. Letsencrypt.org tilbyder gratis SSL/TLS-certifikater.
legitimationsoplysninger gemt for admin http://127.0.0.1:8080
$ faas-cli list
Funktion Kald ReplikaterInstallation af Mongodb
Installerer alt ved hjælp af helm:
$ helm repo add stable https://kubernetes-charts.storage.googleapis.com/
"stable" er blevet tilføjet til dine repositories
$ helm install stable/mongodb --generate-name
NAVN: mongodb-1577466908
SIDST UDSENDT: Fri Dec 25 11:15:11 2019
NAVNERUM: default
STATUS: udsendt
REVISION: 1
TESTSUITE: Ingen
NOTER:
** Vær venlig at være tålmodig, mens diagrammet udsendes **
MongoDB kan tilgås via port 27017 på følgende DNS-navn fra indeni din klynge:
mongodb-1577466908.default.svc.cluster.local
For at få rodadgangskoden, kør:
export MONGODB_ROOT_PASSWORD=$(kubectl get secret --namespace default mongodb-1577466908 -o jsonpath="{.data.mongodb-root-password}" | base64 --decode)
For at forbinde til din database, kør følgende kommando:
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
For at forbinde til din database fra uden klyngen, udfør følgende kommandoer:
kubectl port-forward --namespace default svc/mongodb-1577466908 27017:27017 &
mongo --host 127.0.0.1 --authenticationDatabase admin -p $MONGODB_ROOT_PASSWORDVi 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)
Hvis du ikke ser en kommandoprompt, prøv at trykke enter.
> db.version();
4.0.14Tryk ctrl+D for at forlade containeren.
Opsætning af emacs
I princippet var alt allerede indstillet i henhold til , så jeg vil ikke gå i dybden med det.
Opdeling af spillet i funktioner
Interaktionen med funktionerne sker via http-protokollen, og gennemgående autentifikation mellem forskellige funktioner sikres med JWT. Til opbevaring af tokens samt spillets tilstand, spillerdata, rækkefølge af træk i alle spil og anden information anvendes mongodb. Lad os se nærmere på de mest interessante funktioner.
Registrering
Indgangen til denne funktion er et JSON-objekt med et spillernavn og en adgangskode. Ved kald af denne funktion kontrolleres det, om dette spillernavn ikke findes i databasen; efter en vellykket kontrol indsættes spillernavnet og hash-koden for adgangskoden i databasen. Registrering er nødvendig for aktiv deltagelse i spillet.
Log ind
Indgangen til funktionen er JSON med et spillernavn og en adgangskode; hvis navnet findes i databasen, og adgangskoden verificeres som korrekt, returneres en JWT, som skal videregives til andre funktioner ved deres kald. Desuden indsættes forskellige systemoptegnelser i databasen, som for eksempel tidspunktet for den seneste login og lignende.
Vis liste over spil
Enhver ikke-autoriseret bruger kan anmode om at se listen over alle spil, undtagen aktive. En autoriseret bruger kan også se listen over aktive spil. Resultatet af funktionen er JSON, der indeholder spillister (spilidentifikator, brugervenligt navn osv.).
Oprettelse af spil
Funktionen arbejder kun med autoriserede brugere; indgangen accepterer det maksimale antal spillere samt spilparametre (f.eks. hvilke karakterer der skal aktiveres i dette spil, det maksimale antal spillere osv.). En særskilt parameter for spillet er, om der er en adgangskode til deltagelse, hvilket muliggør oprettelse af ikke-offentlige spil. Som standard oprettes et offentligt spil. Resultatet af funktionen er JSON, der indeholder et felt for succesfuld oprettelse, en unik identificator for spillet samt andre parametre.
Deltagelse i spil
Funktionen fungerer kun med autoriserede brugere; indgangen inkluderer spilidentifikatoren og dens adgangskode, hvis det er et ikke-offentligt spil. Udgangen er JSON med spilparametre. Den autoriserede bruger, der deltager i spillet, samt spillets skaber kaldes nu deltagere.
Vis spilbegivenheder
Enhver ikke-autoriseret bruger kan anmode om en liste over begivenheder i ikke-aktive spil, mens autoriserede brugere kan få en liste over begivenheder i alle aktive spil. Et yderligere parameter for funktionen kan være begivenhedsnummeret, som brugeren allerede har. I så fald vil kun de begivenheder, der er sket senere, blive returneret i listen. Ved periodisk at kalde denne funktion kan den autoriserede bruger se, hvad der sker i spillet. Denne funktion returnerer også en anmodning om handling, som brugeren kan reagere på ved hjælp af funktionen til at sende spilbegivenheder.
Send spilbegivenhed
Funktionen fungerer kun for deltagerne i spillet: der er mulighed for at starte spillet, foretage et træk, stemme, skrive en tekstbesked, som vises i listen over spilevents osv.
Den autoriserede bruger, der oprettede spillet, tildeler roller til alle deltagerne i spillet, inklusive sig selv, og de skal bekræfte deres roller ved hjælp af den samme funktion. Så snart alle roller er bekræftet, skifter spillet automatisk til nattilstand.
Spilstatistik
Funktionen fungerer kun for deltagerne i spillet, viser spillets tilstand, listen og antallet af spillere (aliaser), roller og deres status (er der foretaget et træk eller ej), samt anden information. Som med den foregående funktion fungerer alt kun for deltagerne i spillet.
Periodisk kørte funktioner
Hvis spillet ikke er blevet startet inden for en vis periode angivet ved oprettelsen af spillet, vil det automatisk blive fjernet fra listen over aktive spil ved hjælp af en rydningsfunktion.
En anden periodisk opgave er at tvinge skiftet af spiltilstand fra nat til dag og omvendt for spil, hvor dette ikke skete under et træk (for eksempel hvis en spiller, der skulle reagere på en spilevent, ikke har sendt sin beslutning af forskellige årsager).
Annonce
- Opsætning af udviklingsmiljø, opdeling af opgaven i funktioner
- Arbejdet med backend
- Arbejdet med frontend
- Opsætning af CICD, organisering af test
- Start af en prøve-session af spillet
- Resumé
Kilde: habr.com
