"Novaj Epopeoj". Ni manĝas la elefanton en partoj

"Novaj Epopeoj". Ni manĝas la elefanton en partoj

En ĉi tiu artikolo, mi starigos labormedion por disvolvi la ludon "Epopeoj", kaj ankaŭ dividos la ludon mem en partojn taŭgajn por uzi en OpenFaaS. Mi faros ĉiujn manipuladojn en Linukso, mi deplojos Kubernetes en minikube uzante VirtualBox. Mia labormaŝino havas 2 procesorajn kernojn kaj 12GB da RAM; mi uzas SSD kiel la sisteman diskon. Mi uzos debian 8 kiel mian ĉefan evolusistemon, kun emacs, sudo, git kaj virtualbox pakaĵoj instalitaj, ĉio alia estos instalita per elŝuto de GitHub kaj aliaj fontoj. Ni instalos ĉi tiujn aplikaĵojn en /usr/local/bin krom se alie specifita. Ni komencu!

Preparado de la labormedio

Instalante Go

Ni sekvas la instrukciojn de la oficiala retejo:

$ 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

Kontrolante funkciojn:

$ 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

Instalante faas-cli

Ni sekvas la instrukciojn de la oficiala retejo:

$ 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

Aldone, vi povas ebligi bash-completion:

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

Instalado kaj agordo de Kubernetes

Por disvolviĝo, minikube sufiĉas, do instalu ĝin kaj kubelet en /usr/local/bin, kaj instalu helm por instali aplikaĵojn:

$ 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

Lanĉu 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"

Ni kontrolas:

$ 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

Instalante OpenFaaS

La programistoj rekomendas krei 2 nomspacojn por labori kun:

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

Aldonu deponejon por helm:

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

La diagramo havas la kapablon agordi pasvorton antaŭ instalado, ni uzu ĝin kaj konservu la alirdatumojn kiel k8s-sekreton:

$ 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

Ni disfaldu:

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

Post iom da tempo, ni rulas la proponitan komandon:

$ 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

Kontrolante funkciojn:

$ 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

Instalante Mongodb

Ni instalas ĉion uzante 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

Ni kontrolas:

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

Premu ctrl+D por eliri la ujon.

Agordi emacs

Principe ĉio jam estis agordita laŭ ĉi tiu artikolo, do mi ne eniros en detalojn.

Malkonstrui la ludon en funkciojn

Interago kun funkcioj estas efektivigita per la http-protokolo, fin-al-fina konfirmo inter malsamaj funkcioj estas disponigita fare de JWT. Mongodb estas uzata por stoki ĵetonojn, same kiel ludstato, ludantodatenoj, sekvencoj de movoj de ĉiuj ludoj kaj aliaj informoj. Ni rigardu pli detale la plej interesajn funkciojn.

registriĝo

La enigo de ĉi tiu funkcio estas JSON kun la ludmoknomo kaj pasvorto. Kiam ĉi tiu funkcio estas vokita, oni kontrolas, ke ĉi tiu kaŝnomo ne estas en la datumbazo; se la kontrolo estas sukcesa, la kaŝnomo kaj pasvorta hash estas enmetitaj en la datumbazon. Registrado necesas por aktive partopreni la ludon.

eniro

La funkcio-enigo estas JSON kun ludnomo kaj pasvorto; se estas kromnomo en la datumbazo kaj la pasvorto estas sukcese kontrolita kun tiu antaŭe konservita en la datumbazo, JWT estas resendita, kiu devas esti transdonita al aliaj funkcioj kiam ili estas. vokis. Diversaj servaj registroj ankaŭ estas enmetitaj en la datumbazon, ekzemple, lasta ensaluttempo, ktp.

Rigardu liston de ludoj

Ĉiu neaŭtorizita uzanto povas peti liston de ĉiuj ludoj krom aktivaj. Rajtigita uzanto ankaŭ vidas liston de aktivaj ludoj. La rezulto de la funkcio estas JSON enhavanta listojn de ludoj (ludidentigilo, homlegebla nomo, ktp.).

Ludokreado

La funkcio funkcias nur kun rajtigitaj uzantoj; la maksimuma nombro da ludantoj estas akceptita ĉe la enigo, same kiel ludparametroj (ekzemple, kiujn karakterojn aktivigi en ĉi tiu ludo, la maksimuma nombro da ludantoj, ktp.). Aparta parametro de la ludo estas la ĉeesto de pasvorto por aliĝi, kiu permesas krei nepublikajn ludojn. Defaŭlte, publika ludo estas kreita. La rezulto de la funkcio estas JSON, kiu enhavas krean sukcesan kampon, unikan ludidentigilon kaj aliajn parametrojn.

Aliĝi al la ludo

La funkcio funkcias nur kun rajtigitaj uzantoj, la enigo estas la ludidentigilo kaj ĝia pasvorto, se ĉi tio estas nepublika ludo, la eligo estas JSON kun la ludparametroj. La rajtigita uzanto kiu aliĝis al la ludo, same kiel la kreinto de la ludo, estas ĉi-poste nomitaj ludpartoprenantoj.

Vidante ludajn eventojn

Ĉiu neaŭtorizita uzanto povas peti liston de eventoj por neaktivaj ludoj, kaj rajtigita uzanto povas ricevi liston de eventoj por iu ajn aktiva ludo. Kroma parametro al la funkcio povas esti la okazaĵa numero, kiun la uzanto jam havas. En ĉi tiu kazo, nur tiuj eventoj kiuj okazis poste estos resenditaj en la listo. Periode lanĉante ĉi tiun funkcion, rajtigita uzanto rigardas tion, kio okazas en la ludo. Ĉi tiu funkcio ankaŭ resendas agpeton, al kiu la uzanto povas respondi uzante la okazaĵan sendofunkcion de la ludo.

Sendante ludeventon

La funkcio funkcias nur por partoprenantoj de la ludo: eblas komenci la ludon, fari movon, voĉdoni, skribi tekstmesaĝon, kiu estas montrata en la listo de ludaj eventoj, ktp.
La rajtigita uzanto kiu kreis la ludon komencas distribui rolojn al ĉiuj partoprenantoj en la ludo, inkluzive de ili mem, ili devas konfirmi sian rolon uzante la saman funkcion. Post kiam ĉiuj roloj estas konfirmitaj, la ludo aŭtomate ŝanĝas al nokta reĝimo.

Ludaj statistikoj

La funkcio funkcias nur por ludpartoprenantoj; ĝi montras la staton de la ludo, la liston kaj nombron da ludantoj (moknomoj), rolojn kaj ilian staton (movo farita aŭ ne), same kiel aliajn informojn. Kiel ĉe la antaŭa funkcio, ĉio funkcias nur por ludpartoprenantoj.

Periode lanĉitaj funkcioj

Se la ludo ne estis lanĉita dum iom da tempo specifita dum kreado de la ludo, ĝi estos aŭtomate forigita de la listo de aktivaj ludoj uzante la klaran funkcion.

Alia perioda tasko estas la deviga ŝanĝado de la ludreĝimo de nokto al tago kaj reen por ludoj por kiuj tio ne okazis dum la turno (ekzemple, ludanto, kiu bezonas reagi al ludokazaĵo, ne sendis sian solvon ial). ).

Anonco

  • Enkonduko
  • Agordi la evoluan medion, malkonstruante la taskon en funkciojn
  • Backend laboro
  • Frontend-laboro
  • Starigante CICD, organizante testadon
  • Komencu provludan sesion
  • Rezultoj

fonto: www.habr.com

Aldoni komenton