
I den hÀr artikeln kommer jag att stÀlla in en utvecklingsmiljö för spelet "Byliny" och ocksÄ bryta ner sjÀlva spelet i delar som kan anvÀndas i OpenFaaS. Jag kommer att göra alla manipulationer pÄ Linux, och Kubernetes kommer att köras i minikube med hjÀlp av VirtualBox. Min arbetsmaskin har 2 processorkÀrnor och 12 GB RAM, och jag anvÀnder SSD som systemdisk. Som huvudsakligt utvecklingssystem kommer jag att anvÀnda Debian 8 med installerade paketen emacs, sudo, git och virtualbox, och allt annat kommer jag att installera genom att ladda ner frÄn GitHub och andra kÀllor. Dessa applikationer kommer att installeras i /usr/local/bin, om inget annat anges. LÄt oss börja!
Förberedelse av arbetsmiljö
Installation av Go
Följ instruktionerna pÄ den officiella webbplatsen:
$ 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' >> ~/.profileKontrollera funktionaliteten:
$ 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, worldInstallation av faas-cli
Följ instruktionerna pÄ den officiella webbplatsen:
$ curl -sSL https://cli.openfaas.com | sudo -E sh
x86_64
Laddar ner paket https://github.com/openfaas/faas-cli/releases/download/0.11.3/faas-cli som /tmp/faas-cli
Nedladdning klar.
Körs med tillrÀckliga behörigheter för att försöka flytta faas-cli till /usr/local/bin
Ny version av faas-cli installerad till /usr/local/bin
Skapar alias 'faas' för 'faas-cli'.
___ _____ ____
/ _ _ __ ___ _ __ | ___|_ _ __ _/ ___|
| | | | '_ / _ '_ | |_ / _` |/ _` ___
| |_| | |_) | __/ | | | _| (_| | (_| |___) |
___/| .__/_ ___|_| |_|_| __,_|__,_|____/
|_|
CLI:
commit: 73004c23e5a4d3fdb7352f953247473477477a64
version: 0.11.3Dessutom kan bash-completion kopplas in:
faas-cli completion --shell bash | sudo tee /etc/bash_completion.d/faas-cliInstallation och konfiguration av Kubernetes
För utveckling rÀcker minikube, sÄ vi installerar det och kubelet i /usr/local/bin, och för installation av program installerar vi ocksÄ 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/binStarta minikube:
$ minikube start
minikube v1.6.2 pÄ Debian 8.11
Valde automatiskt drivrutinen 'virtualbox' (alternativ: [])
Laddar ner 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
Skapar virtualbox VM (CPUs=2, Minne=8192MB, Disk=20000MB) ...
Förbereder Kubernetes v1.17.0 pÄ Docker '19.03.5' ...
Laddar ner kubeadm v1.17.0
Laddar ner kubelet v1.17.0
HĂ€mtar bilder ...
Startar Kubernetes ... VÀntar pÄ att klustret ska komma online ...
Klart! kubectl Àr nu konfigurerat för att anvÀnda "minikube"Kontrollerar:
$ kubectl get pods --all-namespaces
NAMNRYMD NAMN KLAR STATUS OMSTARTNINGAR Ă
LDER
kube-system coredns-6955765f44-knlcb 1/1 Körande 0 29m
kube-system coredns-6955765f44-t9cpn 1/1 Körande 0 29m
kube-system etcd-minikube 1/1 Körande 0 28m
kube-system kube-addon-manager-minikube 1/1 Körande 0 28m
kube-system kube-apiserver-minikube 1/1 Körande 0 28m
kube-system kube-controller-manager-minikube 1/1 Körande 0 28m
kube-system kube-proxy-hv2wc 1/1 Körande 0 29m
kube-system kube-scheduler-minikube 1/1 Körande 0 28m
kube-system storage-provisioner 1/1 Körande 1 29mInstallation av OpenFaaS
Utvecklarna rekommenderar att skapa 2 namespaces för arbete:
$ kubectl apply -f https://raw.githubusercontent.com/openfaas/faas-netes/master/namespaces.yml
namespace/openfaas skapat
namespace/openfaas-fn skapatVi lÀgger till förvaret för helm:
$ helm repo add openfaas https://openfaas.github.io/faas-netes/
"openfaas" har lagts till i dina förrÄdI diagrammet finns möjlighet att ange ett lösenord före installationen, lÄt oss anvÀnda det och spara inloggningsuppgifterna som en k8s-hemlighet:
$ 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 skapatVi genomför distributionen:
$ helm repo update
HÄll dig kvar medan vi hÀmtar det senaste frÄn dina diagramförrÄd...
...Lyckades fÄ en uppdatering frÄn "openfaas" diagramförrÄd
Uppdatering klar. Glad helming!
$ helm upgrade openfaas --install openfaas/openfaas --namespace openfaas --set functionNamespace=openfaas-fn --set generateBasicAuth=false
Release "openfaas" finns inte. Installerar det nu.
NAMN: openfaas
SIST DISTRIBUERAD: Fre Dec 25 10:28:22 2019
NAMNRYMD: openfaas
STATUS: distribuerad
REVISION: 1
TESTSUITE: Ingen
NOTER:
För att verifiera att openfaas har startat, kör:
kubectl -n openfaas get deployments -l "release=openfaas, app=openfaas"Efter en tid kör vi det föreslagna kommandot:
$ kubectl -n openfaas get deployments -l "release=openfaas, app=openfaas"
NAMN KLAR UP-TODATE TILLGĂNGLIG Ă
LDER
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 114sKontrollera funktionaliteten:
$ 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 ReplicasInstallation av Mongodb
Installerar allt med hjÀlp av 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 kan nÄs via port 27017 med följande DNS-namn frÄn inom din kluster:
mongodb-1577466908.default.svc.cluster.local
För att fÄ root-lösenordet kör:
export MONGODB_ROOT_PASSWORD=$(kubectl get secret --namespace default mongodb-1577466908 -o jsonpath="{.data.mongodb-root-password}" | base64 --decode)
För att ansluta till din databas kör följande kommando:
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
För att ansluta till din databas utanför klustret kör följande kommandon:
kubectl port-forward --namespace default svc/mongodb-1577466908 27017:27017 &
mongo --host 127.0.0.1 --authenticationDatabase admin -p $MONGODB_ROOT_PASSWORDKontrollerar:
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)
Om du inte ser en kommandoprompt, försök att trycka pÄ enter.
> db.version();
4.0.14Tryck ctrl+D för att lÀmna containern.
InstÀllning av emacs
I princip var allt redan instÀllt enligt , sÄ jag kommer inte att gÄ in pÄ detaljer.
Delning av spelet i funktioner
Interaktionen med funktionerna sker via http-protokollet, och genomgÄende autentisering mellan olika funktioner sÀkerstÀlls av JWT. För lagring av tokens, samt spelets tillstÄnd, spelardata, sekvenser av drag i alla spel och annan information anvÀnds mongodb. LÄt oss titta nÀrmare pÄ de mest intressanta funktionerna.
Registrering
IngÄngen till denna funktion Àr JSON med spelalias och lösenord. Vid anrop av denna funktion görs en kontroll av att detta alias inte finns i databasen, och vid en lyckad kontroll - infogning av aliaset och hash av lösenordet i databasen. Registrering Àr nödvÀndig för aktiv delaktighet i spelet.
IngÄng
Vid funktionen tas JSON emot med spelarnamn och lösenord, om spelarnamnet finns i databasen och lösenordet kontrolleras framgÄngsrikt mot det som tidigare sparats i databasen, returneras en JWT, som ska ges till andra funktioner vid deras anrop. Det görs ocksÄ insÀttningar i databasen av olika systemkonton, till exempel tid för senaste inloggning osv.
Visa spel lista
Alla icke-autentiserade anvÀndare kan begÀra en lista över alla spel, förutom aktiva spel. Autentiserade anvÀndare ser ocksÄ listan över aktiva spel. Resultatet av funktionen Àr JSON, innehÄllande listorna med spel (spelidentifierare, lÀttlÀst namn osv.).
Skapande av spel
Funktionen fungerar endast för autentiserade anvÀndare, ingÄngen tar emot det maximala antalet spelare samt spelets parametrar (till exempel vilka karaktÀrer som ska aktiveras i detta spel, maximalt antal spelare osv.). En specifik parameter för spelet Àr nÀrvaron av ett lösenord för att delta, vilket gör det möjligt att skapa privata spel. Som standard skapas ett offentligt spel. Resultatet av funktionen Àr en JSON som innehÄller ett fÀltsuccé för skapandet, ett unikt spelidentifierare, samt andra parametrar.
GĂ„ med i spelet
Funktionen fungerar endast för autentiserade anvÀndare, ingÄngen - spelidentifieraren och dess lösenord, om det Àr ett privat spel, och utgÄngen - JSON med spelparametrar. Den autentiserade anvÀndaren som gÄr med i spelet samt skaparen av spelet kallas sedan deltagare i spelet.
Visa spelets hÀndelser
Alla icke-autentiserade anvÀndare kan begÀra en lista över hÀndelser i inaktiva spel, medan en autentiserad anvÀndare kan fÄ lista över hÀndelser för vilket aktivt spel som helst. En ytterligare parameter för funktionen kan vara hÀndelsenummret, som redan finns för anvÀndaren. I det hÀr fallet Äterkommer endast de hÀndelser som intrÀffade senare i listan. Genom att regelbundet köra denna funktion kan den autentiserade anvÀndaren se vad som hÀnder i spelet. Funktionen returnerar ocksÄ en begÀran om en ÄtgÀrd som anvÀndaren kan reagera pÄ med hjÀlp av funktionen för att skicka hÀndelsen i spelet.
Skicka spelhÀndelse
Funktionen fungerar endast för spelare: det Àr möjligt att starta spelet, göra ett drag, rösta, skriva ett textmeddelande som visas i hÀndelselistan för spelet, etc.
Den autentiserade anvÀndare som skapat spelet tilldelar roller till alla spelare, inklusive sig sjÀlv; de mÄste bekrÀfta sina roller genom denna funktion. NÀr alla roller har bekrÀftats, övergÄr spelet automatiskt till nattscenariet.
Spelstatistik
Funktionen fungerar endast för spelare, visar spelets status, lista och antal spelare (alias), roller och deras status (drag gjort eller ej), samt annan information. Precis som för den föregÄende funktionen fungerar allt endast för spelare.
Periodiskt körda funktioner
Om spelet inte har startat inom en viss tid, som angivits vid spelets skapande, kommer det automatiskt att raderas frÄn listan över aktiva spel med hjÀlp av rensningsfunktionen.
En annan periodisk uppgift Àr att tvinga ett skifte av spelmodus frÄn natt till dag och tillbaka för spel dÀr det inte har skett under draget (till exempel om en spelare som behöver reagera pÄ ett spelhÀndelse inte har skickat sin lösning av olika skÀl).
TillkÀnnagivande
- Installation av utvecklingsmiljö, uppdelning av uppgift i funktioner
- Arbete med backend
- Arbete med frontend
- InstÀllning av CICD, organisering av testning
- Start av provspel
- Sammanfattning
KĂ€lla: habr.com
