"Nuevas epopeyas". Nos comemos el elefante por partes.

"Nuevas epopeyas". Nos comemos el elefante por partes.

En este artículo, configuraré un entorno de trabajo para desarrollar el juego "Epics" y también dividiré el juego en partes adecuadas para su uso en OpenFaaS. Haré todas las manipulaciones en Linux, implementaré Kubernetes en minikube usando VirtualBox. Mi máquina de trabajo tiene 2 núcleos de procesador y 12 GB de RAM; uso un SSD como disco del sistema. Usaré Debian 8 como mi sistema de desarrollo principal, con los paquetes emacs, sudo, git y virtualbox instalados, todo lo demás se instalará descargándolo de GitHub y otras fuentes. Instalaremos estas aplicaciones en /usr/local/bin a menos que se especifique lo contrario. ¡Empecemos!

Preparar el ambiente de trabajo.

Instalación de Go

Seguimos las instrucciones del sitio web oficial:

$ 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

Comprobación de funcionalidad:

$ 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

Instalación de faas-cli

Seguimos las instrucciones del sitio web oficial:

$ 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

Además, puede habilitar la finalización de bash:

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

Instalación y configuración de Kubernetes

Para el desarrollo, minikube es suficiente, así que instálelo y kubelet en /usr/local/bin, e instale helm para instalar aplicaciones:

$ 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

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

Comprobamos:

$ 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

Instalación de OpenFaaS

Los desarrolladores recomiendan crear 2 espacios de nombres para trabajar:

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

Agregue un repositorio para helm:

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

El gráfico tiene la capacidad de establecer una contraseña antes de la instalación, usémosla y guardemos los datos de acceso como un secreto 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

Implementemos:

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

Después de un tiempo, ejecutamos el comando propuesto:

$ 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

Comprobación de funcionalidad:

$ 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

Instalación de MongoDB

Instalamos todo usando 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

Comprobamos:

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

Presione Ctrl+D para salir del contenedor.

Configurando emacs

En principio ya estaba todo configurado según este artículo, así que no entraré en detalles.

Dividiendo el juego en funciones.

La interacción con las funciones se realiza a través del protocolo http, JWT proporciona la autenticación de un extremo a otro entre diferentes funciones. Mongodb se utiliza para almacenar tokens, así como el estado del juego, datos del jugador, secuencias de movimientos de todos los juegos y otra información. Echemos un vistazo más de cerca a las características más interesantes.

Registrarse

La entrada de esta función es JSON con el apodo y la contraseña del juego. Cuando se llama a esta función, se verifica que este alias no esté en la base de datos; si la verificación es exitosa, el alias y el hash de la contraseña se insertan en la base de datos. Es necesario registrarse para participar activamente en el juego.

entrada

La entrada de la función es JSON con un apodo y contraseña del juego; si hay un apodo en la base de datos y la contraseña se verifica exitosamente con la previamente guardada en la base de datos, se devuelve un JWT, el cual se debe pasar a otras funciones cuando sean llamado. También se insertan varios registros de servicio en la base de datos, por ejemplo, la hora del último inicio de sesión, etc.

Ver una lista de juegos

Cualquier usuario no autorizado puede solicitar una lista de todos los juegos excepto los activos. Un usuario autorizado también ve una lista de juegos activos. El resultado de la función es un JSON que contiene listas de juegos (ID del juego, nombre legible por humanos, etc.).

Creación de juegos

La función funciona solo con usuarios autorizados, en la entrada se acepta el número máximo de jugadores, así como los parámetros del juego (por ejemplo, qué personajes activar en este juego, el número máximo de jugadores, etc.). Un parámetro separado del juego es la presencia de una contraseña para unirse, que te permite crear juegos no públicos. De forma predeterminada, se crea un juego público. El resultado de la función es JSON, que contiene un campo de creación exitosa, un identificador de juego único y otros parámetros.

Unirse a un juego

La función funciona solo con usuarios autorizados, la entrada es el ID del juego y su contraseña, si se trata de un juego no público, la salida es JSON con los parámetros del juego. El usuario autorizado que se unió al juego, así como el creador del juego, se denominarán en adelante participantes del juego.

Ver eventos del juego

Cualquier usuario no autorizado puede solicitar una lista de eventos para juegos inactivos y un usuario autorizado puede recibir una lista de eventos para cualquier juego activo. Un parámetro adicional a la función puede ser el número de evento que ya tiene el usuario. En este caso, solo se devolverán en la lista aquellos eventos que ocurrieron más tarde. Al iniciar periódicamente esta función, un usuario autorizado observa lo que sucede en el juego. Esta función también devuelve una solicitud de acción, a la que el usuario puede responder utilizando la función de envío de eventos del juego.

Enviar un evento de juego

La función funciona sólo para los participantes del juego: es posible iniciar el juego, realizar un movimiento, votar, escribir un mensaje de texto que se muestra en la lista de eventos del juego, etc.
El usuario autorizado que creó el juego comienza a distribuir roles a todos los participantes del juego, incluidos ellos mismos, deben confirmar su rol usando la misma función. Una vez confirmados todos los roles, el juego cambia automáticamente al modo nocturno.

Estadísticas del juego

La función funciona sólo para los participantes del juego; muestra el estado del juego, la lista y el número de jugadores (apodos), roles y su estado (movimiento realizado o no), así como otra información. Al igual que con la función anterior, todo funciona sólo para los participantes del juego.

Funciones lanzadas periódicamente

Si el juego no se ha iniciado durante el tiempo especificado al crearlo, se eliminará automáticamente de la lista de juegos activos mediante la función borrar.

Otra tarea periódica es el cambio forzado del modo de juego de noche a día y viceversa para juegos en los que esto no sucedió durante el turno (por ejemplo, un jugador que necesita reaccionar ante un evento del juego no envió su solución por algún motivo). ).

anuncio

  • introducción
  • Configurar el entorno de desarrollo, dividir la tarea en funciones.
  • trabajo de fondo
  • trabajo frontal
  • Configurar CICD, organizar pruebas
  • Iniciar una sesión de juego de prueba
  • resultados

Fuente: habr.com

Añadir un comentario