Hostujte svoju aplikáciu v službe Google Kubernetes Engine

Foto: True Agency on Unsplash
Ako vývojár je vždy náročnou úlohou hostiť svoju tvorbu na inej platforme, ako je platforma ako služba, napríklad Heroku.

V tomto článku vás prevediem procesom nasadenia aplikácie na infraštruktúru ako službu, napríklad Google Kubernetes Engine, a dúfam, že napraví váš strach z hostiteľských služieb „nižšej úrovne“.

zdroj: presslabs.com

Na hostenie našej aplikácie podnikneme nasledujúce kroky:

  1. Vytvorenie klastra Kubernetes
  2. Dockerizing aplikácie
  3. Nastavte konfiguráciu Kubernetes
  4. Inštalácia a konfigurácia Nginx
  5. Konfigurácia DNS
  6. Poskytovanie certifikátov SSL (Secure Socket Layer)

Aplikácia

Aplikácia má frontend zostavený s React a backend (API vytvorené s Python Flask a Postgresql ako databázou).

React, Pythonova banka a Postgres
V podstate ide o implementáciu trojstupňovej architektúry; prezentačná vrstva (frontend), logická vrstva (API) a dátová vrstva (databáza), všetky oddelené a nezávislé.
Aplikácia je aplikácia typu „bucketlist“, v ktorej môže užívateľ zaznamenať položky v zozname bucketlist spolu s akčnými položkami o tom, ako ich dosiahne.

Prvým krokom hostenia tejto aplikácie na GKE je jej ukotvenie v doku. To znamená ukotvenie každej z 3 úrovní aplikácie. Klonujte toto úložisko, aby ste ho nasledovali.

predpoklady

Medzi nástroje, ktoré použijeme v tomto článku, patria:

  1. kubectl
  2. gcloud
  3. prístavný robotník
  4. google cloud projektu

Postupujte podľa pokynov na obrazovke, aby ste sa nastavili pomocou vyššie uvedených nástrojov. Môže to zahŕňať prihlásenie do účtu Google Cloud.

Ak ich ešte nemáte nastavené, pokračujte a nastavte ich pomocou týchto odkazov. Ak ich už máte nastavené, poďme na zápas.

Vytvorenie klastra Kubernetes

Začnime vytvorením kubernetového klastra a zároveň nakonfigurujte všetky požadované poverenia, aby spolupracovali s novovytvoreným klastrom.

Existuje niekoľko spôsobov, ako vytvoriť klaster v kubernetoch; medzi ne patrí použitie cloudovej konzoly google, príkazového riadku (gcloud) alebo REST.

Na tento účel použijeme príkazový riadok (gcloud). To nám umožňuje pracovať z nášho terminálu, s ktorým ako vývojár pracujete. Pokračujte a nastavte tieto premenné prostredia ako prvé.

Zostavil som všetky tieto premenné prostredia do súboru env.sh, na svojom termináli môžete spustiť „source env.sh“ a naplniť ich všetky naraz.
  1. $ PROJECT: Toto je ID projektu Google. Rovnaký projekt, ktorý ste vytvorili alebo chcete použiť pre tento projekt.
  2. $ CLUSTER: toto je názov klastra, ktorý chcete vytvoriť.
  3. $ ZONE: toto je zóna, v ktorej bude vytvorený klaster.
  4. $ GCR_REGISTRY: Toto je register gcr, v ktorom sú umiestnené obrázky kontajnerov.
  5. $ FRONTEND_DOCKER_IMAGE_NAME: toto je názov obrázka, ktorý chcete, aby mal váš obrázok kontajnera frontend.
  6. $ DATABASE_DOCKER_IMAGE_NAME: toto je názov obrázka, ktorý chcete, aby mal obrázok vášho databázového kontajnera.
  7. $ BACKEND_API_DOCKER_IMAGE_NAME: toto je názov obrázka, ktorý má obrázok kontajnera api mať.

Pred vytvorením klastra je ešte jedna skladačka, ktorú ešte nemáme. Servisný účet. choďte sem a vytvorte si účet služby a nezabudnite mu priradiť tieto role:

  1. roly / storage.admin, ako je uvedené tu
  2. role / project.owner

Po nastavení všetkých týchto premenných prostredia a priradení účtov služieb a rolí môžete spustiť tento príkaz:

gcloud beta container - projekt „Klastre $ PROJECT“ vytvárajú „$ CLUSTER“ - zóna „$ ZONE“

