«Նոր Բիկոլներ»։ Գնում ենք սպանում մասերով։

«Նոր Բիկոլներ»։ Գնում ենք սպանում մասերով։

Այս հոդվածում ես պատրաստվում եմ կարգավորել խաղի «Բիлинներ» զարգացման աշխատանքային միջավայրը, ինչպես նաև խոտորել հենց խաղը մասերի, որոնք կարելի է օգտագործել OpenFaaS-ում: Բոլոր գործողությունները կիրականացվեն Linux-ով, Kubernetes-ը կտեղադրեմ minikube-ում VirtualBox-ից օգտվելով: Իմ աշխատանքային մեքենայում կան 2 պրոցեսորային միջուկ եւ 12 ԳԲ оперативной памяти, որպես համակարգային սկավառակ ես օգտագործում եմ SSD: Կարգավորման հիմնական համակարգը կլինի Debian 8, որը կիրառելու եմ emacs, sudo, git և virtualbox փաթեթներով, մյուսը կտեղադրեմ GitHub-ից եւ այլ աղբյուրներից ներբեռնմամբ: Այս ծրագրակազմերը կտեղադրեմ /usr/local/bin-ում, եթե այլ կերպ չնշվի: Սկսենք:

Աշխատանքային միջավայրի նախապատրաստում

Go տեղադրում

Օգտագործենք պաշտոնական կայքի հրահանգները.

$ 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

faas-cli-ի տեղադրում

Օգտագործենք պաշտոնական կայքի հրահանգները.

$ curl -sSL https://cli.openfaas.com | sudo -E sh
x86_64
Ներբեռնումը՝ https://github.com/openfaas/faas-cli/releases/download/0.11.3/faas-cli դեպի /tmp/faas-cli
Ներբեռնումը ավարտված է.

Ամենաբավարար իրավունքներով փորձելու faas-cli-ն տեղադրել /usr/local/bin-ում
 faas-cli-ի նոր տարբերակը տեղադրված է /usr/local/bin-ում
'faas' մականունը ստեղծվել է 'faas-cli' համար.
  ___                   _____           ____
 / _  _ __   ___ _ __ |  ___|_ _  __ _/ ___|
| | | | '_  / _  '_ | |_ / _` |/ _` ___ 
| |_| | |_) |  __/ | | |  _| (_| | (_| |___) |
 ___/| .__/_ ___|_| |_|_|  __,_|__,_|____/
      |_|

CLI:
 commit:  73004c23e5a4d3fdb7352f953247473477477a64
 version: 0.11.3

Ավելին, հնարավոր է միացնել bash-completion-ը:

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

Kubernetes-ի տեղադրում և կարգավորում

Վ Entwicklungs-ին բավարար է minikube-ը, ուստի եկեք տեղադրենք այն և kubelet /usr/local/bin-ում, թումբ կապելու համար նույնպես տեղադրենք helm:

$ 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-ը:

$ minikube start
  minikube v1.6.2 on Debian 8.11
  Ավտոմատ կերպով ընտրված է 'virtualbox' կողմնակից (վიზանիներ: [])
  Բեռնում է VM-ի բեռնանկարիչը ...
    > 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 (CPUs=2, Memory=8192MB, Disk=20000MB) ...
  Աշխատանքներ Kubernetes v1.17.0 Docker-ում '19.03.5' ...
  Բեռնում kubeadm v1.17.0
  Բեռնում kubelet v1.17.0
  նկարներ ներբեռնեք ...
  Վերադարձնում է Kubernetes ...  Անցնելու համար սպասում ...
  Ավարտված է: kubectl այժմ կարգավորված է օգտագործել "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

OpenFaaS-ի տեղադրումը

Աναշուշնողները խորհուրդ են տալիս ստեղծել 2 namespace աշխատանքի համար:

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

Ավելացնելով helm ռեպոզիտորը:

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

Չարտի մեջ կա հնարավորությունը նախնական գաղտնաբառ սահմանել տեղադրման համար, օգտագործենք այն և պահպանենք մուտքի տվյալները որպես 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

Եկեք իրականացնենք տեղադրումը:

$ 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

Mongodb-ի տեղադրումը

Ներդնում ենք բոլորը օգտագործելով helm:

$ helm repo add stable https://kubernetes-charts.storage.googleapis.com/
"stable"  է ավելացվել ձեր ռեպոզիտորիաներին
$ helm install stable/mongodb --generate-name
NAME: mongodb-1577466908
LAST DEPLOYED: Վրա Դեկ 25 11:15:11 2019
NAMESPACE: default
STATUS: տեղադրված
REVISION: 1
TEST SUITE: Ոչ
NOTES:
** Խնդրում ենք համբերատար լինել, մինչեւ չարտադրվում է սխեման **

MongoDB- ին կարելի է մուտք գործել 27017 փողոցով ձեր կլաստերի հետեւյալ DNS անունով:

    mongodb-1577466908.default.svc.cluster.local

Վերապատասխանելու համար[root] գաղտնաբառը կատարեք:

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

Ձեր տվյալներին միանալու համար կատարեք հետեւյալ հրամանը:

    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

Ձեր տվյալներին միանալու համար արտաքնից կատարեք հետեւյալ հրամանները:

    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)
