„Új Bájok”. Fokozatosan esszük meg az elefántot

„Új Bájok”. Fokozatosan esszük meg az elefántot

Ebben a cikkben beállítom a "Bylina" játék fejlesztési környezetét, és magát a játékot részekre bontom, amelyeket használni tudunk az OpenFaaS-ban. Mindezeket Linuxon fogom elvégezni, a Kubernetes-t a minikube-on fogom telepíteni a VirtualBox használatával. A munkagépen 2 processzormag és 12 GB RAM található, a rendszerlemez SSD-t használ. A fejlesztéshez debian 8-at fogok használni, telepített emacs, sudo, git és virtualbox csomagokkal, minden mást pedig a GitHub és más források letöltésével telepítek. Ezeket az alkalmazásokat a /usr/local/bin könyvtárba fogom telepíteni, hacsak nem jeleztem máshol. Kezdjünk hozzá!

A munkakörnyezet előkészítése

A Go telepítése

Kövesd az hivatalos weboldalon található utasításokat:

$ 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

A működés ellenőrzése:

$ 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

faas-cli telepítése

Kövesd az hivatalos weboldalon található utasításokat:

$ curl -sSL https://cli.openfaas.com | sudo -E sh
x86_64
Csomag letöltése: https://github.com/openfaas/faas-cli/releases/download/0.11.3/faas-cli a /tmp/faas-cli-ra
Letöltés befejezve.

Elégséges engedéllyel megpróbáljuk áthelyezni a faas-cli-t a /usr/local/bin-ba
Az új verzió a faas-cli telepítve lett a /usr/local/bin-ba.
'faas' alias létrehozása a 'faas-cli'-hez.
  ___                   _____           ____
 / _  _ __   ___ _ __ |  ___|_ _  __ _/ ___|
