„Нови епови”. Једемо слона у деловима

„Нови епови”. Једемо слона у деловима

У овом чланку ћу поставити радно окружење за развој игре „Епицс“, а такође ћу разбити саму игру на делове погодне за коришћење у ОпенФааС-у. Урадићу све манипулације на Линук-у, поставићу Кубернетес у миникубе користећи ВиртуалБок. Моја радна машина има 2 језгра процесора и 12 ГБ РАМ-а; користим ССД као системски диск. Користићу дебиан 8 као мој главни развојни систем, са инсталираним пакетима емацс, судо, гит и виртуелбок, све остало ће бити инсталирано преузимањем са ГитХуб-а и других извора. Ове апликације ћемо инсталирати у /уср/лоцал/бин осим ако није другачије назначено. Хајде да почнемо!

Припрема радног окружења

Инсталирање Го

Пратимо упутства са званичног сајта:

$ 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

Провера функционалности:

$ 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

Инсталирање фаас-цли

Пратимо упутства са званичног сајта:

$ 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

Поред тога, можете омогућити довршавање басх-а:

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

Инсталирање и конфигурисање Кубернетеса

За развој је довољан миникубе, па га инсталирајте и кубелет у /уср/лоцал/бин, и инсталирајте хелм за инсталирање апликација:

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

Проверавамо:

$ 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

Инсталирање ОпенФааС-а

Програмери препоручују креирање 2 именска простора за рад са:

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

Додајте спремиште за кормило:

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

Графикон има могућност постављања лозинке пре инсталације, хајде да је користимо и сачувамо приступне податке као к8с тајну:

$ 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

Хајде да распоредимо:

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

Након неког времена, покрећемо предложену команду:

$ 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

Провера функционалности:

$ 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

Инсталирање Монгодб-а

Све инсталирамо помоћу кормила:

$ 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

Проверавамо:

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

Притисните цтрл+Д да изађете из контејнера.

Подешавање емацса

У принципу, све је већ било конфигурисано према Овај чланак, па нећу улазити у детаље.

Растављање игре на функције

Интеракција са функцијама се врши преко хттп протокола, енд-то-енд аутентификацију између различитих функција обезбеђује ЈВТ. Монгодб се користи за чување токена, као и стања игре, података играча, секвенци потеза свих игара и других информација. Хајде да детаљније погледамо најзанимљивије карактеристике.

регистрација

Улаз ове функције је ЈСОН са надимком игре и лозинком. Када се ова функција позове, проверава се да овај псеудоним није у бази података; ако је провера успешна, псеудоним и хеш лозинке се убацују у базу података. За активно учешће у игри потребна је регистрација.

улаз

Унос функције је ЈСОН са надимком игре и лозинком; ако постоји надимак у бази података и лозинка је успешно верификована са оном која је претходно сачувана у бази, враћа се ЈВТ, који се мора проследити другим функцијама када се зове. У базу података се убацују и различити сервисни записи, на пример време последњег пријављивања итд.

Погледајте листу игара

Сваки неовлашћени корисник може затражити списак свих игара осим активних. Овлашћени корисник такође види листу активних игара. Резултат функције је ЈСОН који садржи листе игара (ИД игре, људско читљиво име, итд.).

Креирање игре

Функција ради само са овлашћеним корисницима, на улазу се прихвата максималан број играча, као и параметри игре (на пример, које ликове активирати у овој игрици, максималан број играча итд.). Посебан параметар игре је присуство лозинке за придруживање, која вам омогућава да креирате игре које нису јавне. Подразумевано се креира јавна игра. Резултат функције је ЈСОН, који садржи поље за успех креирања, јединствени идентификатор игре и друге параметре.

Придруживање игри

Функција ради само са овлашћеним корисницима, улаз је ИД игре и њена лозинка, ако је ово нејавна игра, излаз је ЈСОН са параметрима игре. Овлашћени корисник који је приступио игри, као и креатор игре, у даљем тексту се називају учесници игре.

Преглед догађаја у игри

Сваки неовлашћени корисник може затражити листу догађаја за неактивне игре, а овлашћени корисник може добити листу догађаја за било коју активну игру. Додатни параметар функцији може бити број догађаја који корисник већ има. У овом случају, само они догађаји који су се десили касније ће бити враћени на листу. Повременим покретањем ове функције, овлашћени корисник прати шта се дешава у игрици. Ова функција такође враћа захтев за акцију, на који корисник може да одговори помоћу функције за слање догађаја у игри.

Слање догађаја игре

Функција ради само за учеснике игре: могуће је започети игру, направити потез, гласати, написати текстуалну поруку која се приказује на листи догађаја игре итд.
Овлашћени корисник који је креирао игру почиње да дели улоге свим учесницима у игри, укључујући и себе, они морају потврдити своју улогу користећи исту функцију. Када су све улоге потврђене, игра се аутоматски пребацује у ноћни режим.

Статистика игре

Функција ради само за учеснике игре, приказује стање у игри, списак и број играча (надимке), улоге и њихов статус (покрет направљен или не), као и друге информације. Као и код претходне функције, све ради само за учеснике игре.

Периодично покренуте функције

Ако игра није била покренута неко време наведено при креирању игре, аутоматски ће бити уклоњена са листе активних игара помоћу функције брисања.

Други периодични задатак је принудно пребацивање режима игре из ноћног у дан и назад за игре за које се то није десило током окрета (на пример, играч који треба да реагује на догађај у игри није из неког разлога послао своје решење ).

Најава

  • Увод
  • Постављање развојног окружења, разбијање задатка на функције
  • Бацкенд рад
  • Фронтенд рад
  • Постављање ЦИЦД-а, организовање тестирања
  • Започните пробну игру
  • Резултати

Извор: ввв.хабр.цом

Додај коментар