Tento príkaz bude trvať niekoľko minút. Po dokončení tiež vyplní súbor poverení podľa potreby, aby ste mohli pracovať s novovytvoreným kubernetovým klastrom.

Teraz, keď máme klaster, začnite hry kubernetes.

Dockerizing aplikácie

zdroj: cengn.ca

Aplikáciu som nastavil tak, aby každá vrstva mala svoj vlastný priečinok. Uľahčuje to usporiadanie dokovacieho súboru každej úrovne.

Na termináli zmeňte adresár do priečinka frontend. Pretože táto aplikácia je pod kontrolou verzií, nezabudnite skontrolovať vetvu, pre ktorú chcete vytvoriť obraz doku.

Aby som bol usporiadaný do všetkých troch úrovní, vložil som všetky súbory súvisiace s dockerom do priečinka / docker / priečinok. Preto, keď ste v koreňovom adresári aplikačnej vrstvy frontend, spustite tento príkaz

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

Bude to trvať niekoľko minút, kým sa vytvorí a nakonfiguruje obrázok ukotvenia pre vrstvu frontend. Po dokončení zostavovania pokračujte a vytvorte obrázky rozhrania API a databázových dokov.

Stále v termináli, zmeňte adresár do priečinka api a spustite tento príkaz, aby ste vytvorili zostavný obraz rozhrania API koncového rozhrania API.

zostavenie doku -t $ GCR_REGISTRY / $ PROJECT / $ BACKEND_API_DOCKER_IMAGE_NAME: ukotviteľný disk do-v1 / Dockerfile.

A nakoniec zostavme databázovú úroveň. Na vašom termináli zmeňte adresár do databázového priečinka a spustite:

zostavenie doku -t $ GCR_REGISTRY / $ PROJECT / $ DATABASE_DOCKER_IMAGE_NAME: ukotviteľný disk do-v1 / Dockerfile.

Po úspešnom dokončení vyššie uvedených príkazov budeme mať 3 obrázky v doku; Frontend, API a Database lokálne na vašom počítači / notebooku. Pokračujte a upravte súbor deployments.yaml v konfiguračnom priečinku k8s s názvami novo vytvorených obrázkov doku.

Aby Google Kubernetes Engine tieto obrázky používal, musíme ich sprístupniť. Jedným zo spôsobov, ako to dosiahnuť, je ich presunutie do registra kontajnerov Google.

Register kontajnerov Google, zdroj: blog.deimos.fr
Toto je verzia dokovacej základne platformy Google Cloud Platform; google úložisko obrázkov kontajnerov.

Vo svojom termináli spustite:

gcloud auth configure-docker

Toto nakonfiguruje docker na používanie oficiálnych archívov dockerov google cloudu, ako sú gcr.io, eu.gcr.io, us.gcr.io, takže ak chcete do týchto úložísk poslať obrázok docker, urobíte to rovnakým spôsobom ako robíš pre doku.

Poďme teraz presunúť všetky 3 obrázky do Registra kontajnerov Google a jednoducho spustiť:

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_DOCKER_IM:

Po tomto dokončení sa teraz obráťte na slona v miestnosti; Nasadenie aplikácie do služby Google Kubernetes Engine.

zdroj: google.com

Štruktúra priečinka Kubernetes

Do konfiguračného priečinka k8s som umiestnil všetky konfiguračné súbory kubernetes. Tu máme konfigurácie nasadenia, ingresu, tajomstiev a služieb v súboroch s rovnakým názvom yaml.

  1. deployments.yaml. Nasadenie je jednoducho „pracovné za aženie“, ktoré obsahuje konfigurácie poda vašich aplikácií (ktoré obsahuje kontajner). Tento konfiguračný súbor obsahuje obraz kontajnera, porty, štítky, počet replík atď.
  2. services.yaml. V kubernetách sú služby „lepidlom“ rôznych „pracovných za ažení“. Tieto poskytujú prepojenie medzi kontajnermi v ekosystéme Kubernetes. Je to preto, že spôsob, akým boli vytvorené kubernety, kontajner, nemôže „hovoriť“ s iným kontajnerom, ak nie je v tom istom zariadení. V podstate frontend a API sa nikdy navzájom „nerozprávajú“ priamo, ak nie na rovnakom zariadení a pre toto nastavenie nie sú na rovnakom zariadení. Preto musíme využívať služby.
  3. ingress.yaml. V kubernetoch je ingress súbor pravidiel, ktoré smerujú externý internetový prenos k službám v kubernetovom klastri. Toto je užitočné, ak máte veľa služieb, ktoré potrebujú vystaviť nasadenie na internete. Pri vstupe budete používať iba jeden vyrovnávač zaťaženia HTTP a zvládne prenos do všetkých tých nasadení, ktoré potrebujú internet, na rozdiel od použitia samostatného vyrovnávača zaťaženia pre každé, čo môže byť nákladné z hľadiska nákladov na cloud computing.
  4. secrets.yaml. Pre našu aplikáciu potrebujeme tajný certifikát SSL na uľahčenie ukončenia protokolu SSL. To umožní bezpečný prístup k našej aplikácii prostredníctvom protokolu HTTPS.

