Domaćite svoju aplikaciju na Google Kubernetes Engine

Fotografiju True Agency na Unsplash-u
Kao programer, uvijek je zastrašujući zadatak ugostiti vaše stvaranje na platformi koja nije platforma kao usluga, na primjer Heroku.

U ovom ću vas članku voditi kroz postupak implementacije aplikacije na infrastrukturu kao uslugu, na primjer, Google Kubernetes Engine i nadam se da će ukloniti vaš strah od "hostinga" niže razine usluga.

izvor: presslabs.com

Poduzeti ćemo sljedeće korake da ugostimo našu aplikaciju:

  1. Stvaranje klastera Kubernetesa
  2. Dockerizing aplikacija
  3. Postavljanje konfiguracije Kubernetesa
  4. Instalacija i konfiguracija Nginx-a
  5. DNS konfiguracija
  6. Pružanje certifikata sigurnog utičničkog sloja (SSL)

Aplikacija

Aplikacija ima sučelje izgrađenu s Reactom i dodatkom (API izgrađen s Python Flask-om i Postgresql-om kao bazom podataka).

Reagirajte, tikvicu Python i Postgres
Ovo je u osnovi implementacija 3-slojne arhitekture; prezentacijski sloj (sučelje), logički sloj (API) i sloj podataka (baza podataka) - svi odvojeni i neovisni.
Aplikacija je aplikacija "bucketlist", gdje korisnik može tamo zabilježiti stavke popisa grupa zajedno s akcijskim stavkama o tome kako će ih postići.

Prvi korak za hosting ove aplikacije na GKE-u je dokerski iskoristiti. Odnosno, dokiranje svake od tri razine aplikacije. Klonirajte ovo spremište koje će uslijediti.

Preduvjeti

Alat koji ćemo koristiti u ovom članku uključuje sljedeće:

  1. kubectl
  2. gcloud
  3. lučki radnik
  4. google cloud projekt

Slijedite upute na zaslonu da biste se postavili s gore navedenim alatima. To može uključivati ​​prijavu na vaš Google račun na oblaku.

Ako ih već nemate, postavite ih i postavite putem tih veza. Ako ste ih već postavili, idemo da se podudaramo.

Stvaranje klastera Kubernetesa

Započnimo stvaranjem kubernetes klastera, dok u njemu konfiguriramo sve potrebne vjerodajnice za interakciju s novostvorenim klasterom.

Postoji nekoliko načina stvaranja klastera u kubernetama; među njima je uporaba google cloud konzole, naredbenog retka (gcloud) ili REST.

Za to ćemo koristiti naredbenu liniju (gcloud). To nam omogućava rad s našeg terminala koji kao programer s kojim imate proces rada. Naprijed i prvo postavite ove varijable okoline.

Sve ove varijable okoline složio sam u env.sh datoteku, na vašem terminalu možete pokrenuti “izvor env.sh” kako biste ih sve odjednom popunili.
  1. $ PROJECT: ovo je ID projekta Googlea. Isti projekt koji ste kreirali ili želite koristiti za ovaj projekt.
  2. $ CLUSTER: ovo je naziv klastera koji želite stvoriti.
  3. $ ZONE: ovo je zona u kojoj će se stvoriti klaster.
  4. $ GCR_REGISTRY: ovo je gcr registar u kojem nalaze se slike spremnika.
  5. $ FRONTEND_DOCKER_IMAGE_NAME: ovo je naziv slike za koji želite da sadrži sliku vašeg spremnika.
  6. $ DATABASE_DOCKER_IMAGE_NAME: ovo je naziv slike za koji želite da sadrži sliku spremnika baze podataka.
  7. $ BACKEND_API_DOCKER_IMAGE_NAME: ovo je naziv slike za koji želite da ima sliku api spremnika.

Prije nego što stvorimo klaster, postoji još jedan dio slagalice koji još nismo dobili. Račun usluge. zaglavi ovdje i stvori račun usluge i obavezno mu dodijeli ove uloge:

  1. uloge / storage.admin kako je ovdje navedeno
  2. uloge / project.owner

Nakon što su sve te varijable okoline postavljene i dodijeljeni računi usluga i uloge, tada možete pokrenuti ovu naredbu:

gcloud beta spremnik --projektiranje "$ PROJECT" klastera stvaraju "$ CLUSTER" - zonu "$ ZONE"

Ova će naredba trajati nekoliko minuta. Po završetku bit će popunjena i datoteka vjerodajnica koliko je potrebno da biste mogli komunicirati s novostvorenim klasterom kubernetesa.

