"Bag-ong mga Epiko". Gikaon namo ang elepante sa mga bahin

"Bag-ong mga Epiko". Gikaon namo ang elepante sa mga bahin

Niining artikuloha, magbutang ko ug working environment para sa pagpalambo sa dula nga "Epics", ug bungkagon usab ang dula mismo ngadto sa mga bahin nga angay gamiton sa OpenFaaS. Buhaton nako ang tanang manipulasyon sa Linux, I-deploy nako ang Kubernetes sa minikube gamit ang VirtualBox. Ang akong work machine adunay 2 processor core ug 12GB nga RAM; naggamit ko og SSD isip system disk. Gamiton nako ang debian 8 isip akong nag-unang sistema sa pag-uswag, nga adunay mga emac, sudo, git ug virtualbox nga mga pakete nga na-install, ang tanan ma-install pinaagi sa pag-download gikan sa GitHub ug uban pang mga gigikanan. Among i-install kini nga mga aplikasyon sa /usr/local/bin gawas kung gipiho. Magsugod na ta!

Pag-andam sa palibot sa pagtrabaho

Pag-instalar sa Go

Gisunod namon ang mga panudlo gikan sa opisyal nga website:

$ 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

Pagsusi sa gamit:

$ 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

Pag-instalar sa faas-cli

Gisunod namon ang mga panudlo gikan sa opisyal nga website:

$ 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

Dugang pa, mahimo nimong ma-enable ang bash-completion:

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

Pag-instalar ug Pag-configure sa Kubernetes

Alang sa kalamboan, igo na ang minikube, busa i-install kini ug kubelet sa /usr/local/bin, ug i-install ang timon aron ma-install ang mga aplikasyon:

$ 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

Ilunsad ang minikube:

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

Pagsusi:

$ 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

Pag-instalar sa OpenFaaS

Girekomenda sa mga developer ang paghimo og 2 nga mga namespace aron magamit:

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

Pagdugang og repository alang sa timon:

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

Ang tsart adunay katakus nga magbutang usa ka password sa wala pa i-install, gamiton naton kini ug i-save ang data sa pag-access ingon usa ka sekreto sa 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

Atong i-deploy:

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

Pagkahuman sa pila ka oras, gipadagan namon ang gisugyot nga mando:

$ 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

Pagsusi sa gamit:

$ 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

Pag-instalar sa Mongodb

Gi-install namo ang tanan gamit ang timon:

$ 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

Pagsusi:

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

Pindota ang ctrl+D aron makagawas sa sudlanan.

Pag-set up sa mga emac

Sa prinsipyo, ang tanan na-configure na sumala sa kini nga artikulo, mao nga dili na ko magdetalye.

Pagbungkag sa dula ngadto sa mga gimbuhaton

Ang interaksyon sa mga gimbuhaton gihimo pinaagi sa http protocol, ang end-to-end authentication tali sa lainlaing mga gimbuhaton gihatag sa JWT. Ang Mongodb gigamit sa pagtipig sa mga token, ingon man sa kahimtang sa dula, datos sa magdudula, mga han-ay sa mga paglihok sa tanan nga mga dula ug uban pang impormasyon. Atong tan-awon pag-ayo ang labing makaiikag nga mga bahin.

РСгистрация

Ang input niini nga function mao ang JSON nga adunay angga ug password sa dula. Kung kini nga function gitawag, kini gisusi nga kini nga alyas wala sa database; kung ang tseke malampuson, ang alyas ug password hash gisal-ut sa database. Ang pagparehistro gikinahanglan aron aktibong makaapil sa dula.

Π’Ρ…ΠΎΠ΄

Ang input sa function mao ang JSON nga adunay usa ka nickname ug password sa dula; kung adunay usa ka angga sa database ug ang password malampuson nga napamatud-an sa usa nga na-save kaniadto sa database, usa ka JWT ibalik, nga kinahanglan ipasa sa ubang mga function kung kini gitawag. Ang lainlaing mga rekord sa serbisyo gisulod usab sa database, pananglitan, katapusan nga oras sa pag-login, ug uban pa.

Tan-awa ang lista sa mga dula

Bisan kinsa nga dili awtorisado nga tiggamit makahangyo ug usa ka lista sa tanan nga mga dula gawas sa mga aktibo. Ang usa ka awtorisado nga tiggamit makakita usab og lista sa mga aktibong dula. Ang resulta sa function mao ang JSON nga adunay mga lista sa mga dula (game ID, ngalan nga mabasa sa tawo, ug uban pa).

