"Nouvelles épopées". Nous mangeons l'éléphant en plusieurs parties


Dans cet article, je mettrai en place un environnement de travail pour le développement du jeu "Epics", ainsi que je diviserai le jeu lui-même en parties adaptées à une utilisation dans OpenFaaS. Je ferai toutes les manipulations sous Linux, Kubernetes sera déployé en minikube en utilisant VirtualBox. Dans ma machine de travail, il y a 2 cœurs de processeur et 12 Go de RAM, j'utilise le SSD comme disque système. J'utiliserai debian 8 comme système principal de développement, avec les paquets emacs, sudo, git et virtualbox installés, j'installerai le reste en téléchargeant depuis GitHub et d'autres sources. Nous installerons ces applications dans / usr / local / bin, sauf indication contraire. Commençons!


Préparation de l'environnement de travail


Aller à l'installation


Suivez les instructions du site officiel:


$ 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 

Vérifier les performances:


 $ 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 

Installer faas-cli


Suivez les instructions du site officiel:


 $ 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 

De plus, vous pouvez activer l'achèvement de bash:


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

Installer et configurer Kubernetes


Minikube est suffisant pour le développement, nous allons donc l'installer et kubelet dans / usr / local / bin, nous installerons également helm pour installer les applications:


 $ 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 

Lancer le 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" 

Nous vérifions:


 $ 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 

Installer OpenFaaS


Les développeurs recommandent de créer 2 espaces de noms pour le travail:


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

Ajoutez un référentiel pour Helm:


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

Le graphique a la possibilité de définir un mot de passe avant l'installation, de l'utiliser et d'enregistrer les données d'accès sous la forme d'un secret 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 

Déployer:


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

Après un certain temps, exécutez la commande proposée:


 $ 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 

Vérifier les performances:


 $ 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 

Installer Mongodb


Nous mettons tout en utilisant la barre:


 $ 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 

Nous vérifions:


 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 

Appuyez sur ctrl + D pour quitter le conteneur.


Configuration d'Emacs


En principe, tout était déjà configuré pour cet article , donc je ne peindrai pas en détail.


Diviser le jeu en fonctions


L'interaction avec les fonctions est réalisée via le protocole http, l'authentification de bout en bout entre les différentes fonctions est assurée par JWT. Mongodb est utilisé pour stocker des jetons, ainsi que l'état du jeu, les données des joueurs, les séquences de mouvements de tous les jeux et d'autres informations. Examinons de plus près les fonctionnalités les plus intéressantes.


Inscription


A l'entrée de cette fonction se trouve JSON avec un alias de jeu et un mot de passe. Lorsque cette fonction est appelée, l'absence de cet alias est vérifiée dans la base de données; si elle est vérifiée avec succès, l'alias et le hachage de mot de passe sont insérés dans la base de données. L'inscription est requise pour une participation active au jeu.


Se connecter


À l'entrée de la fonction se trouve JSON avec un alias de jeu et un mot de passe, s'il y a un alias dans la base de données et que le mot de passe est vérifié avec succès avec le mot de passe précédemment stocké dans la base de données, le JWT est retourné, qui doit être transmis à d'autres fonctions lors de leur appel. Divers enregistrements de service sont également insérés dans la base de données, par exemple l'heure de la dernière connexion, etc.


Afficher la liste des jeux


Tout utilisateur non autorisé peut demander une liste de tous les jeux sauf ceux actifs. Un utilisateur autorisé voit également une liste de jeux actifs. Le résultat de la fonction est JSON contenant des listes de jeux (identifiant de jeu, nom lisible par l'homme, etc.).


Création de jeux


La fonction ne fonctionne qu'avec les utilisateurs autorisés, le nombre maximum de joueurs, ainsi que les paramètres du jeu (par exemple, quels personnages activer dans ce jeu, nombre maximum de joueurs, etc.) sont acceptés en entrée. Un paramètre distinct du jeu est la présence d'un mot de passe pour rejoindre, qui vous permet de créer des jeux non publics. Par défaut, un jeu public est créé. Le résultat de l'exécution de la fonction est JSON, dans lequel il y a un champ de réussite de création, un identifiant unique pour le jeu, ainsi que d'autres paramètres.


Rejoindre le jeu


La fonction ne fonctionne qu'avec les utilisateurs autorisés, à l'entrée - l'identifiant du jeu et son mot de passe, s'il s'agit d'un jeu non public, à la sortie - JSON avec les paramètres du jeu. L'utilisateur autorisé qui a rejoint le jeu, ainsi que le créateur du jeu, sont alors appelés les participants au jeu.


Afficher les événements du jeu


Tout utilisateur non autorisé peut demander une liste d'événements de jeux inactifs, et un utilisateur autorisé peut obtenir une liste d'événements et de tout jeu actif. Un paramètre supplémentaire à la fonction peut être le numéro d'événement que l'utilisateur possède déjà. Dans ce cas, seuls les événements survenus ultérieurement seront renvoyés dans la liste. En lançant régulièrement cette fonction, un utilisateur autorisé regarde ce qui se passe dans le jeu. Cette fonction renvoie également une demande d'action à laquelle l'utilisateur peut répondre à l'aide de la fonction d'envoi d'un événement de jeu.


Envoi de l'événement de jeu


La fonction ne fonctionne que pour les participants au jeu: la possibilité de lancer un jeu, de bouger, de voter, d'écrire un SMS qui apparaît dans la liste des événements du jeu, etc. est mise en œuvre.
L'utilisateur autorisé qui a créé le jeu commence la distribution des rôles à tous les participants au jeu, y compris eux-mêmes, ils doivent confirmer leur rôle en utilisant la même fonction. Une fois tous les rôles confirmés, le jeu passe automatiquement en mode nuit.


Statistiques du jeu


La fonction ne fonctionne que pour les participants au jeu, affiche l'état du jeu, la liste et le nombre de joueurs (alias), les rôles et leur statut (déplacement effectué ou non), ainsi que d'autres informations. Comme pour la fonction précédente, tout ne fonctionne que pour les participants au jeu.


Exécuter périodiquement des fonctions


Si le jeu n'a pas été lancé pendant un certain temps spécifié lors de la création du jeu, il sera automatiquement supprimé de la liste des jeux actifs à l'aide de la fonction de balayage.


Une autre tâche périodique est la commutation forcée du mode de jeu de nuit en jour et retour pour les jeux dans lesquels cela ne s'est pas produit pendant le tour (par exemple, un joueur qui doit répondre à un événement de jeu n'a pas envoyé sa décision pour une raison quelconque).


Annonce


  • Présentation
  • Définition de l'environnement de développement, division de la tâche en fonctions
  • Travailler sur le backend
  • Travail frontal
  • Configuration CI \ CD, organisation de test
  • Démarrage d'une session d'essai de jeu
  • Résumé

Source: https://habr.com/ru/post/fr482752/


All Articles