Poďme teraz a premeníme obsah konfiguračných súborov kubernetes na skutočné zdroje cloud computingu.

Osvedčenou praxou spoločnosti Google je, že služby vytvárame najskôr pred nasadením. Najprv preto použijeme konfiguračný súbor services.yaml. Zamierte do konfiguračného priečinka k8s a začnite premieňať kód na skutočné počítačové zdroje.

Na termináli spustite v konfiguračnom priečinku k8s:

kubectl create -f services.yaml

Výstup by mal vyzerať takto:

iterm výstup
Tento príkaz vytvorí každý prostriedok deklarovaný v danom súbore services.yaml.
Toto je deklaratívny spôsob vytvárania zdrojov kubernetes; deklarujte ich všetky v súbore yaml a odovzdajte tento súbor pomocou príznaku -f príkazu kubectl create a potom sa objaví celá mágia.

To isté urobte pre súbor secrets.yaml, súbor ingress.yaml a súbor deployments.yaml. spustiť:

kubectl create -f ingress.yaml && kubectl create -f deployments.yaml && kubectl create -f secrets.yaml

Po úspešnom dokončení tohto príkazu prejdite do konzoly GCP v časti kubernetes engine> workloads a nájdete zdroje, ktoré ste práve vytvorili.

Prístrojová doska nástroja Google Kubernetes Engine

Ak nič nevidíte, skontrolujte, či ste prešli na správny účet, ktorý ste nastavili pre tento projekt, v pravom hornom rohu a uistite sa, že ste vybrali správny projekt v ľavom hornom rohu, ako je to znázornené nižšie.

dashboard konzoly platformy cloud Google

Pozrite sa na časť venovanú pracovným zaťaženiam, mali by ste mať rozhranie frontend, API a databázu v prevádzke a so zelenými indikátormi začiarknutia.

Prístrojová doska pracovných zaťažení GKE

Zamierte tiež do sekcie služieb a uistite sa, že všetky služby sú zdravé a zdravé pomocou zelených indikátorov.

Ovládací panel služieb GKE

V tomto bode je všetko v poriadku, okrem jednej veci. Ingress controller, bez ktorého nemôžeme pristupovať k žiadnej časti našej aplikácie v cloude google prostredníctvom prehliadača.

Za splnenie Ingresu je zodpovedný kontrolór Ingress, zvyčajne s vyrovnávačom zaťaženia. Samotné vytvorenie zdroja vstupu nebude fungovať bez regulátora vstupu. Našťastie za nás a za kormidlo sa nemusíme dostať do zložitých detailov nastavenia regulátora vstupu od nuly.

Konfigurácia vstupného ovládača

Aby sme v našom klastri spustili a spustili ovládač Ingress, použijeme kormidlo.

zdroj: google.com
Helm je pre Kubernetes čo je homebrew pre MacOS, apt-get je pre Ubuntu a pip je pre Python. Je to správca balíkov pre Kubernetes.

Helm nám umožňuje inštalovať závislosti a celé aplikácie, ktoré boli zoskupené do balíka pomocou jediného príkazu. Začnime inštaláciou a konfiguráciou kormidla.

Vo svojom termináli spustite:

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

Vyššie uvedený príkaz načíta najnovšiu verziu klienta kormidla a nainštaluje ho na váš lokálny počítač (prenosný počítač / počítač).

Na to, aby kormidlo pracovalo s naším klastrom, potrebuje komponent na strane servera nainštalovaný v klastri, s ktorým bude „hovoriť“, aby spravoval a odovzdával príkazy, aby vytvoril všetky prostriedky, ktoré v tomto prípade budeme potrebovať, radič.

Tento komponent sa nazýva Tiller. Ak chcete nainštalovať kultivátor v klastri Google Kubernetes, musíme mať nakonfigurovaný viazanie servisného účtu a role klastra pre kultivátor. Toto umožní kormidelníkovi, aby mohol inštalovať prostriedky kubernetes v našom klastri.

