Differences

This shows you the differences between two versions of the page.

Link to this comparison view

rl:labs:11 [2019/12/09 14:55]
marius.calapod [Arhitectura Monolită vs. Arhitectura bazată pe microservicii]
rl:labs:11 [2024/01/09 08:27] (current)
cosmin.prunaru [Pregătire infrastructură de laborator]
Line 1: Line 1:
 ~~NOTOC~~ ~~NOTOC~~
  
-====== Laborator 11. Virtualizare în Docker ​======+====== Laborator 11. Google Cloud Platform (GCP) ====== 
 + 
 +  * [[ https://​curs.upb.ro/​2023/​mod/​feedbackadm/​view.php?​id=9386 | Feedback CA]] 
 +  * [[ https://​curs.upb.ro/​2023/​mod/​feedbackadm/​view.php?​id=9388 | Feedback CB]] 
 +  * [[ https://​curs.upb.ro/​2023/​mod/​feedbackadm/​view.php?​id=9390 | Feedback CC]] 
 +  * [[ https://​curs.upb.ro/​2023/​mod/​feedbackadm/​view.php?​id=9392 | Feedback CD]]
  
 ===== Cunoștințe și abilități ce vor fi dobândite ===== ===== Cunoștințe și abilități ce vor fi dobândite =====
  
-  * Intoducere în Docker CLI +  * Administrarea resurselor cloud folosind consola grafică. 
-  * Docker Container vs Docker Image +  * Securitate în cloud. 
-  * Dockerfile și construcția de Imagini +  * Configurarea rutării în cloud. 
-  * Union File System: Overlay2 - image layers +  * Accesarea serviciilor de transfer de fișiere ​(FTP). 
-  * Docker Volumes +
-  * Docker Networking: bridge & overlay ​(VXLAN+
-  * Docker SWARM +
-  * Introducere în arhitecturi pe microservicii +
-  * Arhitecturi pe microservicii vs Arhitecturi monolite+
 ===== Pregătire infrastructură de laborator ===== ===== Pregătire infrastructură de laborator =====
  
-<note warning>+  * Vom crea o infrastructură de rețea în cloud-ul Google. 
 +  * Fiecare student va folosi contul propriu de pe [[https://​console.cloud.google.com/​|GCP]]. Pentru a putea crea infrastructura necesară veți primi un număr de credite pentru GCP.  ​
  
-**Creaț2 mașini virtuale.**+<note warning>​Fiecare student îșva denumi resursele astfel //​student<​X>//​-[nume_resursa]. De exemplu //​student1-//​vpc. GCP acceptă în numele de obiecte doar litere mici, cifre și cratimă
  
-Folosiți imaginea ​**Ubuntu 16.04 Xenial** cu flavor **m1.medium** pe [[https://cloud-controller.grid.pub.ro/dashboard|Openstack]].+Vă puteți afla ID-ul accesând linkul ​**"https://rl.vladn.st/get/<​email>"​** </​note>​
  
-Atenție ! Utilizatorul **NU** este **student**,​ ci **ubuntu**.+===== Introducere =====
  
-<code bash> +Servicii de cloud existente
-ubuntu@hostname:~# sudo apt-get update +  * Google Cloud Platform 
-ubuntu@hostname:​~#​ sudo apt-get install docker +  * Microsoft Azure 
-ubuntu@hostname:​~#​ sudo apt-get install docker.io +  * Amazon Web Services.
-ubuntu@hostname:​~#​ cat /​etc/​hostname +
-$MY_HOSTNAME +
-ubuntu@hostname:​~#​ cat /​etc/​hosts ​  # Adăugați linia următoare în fișierul /​etc/​hosts +
-127.0.0.1 $MY_HOSTNAME +
-[...] +
-ubuntu@hostname:​~#​ sudo usermod -aG docker $USER +
-ubuntu@hostname:​~#​ exit # LOGOUT+
  
-$FEP_USER@fep.grid.pub.ro:~$ ssh -i ~/​.ssh/​id_rsa ubuntu@$VM_IP_ADDRESS # LOGIN+Vom discuta mai departe despre **Google Cloud Platform** (GCP)Serviciile pe care le vom folosi în cadrul laboratorului:
  
-</​code>​ +  * Google Compute Engine 
-</​note>​+  * Networking: VPC, Cloud NAT
  
-<note important>​ +Alte servicii în cloud-ul GCP:
-Pentru instalarea Docker pe Ubuntu urmăriți procedura de aici [1]. Suplimentar față de pașii descriși anterior, rulați comanda: +
-''​sudo usermod ​-aG docker $USER''​ +
- ​desprinsă din documentația [2]+
  
-  * [1] https://​docs.docker.com/​install/​linux/​docker-ce/​ubuntu/​ +  * Cloud Storage 
-  * [2] https://​docs.docker.com/​install/​linux/​linux-postinstall/​ +  * DatabasesAlloyDB, Cloud SQL, Cloud Bigtable 
-</​note>​+  * NetworkingCloud DNS, Cloud CDN 
 +  * Cloud Monitoring
  
-===== Introducere =====+O listă completă a tuturor serviciilor oferite de Google poate fi consultată aici : 
 +[[https://​cloud.google.com/​terms/​services| GCP Services]]
  
-Iată că ne regăsim la sfârșitul semestrului I din anul 3, după o lungă și dificilă călătorie prin tainele ingineriei Calculatoarelor,​ traseu ce a adus în planul de studiu și materia Rețele locale. ​ 
  
-Întrucât, preponderența claselor din anii anteriori a fost cu precădere orientată pe multe din aspectele complexe ale dezvoltării de softwareîn laboratorul de azi ne propunem să oferim o altă perspectivă în conceperea unei aplicații ​sau a unei soluții. Aspecte precum **volumul de date de procesat****toleranțla defecte****portabilitatea** sau **scalabilitatea** sunt constrângeri esențiale care trebuie tratate în procesul de implementare a unei soluții sau aplicații+**(Google) Compute Engine** oferă capacitate dinamică computațională în cloud. De asemeneapentru a dezvolta și lansa aplicații ​nu mai ai nevoie să îți achiziționezi hardware-ulacest serviciu punându-țla dispoziție:​ servere virtualeconfigurarea securității și networking, ajustarea spațiului de stocare.
  
-Standardele și cerințele dictate de industrie se focalizează din ce în ce mai mult pe adoptarea modelului de cloud, menit, de cele mai multe ori, să ofere un șablon/​pattern care să adreseze parțial sau integral constrângerile (sau oportunitățile) menționate anterior+{{ :​rl:​labs:​vpc-overview-example.png?500 |}}
  
-Laboratorul curent își propune ​introducere pragmatică în modele clasice ​de system design & architecture încercând să atingă gradual mici elemente ​de complexitatecare pot aduce un plus de valoare unei aplicații ​în contextul ​de cloud. ​+**Virtual Private Cloud (VPC) Network** te ajută să pornești resursele GCP într-rețea virtuală definită de tine. Această rețea seamănă cu o rețea tradițională unde poți configura spații ​de adresetabele ​de rutare, gateways și setări de securitate, dar are în plus beneficiile utilizării unui infrastructuri scalabile. Fiecare VPC creat este izolat logic de oricare alt VPC din cloud.
  
-Modelele prezentate ​pot fi puncte ​de plecare importante pentru parcurgerea unor interviuri de Site Reliability EngineerCloud Engineer sau DevOps Engineer+Două sau mai multe VPC-uri pot comunica folosind **VPC Network Peering**. Rețelele VPC conectate folosind VPC Network Peering ​pot fi în același proiect sau proiecte diferite. \\ 
 +\\ 
 +Pot fi create două tipuri ​de rețele tip VPC: 
 +  * auto-mode - unde un subnet din fiecare regiune este automat alocatsubnet-ul fiind creat sub blocul de adrese 10.128.0.0/​9 .  
 +  * custom-mode - nu sunt create subnet-uri automat și utilizatorul poate avea control complet asupra clasei de IP-uri private utilizate pentru crearea VPC-ului
  
-Mai multlaboratorul deservește,​ în egală măsură, o introducere ​în DockerDocker Networking & Docker Orchestrationfacilitând implementarea graduală a unui serviciu webde la concept până într-o formă care ar putea răspunde unor cerințe reale de producție. Laboratorul se adresează în egală măsură atât oamenilor cu înclinații către dezvoltare ​cât și oamenilor care se orientează spre poziții operaționale.+Având în vedere considerentele de mai susnu se pot conecta două rețele VPC create ​în auto-modedar se pot conecta două rețeleuna creată auto-modecealaltă custom-mode cât timp nu folosesc adrese IP din aceeași clasă. 
  
-**Ben Treynor** //VP of Engineers @ Google// și inventatorul termenului **Site Reliability Engineer** încercând să definească conceptul: +3 tipuri de adrese IP:
-//"​Fundamentally,​ it’s what happens when you ask a software engineer to design an operations function"//​+
  
-Înainte de pătrunde ​în tainele containerizarii cu Docker, ​vom încerca să definim un model arhitectural ​care să se încadreze ​în tipul de aplicație pentru ​care Docker devine o unealtă importantă.+  * adrese IP private 
 +  * adrese IP publice. O adresă publică ce fost atribuită unei instanțe pe care am închis-o va reveni ​în pool-ul inițial de adrese. Când vom reporni instanța, aceasta va avea o altă adresă IP publică. 
 +  * adrese IP publice statice sunt adrese IP publice ​care rămân asociate pe cont până în momentul în care alegi să renunți la ele.\\
  
-===== Arhitectura Monolită vs. Arhitectura bazată pe microservicii ===== 
- ​{{:​rl:​labs:​fullstack-single-system.png?​350|}} {{ :​rl:​labs:​fullstack-distributed-system.png?​350|}} ​ 
- 
-Este greșit să plecăm de la premisa că o abordare este mai bună decât cealaltă, fiecare fiind o opțiune optimă în contextul potrivit. O abordare monolită implică dezvoltarea întregului stack de aplicație pe un singur nod, un singur sistem, în timp ce, în cadrul modelului bazat pe microservicii,​ fiecare __unitate funcțională__ va avea propriul mediu izolat în care rulează. Gradul de rezoluție pentru definirea unității funcționale poate varia, de la viziunea macro, cu 2 componente: Frontend - Backend, până la nivelul de granularitate prin care putem avea fiecare __feature__ al aplicației dezvoltat ca un __microserviciu__ (ca un obiect rulând individual). 
  
 <note tip> <note tip>
-Mai multe referințe despre microservicii:​ +//Care este diferența între adrese IP private și adresele IP publice?//
-  * https://martinfowler.com/​articles/​microservices.html +
-  * https://​microservices.io/​ +
-  * https://​nigelpoulton.com/​blog/f/demystifying-docker-overlay-networking+
 </​note>​ </​note>​
  
-O comparație minimală între cele două modele arhitecturale,​ reliefând aspecte pozitive și problematice în ambele abordări, poate fi văzută în tabelul următor: 
  
-^    Arhitecturi Monolite ​     ^     ​Arhitecturi bazate pe Microservicii ​      ^ 
-|  Modulele unei aplicații sunt Tightly Coupled (ex: Comunicare Inter Proces - IPC)    |  Serviciile unei aplicații sunt Loosely Coupled (ex: communicare peste rețea utilizând mesaje HTTP via REST API microservices) ​ | 
-|  Fiecare funcționalitate nouă trebuie scrisă în același limbaj de programare. ​   |  Fiecare serviciu component al aplicației poate fi scris într-un limbaj diferit. ​   | 
-|  Modificarea codului presupune recompilarea și reinstalarea (redeployment-ul) întregii aplicații. ​   |  Modificarea unui serviciu/​feature necesită reinstalarea acelui serviciu, celelalte rămânând intacte și operaționale. ​    | 
-|  Simplu de dezvoltat. ​ |  Poate aduce un nivel de complexitate mult prea mare (ex: pentru fiecare serviciu trebuie construit un API care să faciliteze comunicația între microservicii) ​ | 
-|  Scalarea aplicației se aplică întregului stack. ​ |  Procedurile de scalare pot fi aplicate pe servicii individuale (eg: multiplicarea serviciului de Frontend al unui magazin online în timpul reducerilor de Black Friday) ​ | 
  
-Abordarea pe care vom merge în continuare este una bazată pe servicii, cu amendamentul că unitățile funcționale vor fi construite la un nivel de rezoluție macro: **Frontend** și **Backend**,​ la care vom atașa și o **bază de date**. ​ 
-Să presupunem că avem o cerere din partea unui angajator de a dezvolta un site de stocare și partajare de imagini. Trebuie să ne asigurăm că acesta îndeplinește un set minimal de caracteristici,​ înainte de a fi lansat în producție: 
-  * nivelul de utilizare va fi unul mediu 
-  * va porni cu un set minimal de funcționalități,​ dar va fi extins în timp 
-  * echipa de dezvoltatori este foarte dinamică din perspectiva migrării către alte proiecte, iar cunoștințele legate de anumite limbaje de programare sunt neuniforme ​ 
-  * se dorește ca serviciul să aibă o rată de availability care să tindă spre procentul de 99% (Maxim 7 ore 18 minute și 17.5 secunde downtime pe lună - https://​uptime.is/​ )  
-  * se estimează că în perioada sărbătorilor vor exista spike-uri în utilizare, întrucât audiența va căuta activ poze cu mesaje motivaționale. 
  
-Aplicația construită pentru laborator va aborda o arhitectură simplificată,​ bazată pe servicii, Vom încerca ​să utilizăm Docker pentru a ne asigura că îndeplinim cât mai multe din cerințele date. Înainte de a parcurge cerințele proiectului,​ ne vom familiariza cu tehnologia de containerizare.+**Subnet** - interval de adrese IP într-un VPC. Poțsă lansezi resursele GCP într-un subnet fie ales automat (auto-mode) fie creat la alegere (custom-mode).
  
 +În GCP avem două tipuri de **IP-uri**:
 +
 +  * **Publice** (atunci când resursele trebuie să aibă acces direct în Internet, de exemplu serverele web). O adresă IP publică poate fi configurată pe interfața unei mașini virtuale create în GCP. Pot fi aplicate ulterior reguli de firewall pentru a putea controla accesul către acea mașină virtuală. ​
 +  * **Private** (atunci când resursele nu trebuie să fie accesibile din Internet, de exemplu bazele de date)
 +
 +
 +<note important>​
 +
 +În fiecare subnet, există 4 IP-uri rezervate în intervalul primar :
 +
 +  * Prima este adresă de rețea
 +  * A doua este rezervată ca adresă pentru default gateway.
 +  * Penultima adresă este rezervată de către GCP pentru viitoare utilizări. ​
 +  * Ultima este adresa de broadcast
 +
 +</​note>​
 +
 +
 +**Cloud NAT**. Cloud NAT este o componentă a GCP care permite comunicarea între instanțele din VPC care nu folosesc adrese IP publice și Internet.\\
 +Cloud NAT oferă conectivitate în Internet pentru următoarele tipuri de resurse:
 +  * Mașini virtuale din Compute Engine fără adrese IP publice/​externe asociate
 +  * Clustere de Google Kubernetes Engine (GKE)
 +  * Instanțe de Cloud Run (aplicații containerizate),​ Cloud Functions (code in the cloud/​FaaS),​ App Engine
 +
 +
 +**Tabela de rutare**. Fiecare subnet dintr-un VPC trebuie să aibă asociată o tabelă de rutare, definită în cadrul VPC network.
 +Google Cloud folosește mai multe tipuri de rute:
 +
 +  * Generate de sistem
 +      * Rute default ( 0.0.0.0/0 pentru IPv4 sau ::/0 pentru IPv6)
 +      * Rute pentru subrețea (create automat pentru fiecare subrețea)
 +  * Rute personalizate (custom)
 +      * Statice (către diverse destinații)
 +      * Dinamice (sesiuni BGP către un Cloud Router)
 +  * Rute peering
 +  * Rute policy-based (către un Network Load Balancer din GCP).
 +
 +Un **VPC firewall** acționează ca un firewall virtual care controlează traficul pentru una sau mai multe instanțe. Putem adăuga reguli pentru fiecare firewall care să permită traficul către/de la instanțele asociate. ​  
 +
 +Prestabilit,​ fiecare firewall permite tot traficul de ieșire și blochează traficul de intrare. ​
 +Acțiunile pentru o regulă din firewall pot fi ori "​allow"​ ori "​deny",​ nu ambele. ​
 +
 +<note tip>​Pentru mai multe detalii despre funcționarea VPC-urilor și resursele GCP, urmăriți [[https://​www.youtube.com/​watch?​v=vACTtmLWiQY|tutorialul]].
 +
 +Documentație GCP:
 +
 +[[https://​cloud.google.com/​curated-resources/​compute-engine?​hl=en|Compute Engine]]\\
 +[[https://​cloud.google.com/​vpc/​docs/​overview?​hl=en|VPC and Subnets]]\\
 +[[https://​cloud.google.com/​network-connectivity/​docs/​router/​concepts/​overview?​hl=en|Cloud Router]]\\
 +</​note>​
 +
 +
 +===== Topologie =====
 +
 +{{ :​rl:​labs:​12:​gcp_infrastructure.png |}}
  
 ===== Navigare ===== ===== Navigare =====
Line 108: Line 140:
 ===== Exerciții ===== ===== Exerciții =====
  
-{{namespace>:​rl:​labs:​11:​contents&​nofooter&​noeditbutton}}+Acest laborator își propune configurarea unei rețele asemănătoare topoligiei de mai sus. 
 +Vom avea nevoie de crearea **unui VPC** cu **4 subnets**, unul în care va fi creată stația **Host**, iar apoi **câte un subnet** separat pentru **Red**, **Green** și **Blue**.
  
 +Stația **Host** va fi folosită drept **Bastion**,​ o mașină virtuală folosită doar pentru a ne conecta prin Internet la celelalte mașini, **Red**, **Green** și **Blue**.
  
-===== Cunoștințe acumulate ===== +Această va avea configurată o adresa IP publică, celelalte vor avea configurate doar adresa IP private, comunicând pe Internet cu ajutorul serviciului de **Cloud NAT**. 
-  ​Intoducere în Docker CLI + 
-  ​Docker Container vs Docker Image + 
-  * Dockerfile ​și construcția ​de Imagini +Următoarele exerciții constituie pașii de parcurgere pentru ca la final să putem folosi rețeaua. 
-  * CMD vs ENDPOINT + 
-  * Union File System: Overlay2 - image layers + 
-  * Docker Volumes +{{namespace>​:rl:​labs:​11:​contents&nofooter&​noeditbutton}}
-  * Mount binding vs volumes +
-  * Docker Networkingbridge ​overlay (VXLAN) +
-  * Docker SWARM +
-  * Introducere în arhitecturi pe microservicii +
-  * Arhitecturi pe microservicii vs Arhitecturi monolite+
  
rl/labs/11.1575896158.txt.gz · Last modified: 2019/12/09 14:55 by marius.calapod
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0