"Nye eposer". Vi spiser elefanten i dele

"Nye eposer". Vi spiser elefanten i dele

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:

$ 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

Kontrol af funktionalitet:

$ 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, world

Installation af faas-cli

Vi følger instruktionerne fra den officielle hjemmeside:

$ 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.3

Derudover kan du aktivere bash-fuldførelse:

faas-cli completion --shell bash | sudo tee /etc/bash_completion.d/faas-cli

Installation og konfiguration af Kubernetes

Til udvikling er minikube nok, så installer det og kubelet i /usr/local/bin, og installer ror for at installere applikationer:

$ 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/bin

Start minikube:

$ minikube start
  minikube v1.6.2 on Debian 8.11
  Automatically selected the 'virtualbox' driver (alternates: [])
  Downloading VM boot image ...
    > 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
  Creating virtualbox VM (CPUs=2, Memory=8192MB, Disk=20000MB) ...
  Preparing Kubernetes v1.17.0 on Docker '19.03.5' ...
  Downloading kubeadm v1.17.0
  Downloading kubelet v1.17.0
  Pulling images ...
  Launching Kubernetes ...  Waiting for cluster to come online ...
  Done! kubectl is now configured to use "minikube"

Vi tjekker:

$ 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          29m

Installation af OpenFaaS

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:

$ 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 created

Lad os implementere:

$ 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"

Efter nogen tid kører vi den foreslåede kommando:

$ 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

Kontrol af funktionalitet:

$ 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 ).

annoncering

  • Indledning
  • Opsætning af udviklingsmiljøet, opdeling af opgaven i funktioner
  • Backend arbejde
  • Frontend arbejde
  • Opsætning af CICD, organisering af test
  • Start en prøvespilsession
  • Resultaterne af

Kilde: www.habr.com

Tilføj en kommentar