"Nye epos". Vi spiser elefanten i deler

"Nye epos". Vi spiser elefanten i deler

I denne artikkelen vil jeg sette opp et arbeidsmiljø for utvikling av spillet «Epics», og vil også bryte opp selve spillet i deler som egner seg for bruk i OpenFaaS. Jeg vil gjøre alle manipulasjonene på Linux, jeg vil distribuere Kubernetes i minikube ved å bruke VirtualBox. Arbeidsmaskinen min har 2 prosessorkjerner og 12 GB RAM; jeg bruker en SSD som systemdisk. Jeg vil bruke debian 8 som mitt hovedutviklingssystem, med emacs, sudo, git og virtualbox-pakker installert, alt annet vil bli installert ved nedlasting fra GitHub og andre kilder. Vi vil installere disse programmene i /usr/local/bin med mindre annet er spesifisert. La oss komme i gang!

Forberede arbeidsmiljøet

Installerer Go

Vi følger instruksjonene fra den offisielle nettsiden:

$ 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

Sjekker funksjonalitet:

$ 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

Installerer faas-cli

Vi følger instruksjonene fra den offisielle nettsiden:

$ 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

I tillegg kan du aktivere bash-fullføring:

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

Installere og konfigurere Kubernetes

For utvikling er minikube nok, så installer det og kubelet i /usr/local/bin, og installer ror for å installere applikasjoner:

$ 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 sjekker:

$ 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

Installerer OpenFaaS

Utviklerne anbefaler å opprette 2 navneområder å jobbe med:

$ kubectl apply -f https://raw.githubusercontent.com/openfaas/faas-netes/master/namespaces.yml
namespace/openfaas created
namespace/openfaas-fn created

Legg til et depot for ror:

$ helm repo add openfaas https://openfaas.github.io/faas-netes/
"openfaas" has been added to your repositories

Diagrammet har muligheten til å angi et passord før installasjon, la oss bruke det og lagre tilgangsdataene som en k8s-hemmelighet:

$ 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

La oss distribuere:

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

Etter en stund kjører vi den foreslåtte kommandoen:

$ 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

Sjekker funksjonalitet:

$ 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 hjelp av 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 sjekker:

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

Trykk ctrl+D for å gå ut av beholderen.

Sette opp emacs

I prinsippet var alt allerede konfigurert iht denne artikkelen, så jeg vil ikke gå i detalj.

Å dele opp spillet i funksjoner

Interaksjon med funksjoner utføres via http-protokollen, ende-til-ende autentisering mellom ulike funksjoner leveres av JWT. Mongodb brukes til å lagre tokens, samt spillstatus, spillerdata, sekvenser av trekk for alle spill og annen informasjon. La oss se nærmere på de mest interessante funksjonene.

Registrer deg

Inngangen til denne funksjonen er JSON med spillets kallenavn og passord. Når denne funksjonen kalles opp, sjekkes det at dette aliaset ikke er i databasen; hvis kontrollen er vellykket, settes alias- og passordhashen inn i databasen. Registrering er nødvendig for å delta aktivt i spillet.

inngang

Funksjonsinngangen er JSON med et spillkallenavn og passord; hvis det er et kallenavn i databasen og passordet er vellykket verifisert med det som tidligere er lagret i databasen, returneres en JWT, som må sendes til andre funksjoner når de er kalt. Ulike tjenesteposter settes også inn i databasen, for eksempel siste påloggingstid osv.

Se en liste over spill

Enhver uautorisert bruker kan be om en liste over alle spill unntatt de aktive. En autorisert bruker ser også en liste over aktive spill. Resultatet av funksjonen er JSON som inneholder lister over spill (spill-ID, menneskelest navn, etc.).

Oppretting av spill

Funksjonen fungerer kun med autoriserte brukere; maksimalt antall spillere aksepteres ved inngangen, samt spillparametere (for eksempel hvilke tegn som skal aktiveres i dette spillet, maksimalt antall spillere osv.). En egen parameter for spillet er tilstedeværelsen av et passord for å bli med, som lar deg lage ikke-offentlige spill. Som standard opprettes et offentlig spill. Resultatet av funksjonen er JSON, som inneholder et suksessfelt for opprettelse, en unik spillidentifikator og andre parametere.

Bli med i spillet

Funksjonen fungerer kun med autoriserte brukere, inngangen er spill-IDen og passordet, hvis dette er et ikke-offentligt spill, er utgangen JSON med spillparameterne. Den autoriserte brukeren som ble med i spillet, samt skaperen av spillet, kalles heretter spilldeltakere.

Viser spillhendelser

Enhver uautorisert bruker kan be om en liste over hendelser for inaktive spill, og en autorisert bruker kan motta en liste over hendelser for alle aktive spill. En tilleggsparameter til funksjonen kan være hendelsesnummeret som brukeren allerede har. I dette tilfellet vil bare hendelsene som skjedde senere bli returnert i listen. Ved å starte denne funksjonen med jevne mellomrom, ser en autorisert bruker hva som skjer i spillet. Denne funksjonen returnerer også en handlingsforespørsel, som brukeren kan svare på ved å bruke spillets hendelsesforsendelsesfunksjon.

Sender en spillbegivenhet

Funksjonen fungerer kun for spilldeltakere: det er mulig å starte spillet, gjøre et trekk, stemme, skrive en tekstmelding som vises i listen over spillhendelser, etc.
Den autoriserte brukeren som opprettet spillet begynner å distribuere roller til alle deltakerne i spillet, inkludert seg selv, de må bekrefte sin rolle ved å bruke samme funksjon. Når alle rollene er bekreftet, bytter spillet automatisk til nattmodus.

Spillstatistikk

Funksjonen fungerer bare for spilldeltakere; den viser spillets tilstand, listen og antall spillere (kallenavn), roller og deres status (flytting gjort eller ikke), samt annen informasjon. Som med den forrige funksjonen fungerer alt kun for spilldeltakere.

Periodisk lanserte funksjoner

Hvis spillet ikke har blitt lansert på en tid spesifisert når du opprettet spillet, vil det automatisk bli fjernet fra listen over aktive spill ved å bruke clear-funksjonen.

En annen periodisk oppgave er tvungen bytte av spillmodus fra natt til dag og tilbake for spill der dette ikke skjedde i løpet av turen (for eksempel, en spiller som trenger å reagere på en spillhendelse sendte ikke løsningen sin av en eller annen grunn ).

Kunngjøring

  • Innledning
  • Sette opp utviklingsmiljøet, bryte ned oppgaven i funksjoner
  • Backend arbeid
  • Frontend arbeid
  • Sette opp CICD, organisere testing
  • Start en prøvespilløkt
  • Resultater av

Kilde: www.habr.com

Legg til en kommentar