Sad kad imamo klaster, neka započne kubernetes igre.

Dockerizing aplikacija

izvor: cengn.ca

Aplikaciju sam postavio na način da svaki sloj ima svoju mapu. Na taj se način lakše organizira dockerfile svakog sloja.

Na svom terminalu promijenite direktorij u mapu sučelja. Budući da je ova aplikacija pod nadzorom verzije, provjerite podružnicu za koju želite sastaviti sliku doktora.

Kako bih bio organiziran tijekom 3 razine, sve datoteke povezane s docker stavio sam u docker / folder. Dakle, dok ste u korijenu mape slojeva aplikacije frontend, pokrenite ovu naredbu

docker graditi -t $ GCR_REGISTRY / $ PROJECT / $ FRONTEND_DOCKER_IMAGE_NAME: v1 -f docker / Dockerfile.

Proći će nekoliko minuta dok gradi i konfigurira sliku doktora za prednji sloj. Kad je sastavljena, nastavite i graditi API-je i slike doktora baze podataka.

Još uvijek u vašem terminalu promijenite direktorij u mapu api i pokrenite ovu naredbu za izradu pomoćne slike doktora API-ja.

docker graditi -t $ GCR_REGISTRY / $ PROJECT / $ BACKEND_API_DOCKER_IMAGE_NAME: v1 -f docker / dockerfile.

I na kraju napravimo za nivo baze podataka. Na direktoriju promjene terminala u mapi baze podataka i pokrenite:

docker build -t $ GCR_REGISTRY / $ PROJECT / $ DATABASE_DOCKER_IMAGE_NAME: v1 -f docker / Dockerfile.

Uz uspješnu uspješnost prethodnih naredbi, imat ćemo 3 slike doktora; Frontend, API i baza podataka lokalno na radnoj površini / prijenosnom računalu. Idite naprijed i uredite datoteku instal.yaml u mapi konfiguracije k8s s imenima novostvorenih slika doktora.

Da bi Google Kubernetes Engine mogao koristiti ove slike, moramo ih učiniti dostupnima. Jedan od načina da se to postigne je njihovo guranje u registar Google kontejnera.

Google kontejnerski registar, izvor: blog.deimos.fr
Ovo je verzija Google Cloud Platform verzije docker središta; googleovo spremište slika spremnika.

U svom terminalu pokrenite:

gcloud auth configure-docker

Ovo će konfigurirati docker da koristi službena spremišta slika docker slika google cloud, poput gcr.io, eu.gcr.io, us.gcr.io, tako da za potiskivanje docker slike na ta spremišta, radite to na isti način kao ti radiš za doktora.

Krenimo sada sve 3 slike u registar Google Container, jednostavno pokrenite:

docker push $ GCR_REGISTRY / $ PROJECT / $ FRONTEND_DOCKER_IMAGE_NAME: v1 && docker push $ GCR_REGISTRY / $ PROJECT / $ BACKEND_API_DOCKER_IMAGE_NAME: v1 && docker push $ GCR_REGISTRY / $ PROJECT / $ DATABASE_D

Po završetku, hajde sada da se obratimo slonu u sobi; Uvođenje aplikacije u Google Kubernetes Engine.

izvor: google.com

Struktura mape Kubernetes konfiguracije

Sve konfiguracijske datoteke kubernetes stavljam u mapu k8s-konfiguracije. Ovdje imamo konfiguracije raspoređivanja, ulaza, tajni i usluga u paketu sličnih yaml datoteka.

  1. deployments.yaml. Uvođenje je jednostavno "radno opterećenje" koje sadrži vaše aplikacije (koje sadrže spremnik) konfiguracije. Ova konfiguracijska datoteka sadrži sliku spremnika, portove, naljepnice, broj replika itd.
  2. services.yaml. U kubernetama su usluge "ljepilo" različitih "opterećenja". Oni omogućuju povezivanje između spremnika u kubernetes eko sustavu. To je zato što način na koji su kreirani kubernetes, spremnik, ne može "razgovarati" s drugim spremnikom, ako ne u istom podmetaču. U osnovi, sučelje i API nikad neće izravno "razgovarati" jedan s drugim ako nisu u istoj podlozi, a za ovu postavku nisu u istom podlogu. Zbog toga moramo koristiti usluge.
  3. ingress.yaml. U kubernetesima je ulazak skup pravila koja usmjerava vanjski internetski promet na usluge u kuberneteskim klasterima. Ovo je korisno ako imate mnoge usluge koje trebaju izlagati razmještanje na Internetu. S ulazom koristite samo jedan HTTP balansator opterećenja i on će upravljati prometom za sve one implementacije za koje je potreban internet, za razliku od korištenja zasebnog balansa za opterećenje za svaku, što može biti skupo u pogledu troškova računalstva u oblaku.
  4. secrets.yaml. Za našu aplikaciju tajna koja nam je potrebna je SSL potvrda koja olakšava SSL raskid. To će omogućiti našoj aplikaciji siguran pristup putem HTTPS-a.