| | | | '_  / _  '_ | |_ / _` |/ _` ___ 
| |_| | |_) |  __/ | | |  _| (_| | (_| |___) |
 ___/| .__/_ ___|_| |_|_|  __,_|__,_|____/
      |_|

CLI:
 commit:  73004c23e5a4d3fdb7352f953247473477477a64
 verzió: 0.11.3

Továbbá lehetőség van a bash-completion használatának bekapcsolására:

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

Kubernetes telepítése és beállítása

A fejlesztéshez elegendő a minikube, ezért telepítjük a minikube-ot és a kubelet-et a /usr/local/bin könyvtárba, az alkalmazások telepítéséhez emellett telepítjük a helm-et is:

$ 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

Minikube elindítása:

$ minikube start
  minikube v1.6.2 Debian 8.11-en
  Automatikusan a 'virtualbox' meghajtót választotta (alternatívák: [])
  VM indító kép letöltése ...
    > 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
  Virtualbox VM létrehozása (CPU=2, Memória=8192MB, Lemez=20000MB) ...
  Kubernetes v1.17.0 előkészítése a Docker '19.03.5'-ön ...
  kubeadm v1.17.0 letöltése
  kubelet v1.17.0 letöltése
  Képek letöltése ...
  Kubernetes indítása ...  Várakozás a klaszter online állapotára ...
  Kész! A kubectl most már a "minikube"-ot használja

Ellenőrizzük:

$ kubectl get pods --all-namespaces
NAMESPACE     NAME                               READY   STATUS    RESTARTS   AGE
kube-system   coredns-6955765f44-knlcb           1/1     Futtatásban   0          29m
kube-system   coredns-6955765f44-t9cpn           1/1     Futtatásban   0          29m
kube-system   etcd-minikube                      1/1     Futtatásban   0          28m
kube-system   kube-addon-manager-minikube        1/1     Futtatásban   0          28m
kube-system   kube-apiserver-minikube            1/1     Futtatásban   0          28m
kube-system   kube-controller-manager-minikube   1/1     Futtatásban   0          28m
kube-system   kube-proxy-hv2wc                   1/1     Futtatásban   0          29m
kube-system   kube-scheduler-minikube            1/1     Futtatásban   0          28m
kube-system   storage-provisioner                1/1     Futtatásban   1          29m

OpenFaaS telepítése

A fejlesztők ajánlják, hogy 2 namespace-et hozzunk létre a munkához:

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

Hozzáadjuk a helm tárolót:

$ helm repo add openfaas https://openfaas.github.io/faas-netes/
"openfaas" hozzáadva a tárolókhoz

A chartban lehetőség van jelszó megadására a telepítés előtt, ezt kihasználva titkos adatokat mentünk k8s formájában:

$ 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 létrehozva

A telepítést végrehajtjuk:

$ helm repo update
Tartsd magad nehezen, amíg a legújabbakat beszerezzük a chart tárolókból...
...Sikeresen frissítettük az "openfaas" chart tárolót
Frissítés befejezve.  Jó Helming!
$ helm upgrade openfaas --install openfaas/openfaas --namespace openfaas --set functionNamespace=openfaas-fn --set generateBasicAuth=false
A "openfaas" kiadás nem létezik. Most telepítjük.
NÉV: openfaas
UTOLSÓ TELEPÍTÉS: 2019. dec. 25. 10:28:22
NAMESPACE: openfaas
ÁLLAPOT: telepítve
REVÍZIÓ: 1
TESZTLAP: Nincs
MEGJEGYZÉSEK:
A nyitás ellenőrzéséhez futtassa:

  kubectl -n openfaas get deployments -l "release=openfaas, app=openfaas"

Néhány idő múlva futtassuk a javasolt parancsot:

$ kubectl -n openfaas get deployments -l "release=openfaas, app=openfaas"
NÉV                KÉSZ   FRISS   ELÉRHETŐ   KOR
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

A működés ellenőrzése:

$ kubectl rollout status -n openfaas deploy/gateway
deployment "gateway" sikeresen kiépítve
$ kubectl port-forward -n openfaas svc/gateway 8080:8080 &
[1] 6985
Továbbítás a 127.0.0.1:8080 -> 8080 porttól
$ echo -n $PASSWORD | faas-cli login --username admin --password-stdin
Az OpenFaaS szerverhez való csatlakozás a hitelesítő adatok érvényesítéséhez...
Kapcsolat kezelés 8080-ra
FIGYELMEZTETÉS! A kommunikáció nem biztonságos, kérjük, fontolja meg a HTTPS használatát. A Letsencrypt.org ingyenes SSL/TLS tanúsítványokat kínál.
hitelesítők elmentve az admin számára http://127.0.0.1:8080
$ faas-cli list
Funkció                        Hívások     Másolatok

Mongodb telepítése

Minden telepítése helm használatával:

$ helm repo add stable https://kubernetes-charts.storage.googleapis.com/
"stable" hozzáadva a tárolóidhoz
$ helm install stable/mongodb --generate-name
NÉV: mongodb-1577466908
UTOLSÓ TELEPÍTÉS: 2019. dec. 25. 11:15:11
NÉVTER: default
ÁLLAPOT: telepítve
REVÍZIÓ: 1
TESZTSOROZAT: Nincs
MEGJEGYZÉSEK:
** Kérjük, légy türelmes, amíg a diagram telepítve van **

A MongoDB elérhető a 27017 porton a következő DNS név alatt a klaszteren belül:

    mongodb-1577466908.default.svc.cluster.local

A gyökér jelszó megszerzéséhez futtassa:

    export MONGODB_ROOT_PASSWORD=$(kubectl get secret --namespace default mongodb-1577466908 -o jsonpath="{.data.mongodb-root-password}" | base64 --decode)

Az adatbázisához való csatlakozáshoz futtassa a következő parancsot:

    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

Ha az adatbázisához kívülről szeretne csatlakozni, futtassa a következő parancsokat:

    kubectl port-forward --namespace default svc/mongodb-1577466908 27017:27017 &
    mongo --host 127.0.0.1 --authenticationDatabase admin -p $MONGODB_ROOT_PASSWORD

Ellenőrizzük:

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)
Ha nem lát parancssort, próbáljon meg enter-t nyomni.

> db.version();
4.0.14

Nyomja meg a ctrl+D kombinációt a konténerből való kilépéshez.

Emacs beállítása

Alapvetően az összes beállítás már megvolt a cikkben, így nem írom le részletesen.

A játék funkciókra bontása

A funkciókkal való interakció HTTP protokollon keresztül történik, a különböző funkciók közötti átjáró hitelesítés JWT-t biztosít. A tokenek, valamint a játék állapota, a játékosok adatai, a játékok lépéseinek sorozatai és egyéb információk tárolására a mongodb-t használják. Vizsgáljuk meg közelebbről a legérdekesebb funkciókat.

Registration

