"Novas épicas". Nós comemos o elefante em partes


Neste artigo, configurarei um ambiente de trabalho para o desenvolvimento do jogo "Epics", além de dividir o jogo em partes adequadas para uso no OpenFaaS. Farei todas as manipulações no Linux, o Kubernetes será implantado no minikube usando o VirtualBox. Na minha máquina de trabalho, existem 2 núcleos de processador e 12 GB de RAM, eu uso o SSD como um disco do sistema. Usarei o debian 8 como o principal sistema de desenvolvimento, com os pacotes emacs, sudo, git e virtualbox instalados; instalarei o restante baixando do GitHub e de outras fontes. Instalaremos esses aplicativos em / usr / local / bin, a menos que especificado de outra forma. Vamos começar!


Preparação do ambiente de trabalho


Ir instalação


Siga as instruções do site 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 

Verifique o desempenho:


 $ 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 as instruções do site 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 

Além disso, você pode ativar a conclusão do bash:


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

Instale e configure o Kubernetes


O Minikube é suficiente para o desenvolvimento, por isso vamos instalá-lo e kubelet em / usr / local / bin, também instalaremos o helm para instalar aplicativos:


 $ 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 

Inicie o 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" 

Verificamos:


 $ 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 

Instale o OpenFaaS


Os desenvolvedores recomendam a criação de 2 namespace para o trabalho:


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

Adicione um repositório para o helm:


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

O gráfico tem a capacidade de definir uma senha antes da instalação, usá-la e salvar os dados de acesso na forma de um segredo do 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 

Implantando:


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

Após algum tempo, execute o 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 

Verifique o desempenho:


 $ 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 

Instale o Mongodb


Colocamos tudo usando o leme:


 $ 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 

Verificamos:


 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 

Pressione ctrl + D para sair do contêiner.


Configuração do Emacs


Em princípio, tudo já estava configurado para este artigo , então não vou pintar em detalhes.


Dividindo o jogo em funções


A interação com as funções é realizada via protocolo http; a autenticação de ponta a ponta entre diferentes funções é fornecida pelo JWT. O Mongodb é usado para armazenar tokens, bem como o estado do jogo, dados do jogador, sequências de movimentos de todos os jogos e outras informações. Vamos dar uma olhada nos recursos mais interessantes.


Registo


Na entrada desta função está JSON com um apelido de jogo e senha. Quando essa função é chamada, a ausência desse alias é verificada no banco de dados; se for verificada com êxito, o alias e o hash da senha são inseridos no banco de dados. O registro é necessário para a participação ativa no jogo.


Entrar


Na entrada da função está JSON com um alias e uma senha do jogo, se houver um alias no banco de dados e a senha for verificada com êxito com a senha armazenada anteriormente no banco de dados, o JWT será retornado, que deverá ser passado para outras funções quando elas forem chamadas. Vários registros de serviço também são inseridos no banco de dados, por exemplo, a hora do último login, etc.


Ver lista de jogos


Qualquer usuário não autorizado pode solicitar uma lista de todos os jogos, exceto os ativos. Um usuário autorizado também vê uma lista de jogos ativos. O resultado da função é JSON contendo listas de jogos (identificador de jogo, nome legível por humanos, etc.).


Criação de jogos


A função funciona apenas com usuários autorizados, o número máximo de jogadores e os parâmetros do jogo (por exemplo, quais personagens ativar neste jogo, número máximo de jogadores etc.) são aceitos na entrada. Um parâmetro separado do jogo é a presença de uma senha para ingressar, o que permite criar jogos não públicos. Por padrão, um jogo público é criado. O resultado da execução da função é JSON, no qual há um campo de sucesso na criação, um identificador exclusivo para o jogo, além de outros parâmetros.


Entrando no jogo


A função funciona apenas com usuários autorizados, na entrada - o identificador do jogo e sua senha, se for um jogo não público, na saída - JSON com os parâmetros do jogo. O usuário autorizado que entrou no jogo, assim como o criador do jogo, é chamado de participantes no jogo.


Ver eventos do jogo


Qualquer usuário não autorizado pode solicitar uma lista de eventos de jogos inativos, e um usuário autorizado pode obter uma lista de eventos e qualquer jogo ativo. Um parâmetro adicional para a função pode ser o número do evento que o usuário já possui. Nesse caso, apenas os eventos que ocorreram posteriormente serão retornados na lista. Ao iniciar esta função periodicamente, um usuário autorizado assiste o que está acontecendo no jogo. Essa função também retorna uma solicitação para uma ação à qual o usuário pode responder usando a função de enviar um evento do jogo.


Envio de evento de jogo


A função funciona apenas para os participantes do jogo: a capacidade de iniciar um jogo, fazer uma jogada, votar, escrever uma mensagem de texto que aparece na lista de eventos do jogo etc. é implementada.
O usuário autorizado que criou o jogo inicia a distribuição de papéis para todos os participantes do jogo, incluindo eles mesmos, eles devem confirmar seu papel usando a mesma função. Uma vez confirmadas todas as funções, o jogo entra automaticamente no modo noturno.


Estatísticas do jogo


A função funciona apenas para os participantes do jogo, mostra o estado do jogo, a lista e o número de jogadores (pseudônimos), funções e status (movimento realizado ou não), além de outras informações. Quanto à função anterior, tudo funciona apenas para os participantes do jogo.


Funções de execução periódica


Se o jogo não tiver sido iniciado por algum tempo especificado durante a criação do jogo, ele será automaticamente removido da lista de jogos ativos usando a função de varredura.


Outra tarefa periódica é a alternância forçada do modo de jogo da noite para o dia e de volta para jogos nos quais isso não aconteceu durante o turno (por exemplo, um jogador que precisa responder a um evento do jogo não enviou sua decisão por qualquer motivo).


Anúncio


  • 1. Introdução
  • Configurando o ambiente de desenvolvimento, dividindo a tarefa em funções
  • Trabalhar no back-end
  • Trabalho de front-end
  • Configuração de CI \ CD, organização de teste
  • Iniciando uma sessão de avaliação do jogo
  • Sumário

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


All Articles