Եթե դուք ցուցակի հրամանը չեք տեսնում, փորձեք սեղմել ընթերցել:

> db.version();
4.0.14

Սեղմեք ctrl+D արկղից դուրս գալու համար:

emacs-ի կարգավորում

Հիմնականում, ամեն ինչ արդեն կարգավորված էր այս հոդվածի, այնպես որ մանրամասները չեմ նկարագրի:

Խաղի ֆունկցիաների բաժանում

Ֆունկցիաների հետ փոխգործակցումը կատարվում է http պրոտոկոլի միջոցով, տարբեր ֆունկցիաների միջեւ անցանկալի կնքումը ապահովում է JWT: Խաղի արկղերով, խաղացողների տեղեկատվությամբ, բոլոր խաղերի քայլերի հաջորդականությամբ և այլ տեղեկատվությամբ ներմուծվում է mongodb: Եկեք ավելի մանրամասն անդրադառնանք առավել հետաքրքիր ֆունկցիաներին:

Գրանցում

Այս ֆունկցիայի մուտքը — JSON խաղի էլեկտրոնային հասցեն և գաղտնաբառը: Այս ֆունկցիայի կանխումը ծավալում է տվյալ հասցեն տվյալներում չլինելու ստուգումը, հաջող ստուգման դեպքում՝ հասցեն և գաղտնաբառի էջի ներմուծումը տվյալների բազան: Գրանցումը անհրաժեշտ է խաղում ակտիվ մասնակցության համար:

Մուտք

Այս ֆունկցիայի մուտքը — JSON խաղի էլեկտրոնային հասցեն և գաղտնաբառը, եթե հասցեն ներմուծված լինի տվյալներում և գաղտնաբառը հաջող ստուգվի՝ վերադարձվում է JWT, որը պետք է փոխանցվի այլ ֆունկցիաներին նրանց կանչման ժամանակ: Կատարելու համար տվյալների բազայում ավելացվում են տարբեր ծառայողական գրառումներ, օրինակ՝ վերջին մուտքի ժամանակն և այլն:

Խաղերի ցուցակի դիտում

Որպեսզի ոչ մի առանցավորված օգտագործող կարող է խնդրել բոլոր խաղերի ցուցակը, բացի ակտիվներից: Ապահովված օգտագործողը տեսնում է նաև ակտիվ խաղերի ցուցակը: Ֆունկցիայի արդյունքը — JSON, որը պարունակում է խաղերի ցուցակները (խաղի նույնականող, մարդու համար ընթերցվող անուն և այլն):

Խաղ ստեղծելը

Ֆունկցիան գործում է միայն ճանաչված օգտատերերի համար, մուտքում ընդունվում է խաղավող խաղացողների առավելագույն թիվը, ինչպես նաև խաղի պարամետրերը (օրինակ, նշանակել մասնակիցներին այս խաղում, առավելագույն խաղացողների թիվ և այլն): Խաղի առանձնահատուկ պարամետրը գաղտնաբառի առկայությունն է, որը թույլ է տալիս ստեղծել ոչ հանրային խաղեր: Դեֆոլտ սխալ ստեղծվում է հանրային խաղ: Ֆունկցիայի կատարումն արդյունքն է JSON- ում, որտեղ կա ստեղծման հաջողության դաշտ, խաղի յուրահատուկ նույնականիչը, ինչպես նաև այլ պարամետրեր։