A funkció bemeneti paraméterei egy JSON, amely játékbeli álnevet és jelszót tartalmaz. Amikor ezt a funkciót hívják, ellenőrzik, hogy az álnaév nincs-e már az adatbázisban; a sikeres ellenőrzés után az álnevet és a jelszó hash-t az adatbázisba illesztik. A regisztráció szükséges a játék aktív részvételéhez.

Bemenet

A funkció bemenete egy JSON, amely tartalmazza a játékos álnevé és jelszavát. Ha az álnev szerepel az adatbázisban és a jelszó sikeresen ellenőrzésre került, egy JWT-t kapunk vissza, amelyet más funkciók hívásakor át kell adni. Emellett különféle szolgáltatási bejegyzések is létrejönnek az adatbázisban, például az utolsó belépés ideje stb.

Játéklisták megtekintése

Bármely nem bejelentkezett felhasználó kérheti az összes játék listáját, kivéve az aktívakat. A bejelentkezett felhasználók az aktív játékok listáját is látják. A funkció eredménye egy JSON, amely tartalmazza a játékok listáját (játék azonosító, ember számára olvasható név stb.).

Játék készítése

A funkció kizárólag bejelentkezett felhasználókra vonatkozik, a bemenet a maximális játékosok száma és a játék paraméterei (például, hogy mely karakterek aktiválódjanak a játékban, maximális játékosok száma stb.). A játék külön paramétere a csatlakozási jelszó megléte, amely lehetővé teszi privát játékok létrehozását. Alapértelmezés szerint egy nyilvános játék jön létre. A funkció végrehajtásának eredménye egy JSON, amely tartalmazza a létrehozás sikerességét, a játék egyedi azonosítóját, valamint egyéb paramétereit.

Csatlakozás a játékhoz

A funkció kizárólag bejelentkezett felhasználók számára érhető el, a bemenet a játék azonosítója és jelszava, ha az privát játék. A kimenet egy JSON, amely tartalmazza a játék paramétereit. A játékhoz csatlakozó bejelentkezett felhasználó, valamint a játék létrehozója ezután a játék résztvevőinek számítanak.

A játék eseményeinek megtekintése

Bármely nem bejelentkezett felhasználó kérheti az inaktív játékok eseményeinek listáját, míg a bejelentkezett felhasználók az összes aktív játék eseményeit kapják meg. A funkciónak további paraméterként átadható az esemény száma, amely már megvan a felhasználónak. Ebben az esetben csak azokat az eseményeket kapja vissza, amelyek később történtek. A funkció időszakos hívásával a bejelentkezett felhasználó figyelemmel kísérheti, mi történik a játékban. E funkció emellett kérdést is létrehoz egy tevékenységre, amelyre a felhasználó reagálhat a játék eseményének küldésével.

A játék eseményének küldése

A funkció csak a játék résztvevői számára működik: lehetőség nyílik a játék elindítására, lépés megtételére, szavazásra, szöveges üzenet írására, amely a játék eseményeinek listájában megjelenik, stb.
A játékot létrehozó hitelesített felhasználó kiosztja a szerepeket minden játékosnak, beleértve önmagát is, akiknek meg kell erősíteniük a szerepüket ugyanazzal a funkcióval. Amint minden szerep megerősítésre kerül, a játék automatikusan éjszakai üzemmódba kapcsol.

A játék statisztikája

A funkció csak a játék résztvevői számára működik, megmutatja a játék állapotát, a játékosok (álnevek) listáját és számát, a szerepeket és azok státuszát (lépés megtéve, vagy nem), valamint egyéb információkat. Mint az előző funkciónál, minden csak a játék résztvevői számára működik.

Időszakosan futó funkciók

Ha a játék nem indult el egy bizonyos időn belül, amelyet a játék létrehozásakor adtak meg, automatikusan törlésre kerül az aktív játékok listájából a tisztítás funkció révén.

Még egy időszakos feladat – a játék üzemmódjának kényszerített váltása éjszakáról nappalra és vissza, azok számára a játékok számára, ahol ez nem történt meg a lépés során (például, ha a játékos, akinek reagálnia kell a játék eseményére, nem küldte el a döntését valamilyen okból).

Bejelentés

  • Bevezetés
  • Fejlesztési környezet telepítése, a feladatok funkciókra bontása
  • Backend munkák
  • Frontend munkák
  • CICD beállítása, tesztelés megszervezése
  • A játék próbaidőszakának indítása
  • Összegzés

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster