
En este artículo estableceré un entorno de trabajo para el desarrollo del juego "Epics", así como dividiré el juego en partes adecuadas para su uso en OpenFaaS. Haré todas las manipulaciones en Linux, Kubernetes se implementará en minikube usando VirtualBox. En mi máquina de trabajo hay 2 núcleos de procesador y 12 GB de RAM, uso SSD como disco del sistema. Usaré Debian 8 como el sistema principal para el desarrollo, con los paquetes emacs, sudo, git y virtualbox instalados, instalaré el resto descargándolos de GitHub y otras fuentes. Instalaremos estas aplicaciones en / usr / local / bin, a menos que se especifique lo contrario. ¡Empecemos!
Preparación del ambiente de trabajo.
Ir a la instalación
Siga 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
Verificar rendimiento:
$ 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, world
Instalar faas-cli
Siga 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 bash-complete:
faas-cli completion --shell bash | sudo tee /etc/bash_completion.d/faas-cli
Instalar y configurar Kubernetes
Minikube es suficiente para el desarrollo, por lo que lo instalaremos y kubelet en / usr / local / bin, también instalaremos 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
Instalar OpenFaaS
Los desarrolladores recomiendan crear 2 espacios de nombres para el trabajo:
$ 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.imtqy.com/faas-netes/ "openfaas" has been added to your repositories
El cuadro tiene la capacidad de establecer una contraseña antes de la instalación, usarla y guardar los datos de acceso en forma de 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
Despliegue:
$ 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, ejecute 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
Verificar rendimiento:
$ 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
Instala Mongodb
Ponemos todo usando timón:
$ 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
Presiona ctrl + D para salir del contenedor.
Configuración de Emacs
En principio, todo ya estaba configurado para este artículo , por lo que no pintaré en detalle.
Dividiendo el juego en funciones
La interacción con las funciones se lleva a cabo a través del protocolo http, JWT proporciona la autenticación de extremo a extremo entre las diferentes funciones. Para almacenar fichas, así como el estado del juego, los datos del jugador, la secuencia de movimientos de todos los juegos y otra información, se utiliza mongodb. Echemos un vistazo más de cerca a las características más interesantes.
Registro
En la entrada de esta función está JSON con un alias de juego y contraseña. Cuando se llama a esta función, verifica la ausencia de este alias en la base de datos; en la verificación exitosa, inserta el hash de alias y contraseña en la base de datos. Se requiere registro para participar activamente en el juego.
Iniciar sesión
En la entrada de la función está JSON con un alias y una contraseña del juego, si hay un alias en la base de datos y la contraseña se verifica con éxito con la contraseña almacenada anteriormente en la base de datos, se devuelve JWT, que debe pasarse a otras funciones cuando se invocan. 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 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 JSON que contiene listas de juegos (identificador de juego, nombre legible por humanos, etc.).
Creación de juegos
La función solo funciona con usuarios autorizados, se acepta el número máximo de jugadores en la entrada, 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 le permite crear juegos no públicos. Por defecto, se crea un juego público. El resultado de la ejecución de la función es JSON, en el que hay un campo de éxito de creación, un identificador único para el juego, así como otros parámetros.
Unirse al juego
La función funciona solo con usuarios autorizados, en la entrada, el identificador del juego y su contraseña, si es un juego no público, en la salida, JSON con los parámetros del juego. El usuario autorizado que se ha unido al juego, así como el creador del juego, se llaman participantes en el juego.
Ver eventos del juego
Cualquier usuario no autorizado puede solicitar una lista de eventos de juegos inactivos, y un usuario autorizado puede obtener una lista de eventos y cualquier juego activo. Un parámetro adicional para la función puede ser el número de evento que el usuario ya tiene. En este caso, solo aquellos eventos que ocurrieron más tarde serán devueltos en la lista. Al iniciar esta función periódicamente, un usuario autorizado observa lo que sucede en el juego. Esta función también devuelve una solicitud de una acción a la que el usuario puede responder utilizando la función de enviar un evento de juego.
Despacho de eventos del juego
La función solo funciona para los participantes del juego: se implementa la capacidad de iniciar un juego, hacer un movimiento, votar, escribir un mensaje de texto que aparece en la lista de eventos del juego, etc.
El usuario autorizado que creó el juego comienza la distribución de roles a todos los participantes en el juego, incluidos ellos mismos, deben confirmar su rol utilizando la misma función. Una vez que se confirman todos los roles, el juego pasa automáticamente al modo nocturno.
Estadísticas del juego
La función funciona solo para los participantes en el juego, muestra el estado del juego, la lista y el número de jugadores (alias), roles y su estado (movimiento realizado o no), así como otra información. En cuanto a la función anterior, todo funciona solo para los participantes del juego.
Funciones ejecutadas periódicamente
Si el juego no se ha lanzado durante algún tiempo especificado durante su creación, se eliminará automáticamente de la lista de juegos activos mediante la función de barrido.
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 responder a un evento de juego no envió su decisión por ningún motivo).
Anuncio
- Introduccion
- Establecer el entorno de desarrollo, dividiendo la tarea en funciones.
- Trabajar en el backend
- Trabajo frontend
- Configuración de CI \ CD, organización de prueba
- Comenzar una sesión de prueba del juego
- Resumen