Խաղին միանալ

Ֆունկցիան գործում է միայն ճանաչված օգտատերերի համար, մուտքում — խաղի նույնականիչ և դրա գաղտնաբառը, եթե սա ոչ հանրային խաղ է, ելքում — JSON խաղի պարամետրերով: Թույլատրված օգտատերը, ով միացել է խաղին, ինչպես նաև խաղի ստեղծողը, հետագայում կդիտարկվեն խաղի մասնակիցներ։

Խաղի իրադարձությունների դիտում

Մ любой չճանաչված օգտատեր կարող է խնդրել ոչ ակտիվ խաղերի իրադարձությունների ցուցակը, իսկ ճանաչված օգտատերը կարող է ստանալ ակտիվ խաղի բոլոր իրադարձությունների ցուցակը: Ֆունկցիայի լրացուցիչ պարամետրը կարող է լինել իրադարձության համարը, որը արդեն ունի օգտատերը: Այս դեպքում ցուցակում կվերադառնան միայն այն իրադարձությունները, որոնք տեղի են ունեցել ավելի ուշ: Պարբերականորեն այս ֆունկցիան սկսելով, ճանաչված օգտատերը տեսնում է, թե ինչ է պատահում խաղում։ Այս ֆունկցիան նաև վերադարձնում է գործողության խնդրանք, որի վրա օգտատերը կարող է արձագանքել խաղի իրադարձություն ուղարկելու ֆունկցիայի միջոցով։

Խաղի իրադարձության ուղարկում

Ֆունկցիան գործում է միայն խաղի մասնակիցների համար: Մե կարող եք մեկնարկել խաղը, կատարել քայլ, քվեարկել, գրել տեքստային հաղորդագրություն, որը երևում է խաղի իրադարձությունների ցուցակում և այլն։
Անձնապես ճանաչված օգտատերը, որը ստեղծել է խաղը, սկսում է դերային բաժանորդագրման ընթացքը բոլոր մասնակիցներին, ներառյալ իրեն, նրանք պետք է հաստատեն իրենց դերը այս ֆունկցիայի միջոցով: Երբ բոլոր դերերը հաստատված են, խաղը ավտոմատ կերպով անցնում է գիշերային ռեժիմի։

Խաղի վիճակագրություն

Ֆունկցիան գործում է միայն խաղի մասնակիցների համար, ցույց է տալիս խաղի վիճակը, մասնակիցների ցուցակը և թիվը (նոնները), դերերը և նրանց կարգավիճակը (կայացած է քայլ, կամ ոչ), ինչպես նաև այլ տեղեկություններ: Մինչև նախորդ ֆունկցիայի համար, բոլորն աշխատում են միայն խաղի մասնակիցների համար։

Պարբերաբար սկսվող ֆունկցիաներ

Եթե խաղը միրգ չի մեկնարկել որոշակի ժամանակահատվածում, որը նշվել է խաղի ստեղծման ժամանակ, այն ավտոմատ կերպով ջնջվել է ակտիվ խաղերի ցուցակից մաքրող ֆունկցիայի միջոցով։

Մեկ այլ պարբերական առաջադրանք է` ստիպողական գիշերային ռեժիմի փոխել օրը և հակառակը այն խաղերի համար, որոնց հետ դա չի ծավալվել քայլի ժամանակ (օրինակ, խաղացողը, որը պետք է արձագանքի խաղային իրադարձությանը, չի ուղարկել իր որոշումը պատճառներով)։

Հայտարարություն

  • Ներածություն
  • Ներածական միջավայրի կարգավորում, խնդրի բաժանում ֆունկցիաների
  • Backend-ի աշխատանքներ
  • Frontend-ի աշխատանքներ
  • CICD-ի կարգավորում, փորձարկման կազմակերպում
  • Խաղի փորձնական նստաշրջանի մեկնարկ
  • Եզրակացություններ

Ընտանիք: habr.com

Գնել հուսալի հյուրընկալում DDoS պաշտպանությամբ, VPS VDS սերվերներով 🔥 Գնել հուսալի հյուրընկալում DDoS պաշտպանությամբ, VPS VDS սերվերներով | ProHoster