Ajmo sada i pretvorimo sadržaj konfiguracijskih datoteka kubernetes u stvarne resurse računalnog oblaka.

Googleova najbolja praksa je da prvo kreiramo usluge prije implementacije. Stoga ćemo najprije primijeniti konfiguracijsku datoteku services.yaml. Prijeđite na mapu za konfiguraciju k8s i počnite pretvarati kôd u stvarne računalne resurse.

Na vašem terminalu, dok je u konfiguracijskoj mapi k8s, pokrenite:

kubectl stvoriti -f usluge.yaml

Izlaz treba izgledati ovako:

iterm izlaz
Ova naredba će stvoriti svaki resurs prijavljen u datoj službi services.yaml.
Ovo je deklarativni način stvaranja sredstava kuberneta; deklarirajte ih sve u yaml datoteci i proslijedite tu datoteku koristeći -f zastavu naredbi kubectl create i sva magija se dogodi nakon toga.

Učinite isto za datoteku secrets.yaml, datoteku ingress.yaml i datoteku implementations.yaml. Trčanje:

kubectl stvoriti -f ulazak.yaml && kubectl stvoriti -f implementacije.yaml && kubectl stvoriti -f tajne.yaml

Nakon što se ova naredba uspješno završi, prijeđite na GCP konzolu pod odjeljak kubernetes engine> radno opterećenje i tamo ćete pronaći svoje resurse koje ste upravo stvorili.

Nadzorna ploča Google Kubernetes Engine

Ako ne vidite ništa, provjerite da ste prešli na ispravan račun koji ste postavili za ovaj projekt, u gornjem desnom kutu i provjerite da ste odabrali ispravan projekt u gornjem lijevom kutu, kao što je prikazano u nastavku.

nadzorna ploča konzole google platforme platforme

Pogledajte odjeljak o opterećenjima rada, trebali biste pokrenuti sučelje, API i bazu podataka te pokrenuti zelene pokazatelje.

GKE radno opterećuje nadzornu ploču

Prijeđite na odjeljak za usluge i provjerite jesu li sve usluge ispravne i zdrave pomoću indikatora zelenih krpelja.

Nadzorna ploča GKE usluge

U ovom je trenutku sve dobro, osim jedne stvari. Ulazni kontroler, bez kojeg ne možemo pristupiti bilo kojem dijelu naše aplikacije na google cloudu putem preglednika.

Ingress kontroler odgovoran je za ispunjavanje Ingress-a, obično s alata za opterećenje. Samo kreiranje resursa za ulazak neće raditi bez upravljača za ulazak. Srećno za nas i za kormilo, ne moramo ulaziti u zamršene detalje postavljanja ulaznog regulatora iz nule.

Konfiguracija kontrolera za naprezanje

Da bi se Ingress kontroler pokrenuo i pokrenuo u našem klasteru, poslužit ćemo se kormilom.

izvor: google.com
Helm je Kubernetesu što je homebrew za macOS, apt-get je ubuntu, a pip je python. To je menadžer paketa za Kubernetes.

Helm nam omogućava instaliranje ovisnosti i čitavih aplikacija koje su sjedinjene u paket sa samo jednom naredbom. Započnimo instaliranjem i konfiguriranjem kormila.

U svom terminalu pokrenite:

curl -o get_helm.sh https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get && chmod + x get_helm.sh && ./get_helm.sh && helm init

Gornja naredba dohvaća najnoviju verziju kormirskog klijenta i instalira ga na vaš lokalni stroj (laptop / radna površina)

Da bi kormilar mogao raditi s našim klasterom, potrebna mu je komponenta na strani poslužitelja instalirana u klasteru s kojom će kormilar "razgovarati" kako bi upravljao i proslijedio naredbe kako bi stvorio sve resurse koji će nam biti potrebni u ovom slučaju Ingress kontroler.

