
Այս հոդվածում ես պատրաստվում եմ կարգավորել խաղի «Բիлинներ» զարգացման աշխատանքային միջավայրը, ինչպես նաև խոտորել հենց խաղը մասերի, որոնք կարելի է օգտագործել 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, worldfaas-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-cliKubernetes-ի տեղադրում և կարգավորում
Վ 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 29mOpenFaaS-ի տեղադրումը
Աναշուշնողները խորհուրդ են տալիս ստեղծել 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 ReplicasMongodb-ի տեղադրումը
Ներդնում ենք բոլորը օգտագործելով 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
