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!
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:
$ 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 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). ).