Ova se komponenta naziva Tiller. Za instaliranje upravljačkog programa u Google Kubernetes klasteru moramo imati račun usluge i vezanje klastera koji su konfigurirani za tiller. To će tilleru omogućiti da instalira kubernetes resurse unutar našeg klastera.

Na svom terminalu pokrenite sljedeće naredbe za instaliranje i konfiguriranje upravljačkog programa prema potrebi:

kubectl stvoriti serviceaccount - namespace kube-sistem tiller && kubectl stvoriti clusterrolebinding tiller-cluster-rule --clusterrole = cluster-admin --serviceaccount = kube-system: tiller && kubectl patch implementirati - namespace kube-system tiller-implementirati -p '{"Spec": {"obrazac": {"spec": {"serviceAccount": "tiller"}}}}' && helm init - servisna-računna ručica - nadogradnja

Da biste potvrdili instalaciju upravljača, pokrenite:

kubectl dobiti implementacije -n kube-system | grep tiller-implementirati

Tako ćete dobiti svoje novo stvoreno instaliranje tiller-dploy.

Sada su nam kormilo i upravljač instalirani i konfigurirani na našem lokalnom radnom mjestu i udaljenom klasteru. Sada možemo ići naprijed i instalirati Ingress kontroler u naš klaster.

nginx ulazak za GKE

Tamo su razni Ingress kontroleri, a za to ćemo upotrijebiti nginx Ingress kontroler kao što smo to naveli u našoj konfiguracijskoj datoteci ingress.yaml. U vašem terminalu:

helm install - ime nginx-upad stabilno / nginx-ulazak --set rbac.create = istina

Ovo će instalirati nginx Ingress kontroler. Da biste potvrdili našu instalaciju, pokrenite:

kubectl dobiti uslugu nginx-ingress-controller

Ovo će vam dati izlaz nginx kontrolera tipa loadBalancer s vanjskim IP-om.

Ovaj vanjski IP treba malo vremena da se kreira, pa ako vidite "na čekanju", dajte mu nekoliko sekundi / minuta da ga Google osigura za vas.

U ovom trenutku možete pristupiti sučelju putem vanjskog IP-a usluge nginx kontrolera ulaska. Ali baš poput soli, zašto biti običan. Priključimo taj IP s imenom domene kako bismo mu mogli pristupiti putem nečega poput http://www.myapp.com umjesto http://35.90.3.9.

Ako ga nemate, možete ga kupiti po želji godaddy, lebdeći, google domene itd. Sada konfigurišemo našu domenu.

DNS konfiguracija

izvor: pngall.com

Koristio sam svoje ime domene koje ću skinuti tjedan dana nakon ovog demo članka. Vratite se na nadzornu ploču vaše domene i postavite neka imena poddomena za sučelje, api i bazu podataka.

Moje ime domene je davidmukiibi.com, a poddomene koje sam stvorio izgledaju ovako:

frontend.davidmukiibi.com
api.davidmukiibi.com
database.davidmukiibi.com
lebdite nadzornu ploču domene

U svom terminalu pokrenite:

kubectl dobiti usluge | grep LoadBalancer | awk '{print $ 4}'

Kopirajte izlaz te naredbe; ovo je vanjska IP adresa putem koje je naša aplikacija izložena internetu.

Na nadzornoj ploči vaše domene ispunite ovu vanjsku IP adresu kao vrijednost za tri skupa zapisa koje smo stvorili.

Ako provjerite našu datoteku ingress.yaml, primijetit ćemo da smo uputili naš regulator za ulazak putem resursa za ulazak da primorava preusmjeriti bilo koji zahtjev na https koristeći ovu napomenu:

nginx.ingress.kubernetes.io/ssl-redirect: "istina"

To će omogućiti samo sigurne veze do naše aplikacije.

Dopuštanje samo sigurnih veza s vašom aplikacijom najbolja je praksa, posebno ako se radi s korisničkim podacima. U skladu s tim, potreban nam je SSL certifikat kako bismo omogućili cjelovito šifriranje između naše aplikacije i korisnika.

izvor: google.com

Koristit ćemo šifriranje jer nudi besplatne SSL certifikate koji vrijede 3 mjeseca. Ako imate, bilo plaćanu ili besplatnu, možete koristiti bilo koje potvrde.

Pružanje ssl cert

Za dobivanje SSL certifikata iz leptira šifrirat ćemo se alatom naziva certbot. Instalirajmo letsencrypt i certbot.

Promijenite direktorij u konfiguracijsku mapu k8s, ako koristite ubuntu linux, pokrenite:

apt-get install letsencrypt

