"Nuove epopee". Mangiamo l'elefante in parti

"Nuove epopee". Mangiamo l'elefante in parti

In questo articolo creerò un ambiente di lavoro per lo sviluppo del gioco "Epics" e suddividerò anche il gioco stesso in parti adatte all'uso in OpenFaaS. Farò tutte le manipolazioni su Linux, distribuirò Kubernetes in minikube usando VirtualBox. La mia macchina da lavoro ha 2 core del processore e 12 GB di RAM; utilizzo un SSD come disco di sistema. Utilizzerò debian 8 come sistema di sviluppo principale, con i pacchetti emacs, sudo, git e virtualbox installati, tutto il resto verrà installato scaricando da GitHub e altre fonti. Installeremo queste applicazioni in /usr/local/bin se non diversamente specificato. Iniziamo!

Preparazione dell'ambiente di lavoro

Installazione di Go

Seguiamo le istruzioni dal sito ufficiale:

$ 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

Verifica della funzionalità:

$ 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

Installazione di faas-cli

Seguiamo le istruzioni dal sito ufficiale:

$ 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

Inoltre, puoi abilitare il completamento bash:

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

Installazione e configurazione di Kubernetes

Per lo sviluppo, minikube è sufficiente, quindi installalo insieme a kubelet in /usr/local/bin e installa helm per installare le applicazioni:

$ 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

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

Controlliamo:

$ 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

Installazione di OpenFaaS

Gli sviluppatori consigliano di creare 2 spazi dei nomi con cui lavorare:

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

Aggiungi un repository per helm:

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

Il grafico ha la possibilità di impostare una password prima dell'installazione, usiamola e salviamo i dati di accesso come segreto k8s:

$ 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

Distribuiamo:

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

Dopo un po' di tempo eseguiamo il comando proposto:

$ 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

Verifica della funzionalità:

$ 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

Installazione di MongoDB

Installiamo tutto utilizzando helm:

$ 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

Controlliamo:

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

Premi ctrl+D per uscire dal contenitore.

Configurazione di emacs

In linea di principio, tutto era già configurato secondo questo articolo, quindi non entrerò nei dettagli.

Suddividere il gioco in funzioni

L'interazione con le funzioni avviene tramite il protocollo http, l'autenticazione end-to-end tra le diverse funzioni è fornita da JWT. Mongodb viene utilizzato per memorizzare token, nonché stato del gioco, dati dei giocatori, sequenze di mosse di tutti i giochi e altre informazioni. Vediamo più da vicino le caratteristiche più interessanti.

Registrati

L'input di questa funzione è JSON con il nickname e la password del gioco. Quando viene chiamata questa funzione viene controllato che questo alias non sia presente nel database; se il controllo ha esito positivo l'alias e l'hash della password vengono inseriti nel database. Per partecipare attivamente al gioco è necessaria la registrazione.

ingresso

L'input della funzione è JSON con nickname e password del gioco; se nel database è presente un nickname e la password viene verificata con successo con quella precedentemente salvata nel database, viene restituito un JWT, che dovrà essere passato alle altre funzioni quando sono chiamato. Nel database vengono inseriti anche diversi record di servizio, ad esempio l'ora dell'ultimo accesso, ecc.

Visualizza un elenco di giochi

Qualsiasi utente non autorizzato può richiedere un elenco di tutti i giochi tranne quelli attivi. Un utente autorizzato vede anche un elenco di giochi attivi. Il risultato della funzione è JSON contenente elenchi di giochi (ID gioco, nome leggibile dall'uomo, ecc.).

Creazione di un gioco

La funzione funziona solo con utenti autorizzati; in ingresso viene accettato il numero massimo di giocatori, così come i parametri di gioco (ad esempio, quali personaggi attivare in questo gioco, il numero massimo di giocatori, ecc.). Un parametro separato del gioco è la presenza di una password per l'adesione, che consente di creare giochi non pubblici. Per impostazione predefinita, viene creato un gioco pubblico. Il risultato della funzione è JSON, che contiene un campo di creazione riuscita, un identificatore di gioco univoco e altri parametri.

Unirsi al gioco

La funzione funziona solo con utenti autorizzati, l'input è l'ID del gioco e la sua password, se si tratta di un gioco non pubblico, l'output è JSON con i parametri del gioco. L'utente autorizzato che si è unito al gioco, così come l'autore del gioco, verranno di seguito chiamati partecipanti al gioco.

Visualizzazione degli eventi di gioco

Qualsiasi utente non autorizzato può richiedere un elenco di eventi per i giochi inattivi e un utente autorizzato può ricevere un elenco di eventi per qualsiasi gioco attivo. Un parametro aggiuntivo alla funzione può essere il numero dell'evento di cui l'utente già dispone. In questo caso verranno restituiti nell'elenco solo gli eventi verificatisi successivamente. Lanciando periodicamente questa funzione, un utente autorizzato guarda cosa sta succedendo nel gioco. Questa funzione restituisce anche una richiesta di azione, alla quale l'utente può rispondere utilizzando la funzione di invio degli eventi del gioco.

Invio di un evento di gioco

La funzione è attiva solo per i partecipanti al gioco: è possibile avviare il gioco, effettuare una mossa, votare, scrivere un messaggio di testo che verrà visualizzato nell'elenco degli eventi del gioco, ecc.
L'utente autorizzato che ha creato il gioco inizia a distribuire i ruoli a tutti i partecipanti al gioco, compresi se stessi, devono confermare il proprio ruolo utilizzando la stessa funzione. Una volta confermati tutti i ruoli, il gioco passa automaticamente alla modalità notturna.

Statistiche di gioco

La funzione è attiva solo per i partecipanti al gioco; mostra lo stato del gioco, l'elenco e il numero dei giocatori (soprannomi), i ruoli e il loro stato (mossa effettuata o meno), oltre ad altre informazioni. Come per la funzione precedente, tutto funziona solo per i partecipanti al gioco.

Funzioni lanciate periodicamente

Se il gioco non viene avviato per il tempo specificato durante la creazione del gioco, verrà automaticamente rimosso dall'elenco dei giochi attivi utilizzando la funzione di cancellazione.

Un'altra attività periodica è il passaggio forzato della modalità di gioco dalla notte al giorno e viceversa per i giochi per i quali ciò non è avvenuto durante il turno (ad esempio, un giocatore che deve reagire a un evento di gioco non ha inviato la sua soluzione per qualche motivo ).

annuncio

  • Introduzione
  • Impostazione dell'ambiente di sviluppo, scomposizione del compito in funzioni
  • Lavoro di back-end
  • Lavoro frontend
  • Impostazione del CICD, organizzazione dei test
  • Avvia una sessione di gioco di prova
  • Risultati di

Fonte: habr.com

Aggiungi un commento