Vo svojom termináli spustite nasledujúce príkazy na inštaláciu a konfiguráciu kultivátora podľa potreby:

kubectl create serviceaccount --namespace kube-system ker && kubectl create clusterrolebinding kormidelník-cluster-Rule --clusterrole = cluster-admin --serviceaccount = kube-system: nasadzovanie kormidla && kubectl --namespace kube-system korekčné nasadenie -p -p '{"Spec": {"spec": {"spec": {"serviceAccount": "kormidlo"}}}}' && helm init - kormidlo účtu služby - upgrade

Ak chcete potvrdiť inštaláciu kultivátora, spustite:

kubectl get nasadenia -n kube-system | nasadenie kormidlového oja

Výsledkom bude vaše novo vytvorené nasadenie kormidla.

Teraz máme nainštalovanú a nakonfigurovanú kormidlo a kormidlo na našej miestnej pracovnej stanici a vzdialenom klastri. Teraz môžeme pokračovať a nainštalovať do nášho klastra radič Ingress.

nginx vstupujúci pre GKE

Existuje množstvo kontrolérov Ingress, na tento účel použijeme kontrolér Ingin nginx, ako sme deklarovali v našom konfiguračnom súbore ingress.yaml. Vo vašej prevádzke terminálu:

helm install - meno nginx-ingress stable / nginx-ingress --set rbac.create = true

Nainštaluje sa ovládač nginx Ingress. Na potvrdenie našej inštalácie spustite:

kubectl get service nginx-ingress-controller

Získate tak výstup zo služby radiča nginx typu loadBalancer s externou IP.

Vytvorenie tejto externej adresy IP trvá chvíľu, takže ak uvidíte „čakajúce“, poskytnite spoločnosti Google niekoľko sekúnd / minút, aby ju mohli poskytnúť.

V tomto okamihu máte prístup k frontendu cez externú IP služby nginx ingress controller. Ale rovnako ako soľ-bae, prečo byť obyčajný . Pripojme túto adresu IP k názvu domény, aby sme k nej mali prístup prostredníctvom adresy ako http://www.myapp.com namiesto http://35.90.3.9.

Ak ho nemáte, môžete si ho kúpiť od obľúbených bohyní, vznášania sa, domén Google, atď. Teraz nakonfigurujte našu doménu.

Konfigurácia DNS

zdroj: pngall.com

Použil som svoje vlastné doménové meno, ktoré si stiahnem týždeň po tomto ukážkovom článku. Zamierte na informačný panel svojej domény a pre frontend, api a databázu nastavte niektoré názvy subdomén.

Moje doménové meno je davidmukiibi.com a subdomény, ktoré som vytvoril, vyzerajú takto:

frontend.davidmukiibi.com
api.davidmukiibi.com
database.davidmukiibi.com
informačný panel vznášajúcej sa domény

Vo svojom termináli spustite:

kubectl získať služby grep LoadBalancer | awk '{print $ 4}'

Skopírujte výstup tohto príkazu; Toto je externá adresa IP, prostredníctvom ktorej je naša aplikácia vystavená internetu.

Na informačnom paneli svojej domény vyplňte túto externú adresu IP ako hodnotu pre 3 sady záznamov, ktoré sme vytvorili.

Ak skontrolujete náš súbor ingress.yaml, všimnete si, že sme ingresérovi dali pokyn cez prostriedok ingress, aby prinútil presmerovať každú požiadavku na https pomocou tejto anotácie:

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

Toto umožní iba zabezpečené pripojenia prostredníctvom našej aplikácie.

Povolenie iba bezpečného pripojenia k vašej aplikácii je najlepšou praxou, najmä ak pracuje s údajmi používateľa. Preto potrebujeme certifikát SSL, ktorý umožní šifrovanie medzi koncovými bodmi medzi našou aplikáciou a používateľom.

zdroj: google.com

Použijeme šifrovanie, pretože ponúka bezplatné certifikáty SSL platné 3 mesiace. Môžete použiť akékoľvek certifikáty, ak ich máte, či už platené alebo bezplatné.

Poskytnutie certifikátu ssl

Na získanie SSL certifikátov z šifrovania umožňuje použitie nástroja s názvom certbot. Inštalujme letsencrypt a certbot.

Zmeňte adresár do konfiguračného priečinka k8s, ak používate Ubuntu Linux, spustite:

apt-get install letsencrypt

Ak používate systém MacOS, spustite:

brew install certbot && pip install letsencrypt --user
Tu nájdete kroky na inštaláciu vášho OS.