Ako koristite macOS, pokrenite:

brew install certbot && pip install letsencrypt --user
Idite ovdje da pronađete korake za instalaciju vašeg OS-a.

S obzirom da imamo 3 poddomene povezane s jednom domenom, stvorit ćemo zamjenski SSL certifikat. Ovo će se odnositi na sve poddomene domene davidmukiibi.com.

U svom terminalu pokrenite:

certbot - manual --logs-dir certbot --config-dir certbot --work-dir certbot - preferred-challenges dns certonly --server https://acme-v02.api.letsencrypt.org/directory --email svoju adresu e-pošte -d „* .davidmukiibi.com“
Zamijenite "svoju adresu e-pošte" u gornjoj naredbi s vlastitom adresom e-pošte.

Slijedite upute na zaslonu za pružanje SSL certifikata svoje domene. Kad dođete do upita koji kaže:

Molimo, uvedite DNS TXT zapis pod imenom
_acme-challenge.erpnext.davidmukiibi.com sa sljedećom vrijednošću: 
"Davidmukiibi.com" trebao bi biti vaše vlastito ime domene

Vratite se na nadzornu ploču vaše domene i stvorite "txt" zapis za _acme-challenge.erpnext.davidmukiibi.com i ispunite vrijednost koju na vašem terminalu daje certbot.

NAPOMENA: "davidmukiibi.com" trebao bi biti vaše vlastito ime domene
SSL TXT acme izazov
Dajte minutu ili dvije nakon stvaranja zapisa

Vratite se do terminala i pritisnite tipku enter na tipkovnici da nastavite s postupkom dodjele certifikata.

Razlog zbog kojeg ćete možda trebati čekati je taj što ponekad prolazi duže vrijeme za širenje, zato certbot neće uspjeti osigurati i morat ćete ponoviti cijeli postupak iznova

Kad je sve završeno, certbot će stvoriti mapu "cerbot" u vašoj trenutnoj radnoj mapi. A zaslonski izlaz će vas usmjeriti do mjesta na kojem je vaš SSL certifikat i 2 potrebne datoteke za uvoz, to su datoteke cert.pem i privkey.pem. Dok ste u direktoriju s datotekama * .pem, pokrenite:

mačka cert.pem | baza64 | pbcopy

Ovo kodira cert.pem na base64 i kopira cert.pem kodirani rezultat u međuspremnik.

Prijeđite na datoteku secrets.yaml i zalijepite je na vrijednost tls.crt:

secrets.yaml

Trčanje:

mačka privkey.pem | baza64 | pbcopy

za kodiranje privkey.pem i zalijepite rezultat kao vrijednost tls.key: u datoteku secrets.yaml.

Naredbe: „cat cert.pem | baza64 | pbcopy "i" cat privkey.pem | baza64 | pbcopy ”base64 kodiraju datoteke privkey.pem i cert.pem i kopiraju rezultat u isto vrijeme. Tako nećete imati izlaz na vašem terminalu, ali ako ctrl + v ili cmd + v u uređivaču teksta, vidjet ćete kodirani rezultat.

S popisom secrets.yaml popunjenim kao gore, pokrenite:

kubectl stvoriti -f tajne.yaml

Tako će se stvoriti kubernetes resurs tipa tajne koji će naš ulazni resurs upotrijebiti za SSL raskid a.k.a sigurnog pregledavanja pomoću HTTPS-a.

Fotografija Mimi Thian na Unsplash

Sada možemo pokrenuti naše web preglednike i krenuti na frontend.davidmukiibi.com da biste provjerili našu aplikaciju.

Primijetite kako se automatski preusmjerava na HTTPS? To je čar koji dolazi s korištenjem nginx kontrolera ulaska.

I tu ga imate. Konačno je u Google Kubernetes Engine ugostio 3-slojnu arhitektonsku aplikaciju.

Uvijek izbrišite resurse koje ste upravo stvorili ako vam ih više ne trebate jer će im naplaćivati ​​Google Cloud, a još ih neće koristiti.

Da biste izbrisali klaster i sve ranije stvorene resurse, pokrenite:

gcloud spremnički klasteri brišu $ CLUSTER

Posebno vikanje Ivanu, koji je sastavio čitavu aplikaciju.

Zaustavite se na docker naredbama koje će vam vrlo brzo pojednostaviti docker radni tijek iz ovog članka koji sam sastavio.

Slobodno predložite izmjene ili dopune ovdje podijeljenog znanja. Također možete potražiti chat preko mog Twittera ili LinkedIna.