"Epik Baru". Kami memakan gajah itu sebagian

"Epik Baru". Kami memakan gajah itu sebagian

Pada artikel ini, saya akan menyiapkan lingkungan kerja untuk mengembangkan game "Epics", dan juga akan membagi game itu sendiri menjadi beberapa bagian yang sesuai untuk digunakan di OpenFaaS. Saya akan melakukan semua manipulasi di Linux, saya akan menyebarkan Kubernetes di minikube menggunakan VirtualBox. Mesin kerja saya memiliki 2 inti prosesor dan RAM 12 GB; Saya menggunakan SSD sebagai disk sistem. Saya akan menggunakan debian 8 sebagai sistem pengembangan utama saya, dengan paket emacs, sudo, git dan virtualbox terinstal, semuanya akan diinstal dengan mengunduh dari GitHub dan sumber lainnya. Kami akan menginstal aplikasi ini di /usr/local/bin kecuali ditentukan lain. Mari kita mulai!

Mempersiapkan lingkungan kerja

Menginstal Pergi

Kami mengikuti instruksi dari situs resmi:

$ 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

Memeriksa fungsionalitas:

$ 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

Menginstal faas-cli

Kami mengikuti instruksi dari situs resmi:

$ 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

Selain itu, Anda dapat mengaktifkan penyelesaian bash:

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

Menginstal dan Mengonfigurasi Kubernetes

Untuk pengembangan, minikube sudah cukup, jadi instal minikube dan kubelet di /usr/local/bin, dan instal helm untuk menginstal aplikasi:

$ 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

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

Kami memeriksa:

$ 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

Menginstal OpenFaaS

Pengembang merekomendasikan untuk membuat 2 namespace untuk digunakan:

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

Tambahkan repositori untuk helm:

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

Bagan memiliki kemampuan untuk mengatur kata sandi sebelum instalasi, mari gunakan dan simpan data akses sebagai rahasia 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

Mari kita terapkan:

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

Setelah beberapa waktu, kami menjalankan perintah yang diusulkan:

$ 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

Memeriksa fungsionalitas:

$ 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

Menginstal Mongodb

Kami menginstal semuanya menggunakan 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

Kami memeriksa:

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

Tekan ctrl+D untuk keluar dari wadah.

Menyiapkan emacs

Pada prinsipnya, semuanya sudah dikonfigurasi sesuai Artikel ini, jadi saya tidak akan menjelaskannya secara detail.

Memecah permainan menjadi beberapa fungsi

Interaksi dengan fungsi dilakukan melalui protokol http, otentikasi ujung ke ujung antara berbagai fungsi disediakan oleh JWT. Mongodb digunakan untuk menyimpan token, serta status permainan, data pemain, urutan pergerakan semua permainan, dan informasi lainnya. Mari kita lihat lebih dekat fitur-fitur paling menarik.

Pendaftaran

Input dari fungsi ini adalah JSON dengan nama panggilan dan kata sandi game. Ketika fungsi ini dipanggil, maka diperiksa bahwa alias ini tidak ada dalam database; jika pemeriksaan berhasil, alias dan hash kata sandi dimasukkan ke dalam database. Pendaftaran diperlukan untuk berpartisipasi aktif dalam permainan.

Masukan

Input fungsi adalah JSON dengan nama panggilan permainan dan kata sandi; jika ada nama panggilan di database dan kata sandi berhasil diverifikasi dengan yang disimpan sebelumnya di database, maka JWT dikembalikan, yang harus diteruskan ke fungsi lain ketika sudah ada. ditelepon. Berbagai catatan layanan juga dimasukkan ke dalam database, misalnya waktu login terakhir, dll.

Lihat daftar permainan

Setiap pengguna yang tidak sah dapat meminta daftar semua game kecuali yang aktif. Pengguna yang berwenang juga melihat daftar permainan yang aktif. Hasil dari fungsinya adalah JSON yang berisi daftar game (ID game, nama yang dapat dibaca manusia, dll.).

Pembuatan permainan

Fungsi ini hanya berfungsi dengan pengguna yang berwenang; jumlah maksimum pemain yang diterima pada input, serta parameter permainan (misalnya, karakter mana yang akan diaktifkan dalam permainan ini, jumlah maksimum pemain, dll.). Parameter terpisah dari game ini adalah adanya kata sandi untuk bergabung, yang memungkinkan Anda membuat game non-publik. Secara default, game publik dibuat. Hasil dari fungsinya adalah JSON, yang berisi bidang keberhasilan pembuatan, pengidentifikasi game unik, dan parameter lainnya.

Bergabung dengan permainan

Fungsi ini hanya berfungsi dengan pengguna yang berwenang, inputnya adalah ID game dan kata sandinya, jika ini adalah game non-publik, outputnya adalah JSON dengan parameter game. Pengguna resmi yang bergabung dalam permainan, serta pencipta permainan, selanjutnya disebut peserta permainan.

Melihat acara permainan

Setiap pengguna yang tidak sah dapat meminta daftar acara untuk game yang tidak aktif, dan pengguna yang berwenang dapat menerima daftar acara untuk setiap game yang aktif. Parameter tambahan pada fungsi tersebut dapat berupa nomor peristiwa yang sudah dimiliki pengguna. Dalam hal ini, hanya peristiwa yang terjadi kemudian yang akan dikembalikan dalam daftar. Dengan meluncurkan fungsi ini secara berkala, pengguna yang berwenang melihat apa yang terjadi di dalam game. Fungsi ini juga mengembalikan permintaan tindakan, yang dapat ditanggapi oleh pengguna menggunakan fungsi pengiriman acara game.

Mengirim acara permainan

Fungsi ini hanya berfungsi untuk peserta permainan: dimungkinkan untuk memulai permainan, bergerak, memilih, menulis pesan teks yang ditampilkan dalam daftar acara permainan, dll.
Pengguna resmi yang membuat game mulai membagikan peran kepada semua peserta dalam game, termasuk dirinya sendiri, mereka harus mengonfirmasi peran mereka menggunakan fungsi yang sama. Setelah semua peran dikonfirmasi, game secara otomatis beralih ke mode malam.

Statistik permainan

Fungsi ini hanya berfungsi untuk peserta permainan; ini menunjukkan keadaan permainan, daftar dan jumlah pemain (nama panggilan), peran dan status mereka (bergerak atau tidak), serta informasi lainnya. Seperti fungsi sebelumnya, semuanya hanya berfungsi untuk peserta permainan.

Fungsi yang diluncurkan secara berkala

Jika game belum diluncurkan selama beberapa waktu yang ditentukan saat pembuatan game, game tersebut akan secara otomatis dihapus dari daftar game aktif menggunakan fungsi hapus.

Tugas berkala lainnya adalah peralihan paksa mode permainan dari malam ke siang dan kembali untuk permainan yang tidak terjadi selama giliran (misalnya, pemain yang perlu bereaksi terhadap peristiwa permainan tidak mengirimkan solusinya karena alasan tertentu ).

Pengumuman

  • pengenalan
  • Menyiapkan lingkungan pengembangan, membagi tugas menjadi beberapa fungsi
  • Pekerjaan bagian belakang
  • Pekerjaan bagian depan
  • Menyiapkan CICD, mengatur pengujian
  • Mulai sesi permainan percobaan
  • Hasil

Sumber: www.habr.com

Tambah komentar