Paglalang sa dula

Ang function nagtrabaho lamang sa mga awtorisado nga tiggamit; ang labing kadaghan nga mga magdudula gidawat sa input, ingon man ang mga parameter sa dula (pananglitan, kung unsang mga karakter ang ma-aktibo sa kini nga dula, ang labing kadaghan nga mga magdudula, ug uban pa). Ang usa ka bulag nga parameter sa dula mao ang presensya sa usa ka password alang sa pag-apil, nga nagtugot kanimo sa paghimo sa dili publiko nga mga dula. Sa kasagaran, usa ka publiko nga dula ang gihimo. Ang resulta sa function mao ang JSON, nga adunay sulud nga kalampusan sa paglalang, usa ka talagsaon nga identifier sa dula, ug uban pang mga parameter.

Pag-apil sa usa ka dula

Ang function nagtrabaho lamang sa mga awtorisado nga tiggamit, ang input mao ang game ID ug ang password niini, kung kini usa ka non-public game, ang output mao ang JSON nga adunay mga parameter sa dula. Ang awtorisado nga tiggamit nga miapil sa dula, ingon man ang tiglalang sa dula, sa ulahi gitawag nga mga partisipante sa dula.

Pagtan-aw sa mga panghitabo sa dula

Ang bisan kinsa nga dili awtorisado nga tiggamit mahimong makahangyo ug usa ka lista sa mga panghitabo alang sa dili aktibo nga mga dula, ug ang usa ka awtorisado nga tiggamit makadawat usa ka lista sa mga panghitabo alang sa bisan unsang aktibo nga dula. Ang usa ka dugang nga parameter sa function mahimong ang numero sa panghitabo nga naa na sa user. Sa kini nga kaso, ang mga panghitabo ra nga nahitabo sa ulahi ang ibalik sa lista. Pinaagi sa matag paglansad niini nga function, ang usa ka awtorisado nga tiggamit nagtan-aw kung unsa ang nahitabo sa dula. Kini nga function nagbalik usab sa usa ka aksyon nga hangyo, nga ang user makatubag gamit ang dula nga event dispatch function.

Nagpadala usa ka dula nga kalihokan

Ang function nagtrabaho lamang alang sa mga partisipante sa dula: posible nga magsugod sa dula, maghimo usa ka paglihok, pagboto, pagsulat sa usa ka text message nga gipakita sa lista sa mga panghitabo sa dula, ug uban pa.
Ang awtorisado nga tiggamit nga naghimo sa dula nagsugod sa pag-apod-apod sa mga tahas sa tanan nga mga partisipante sa dula, lakip ang ilang kaugalingon, kinahanglan nila nga kumpirmahon ang ilang tahas gamit ang parehas nga function. Kung makumpirma ang tanan nga mga tahas, ang dula awtomatiko nga mobalhin sa mode sa gabii.

Estadistika sa dula

Ang function magamit lamang alang sa mga partisipante sa dula; kini nagpakita sa kahimtang sa dula, ang lista ug gidaghanon sa mga magdudula (mga angga), mga tahas ug ilang kahimtang (gihimo o wala ang paglihok), ingon man ang uban pang kasayuran. Sama sa miaging function, ang tanan magamit lamang alang sa mga partisipante sa dula.

Panagsa nga gilunsad nga mga gimbuhaton

Kung ang dula wala pa gilansad sa pila ka oras nga gitakda sa paghimo sa dula, awtomatiko kini nga tangtangon gikan sa lista sa mga aktibo nga dula gamit ang tin-aw nga function.

Ang laing periodic nga buluhaton mao ang pinugos nga pagbalhin sa mode sa dula gikan sa gabii ngadto sa adlaw ug balik alang sa mga dula nga wala kini mahitabo sa panahon sa turn (pananglitan, ang usa ka magdudula nga kinahanglan nga mag-reaksyon sa usa ka dula nga panghitabo wala magpadala sa iyang solusyon sa pipila ka rason. ).

Pagpahibalo

  • Pasiuna
  • Pag-set up sa development environment, pagbungkag sa buluhaton ngadto sa mga function
  • Trabaho sa backend
  • Trabaho sa atubangan
  • Pagpahimutang sa CICD, pag-organisar sa pagsulay
  • Pagsugod sa usa ka sesyon sa dula sa pagsulay
  • Mga resulta

Source: www.habr.com

Idugang sa usa ka comment