Keďže máme jednu subdoménu spojenú s jednou doménou, ktorú máme, vytvoríme zástupný certifikát SSL. Tým sa zabezpečí celá subdoména domény davidmukiibi.com.

Vo svojom termináli spustite:

certbot - manuálne --logs-dir certbot --config-dir certbot --work-dir certbot - preferované výzvy dns certonly --server https://acme- kart.api.letsencrypt.org/directory --email vaša e-mailová adresa -d “* .davidmukiibi.com”
Nahraďte „svoju e-mailovú adresu“ vo vyššie uvedenom príkaze svojou vlastnou e-mailovou adresou.

Postupujte podľa pokynov na obrazovke a poskytnite certifikát SSL pre zástupné znaky vašej domény. Keď dosiahnete výzvu, ktorá hovorí:

Nasadte záznam DNS TXT pod menom
_acme-challenge.erpnext.davidmukiibi.com s nasledujúcou hodnotou: 
„Davidmukiibi.com“ by mal byť názov vašej vlastnej domény

Zamierte na informačný panel svojej domény a vytvorte záznam „txt“ pre doménu _acme-challenge.erpnext.davidmukiibi.com a vyplňte hodnotu zadanú na vašom termináli pomocou certbot.

POZNÁMKA: „davidmukiibi.com“ by mal byť názov vašej vlastnej domény
Výzva SSL TXT acme
Po vytvorení záznamu dajte minútu alebo dve

Vráťte sa k terminálu a stlačte kláves Enter na klávesnici, aby ste pokračovali v procese poskytovania certifikátov.

Dôvodom, prečo budete musieť počkať, je to, že šírenie certifikátov bude trvať dlhšie, a preto sa Certbot nezabezpečí a budete musieť celý proces opakovať znova.

Po dokončení všetkých činností vytvorí certbot v aktuálnom pracovnom adresári priečinok „cerbot“. Výstup na obrazovke vás nasmeruje tam, kde sa nachádza váš SSL certifikát, spolu s 2 potrebnými importovanými súbormi, ktorými sú súbory cert.pem a privkey.pem. V adresári so súbormi * .pem spustite:

cat cert.pem | base64 | pbcopy

Toto kóduje cert.pem do base64 a skopíruje výstupný výsledok kódovaný cert.pem do schránky.

Zamierte na súbor secrets.yaml a vložte ho do hodnoty tls.crt:

secrets.yaml

spustiť:

mačka privkey.pem | base64 | pbcopy

na zakódovanie privkey.pem a vloženie výsledku ako hodnoty tls.key: do súboru secrets.yaml.

Príkazy: „cat cert.pem | base64 | pbcopy “a„ cat privkey.pem | base64 | pbcopy ”base64 kóduje súbory privkey.pem a cert.pem a skopíruje výsledok súčasne. Na vašom termináli teda nebudete mať žiadny výstup, ale ak v textovom editore ctrl + v alebo cmd + v, uvidíte zakódovaný výsledok.

S tajomstvom.yaml naplneným vyššie uvedeným spôsobom spustite:

kubectl create -f secrets.yaml

Takto sa vytvorí zdroj kubernetes typu secret, ktorý náš vstupný prostriedok použije na ukončenie SSL a.k.a bezpečné prehľadávanie pomocou HTTPS.

Foto Mimi Thian na Unsplash

Teraz môžeme roztočiť naše webové prehliadače a prejsť na frontend.davidmukiibi.com, aby sme si overili našu aplikáciu.

Všimnite si, ako sa automaticky presmeruje na HTTPS? Toto je kúzlo, ktoré sa dodáva s použitím ovládača vstupu nginx.

A tu to máte. Nakoniec hostil 3-stupňovú architektonickú aplikáciu v službe Google Kubernetes Engine.

Pokračujte a odstráňte zdroje, ktoré ste práve vytvorili, ak ich už nepotrebujete, pretože ich vyúčtuje služba Google Cloud a zatiaľ sa nepoužívajú.

Ak chcete odstrániť klaster a všetky predtým vytvorené prostriedky, spustite:

klastre kontajnerov gcloud odstrániť $ CLUSTER

Špeciálny výkrik Johnovi, ktorý dal celú žiadosť.

Z tohto článku, ktorý som zostavil, sa dozviete príkazy docker, ktoré zjednodušia váš pracovný postup v doku.

Môžete tu navrhnúť úpravy alebo dodatky k zdieľaným znalostiam. Môžete sa tiež obrátiť na chat cez môj Twitter alebo LinkedIn.