Sunteți pe pagina 1din 36

Inginerie software orientată cloud

Curs 3
Subiecte tratate

• Docker : Compunere containere

• Docker : Orchestrare containere

• Kubernetes : Orchestrare containere


Concepte Docker

Container – mediu de execuție virtual


Service – componentă a unei aplicații distribuite
Definește comportamentul containerului în care rulează: porturi folosite, numărul
de replici, necesar de rețea și resurse, etc.
Scalarea unui serviciu modifică numărul de instanțe de container pe care rulează
software-ul respectiv, asignând mai multe resurse de calcul pentru
serviciul respectiv.
Stack – grup de servicii aflate în relație care partajează dependențe și
care pot fi orchestrate și scalate împreună.

Swarm - grup de mașini pe care rulează SwarmKit, unite într-un


cluster.
Comenzile Docker sunt gestionate de swarm manager. Mașinile pot fi fizice sau
virtuale și reprezintă noduri în swarm. Un nod poate fi manager, worker
sau ambele.
Concepte Docker

Container – mediu de execuție virtual


Service – componentă a unei aplicații distribuite; abstractizare pentru
o resursă de calcul din cadrul unei aplicații, care poate fi scalată /
înlocuită independent de alte componente.
- Definit de o imagine Docker și un set de argumente pentru rulare,
argumente folosite la crearea tuturor containerelor serviciului.
(Este definit comportamentul containerului în care rulează: porturi folosite,
numărul de replici, necesar de rețea și resurse, etc. )
- Instalat pe un set de containere
- Rulat de către platformă conform cerințelor de replicare și a
constrângerilor de amplasare.
Scalarea unui serviciu modifică numărul de instanțe de container pe care
rulează software-ul respectiv, asignând mai multe resurse de
calcul pentru acesta.
Docker : Administrare containere
Compunere și orchestrare

• Compunere = definire de aplicații simple multi-container.

• Orchestrare = definire de servicii multi-nod.

Compunere (orchestrare containere pe un singur nod)


Docker Compose – definire de aplicații simple multi-container ce rulează
pe aceeași gazdă.

Orchestrare
Docker Swarm – definire de aplicații multi-container care rulează pe mai
multe noduri gazdă.
Docker : Compunere containere

Dockerfile – definește dependențele necesare unei instanțe de container


și modul de creare al acestuia.
DAR exemplu
Aplicație web cu acces la BD – necesită serviciu web, pe care se va instala
aplicație, și serviciu BD.
– creare imagine container, include framework (ex.Flask) pentru construire
aplicație web și dependențele de cele 2 servicii (ex. precizate în
requirements.txt)
Containere :
- serviciu web – definit prin construirea aplicației* și portul expus
- serviciu BD

 Definirea arhitecturii aplicației – asamblare aplicație din mai multe


imagini.
*Docker compose folosește Dockerfile, dacă la docker-compose.yml apare secțiunea opțională build,
pentru a construi containerul.
Docker : Compunere containere

În general :

Se construiește câte un Dockerfile corespunzător pentru fiecare imagine


de serviciu din care se compune aplicația.

Compose va lansa comanda build în containerele unde aceasta apare și


va construi aplicația din serviciile care o compun.

Comanda compose poate indica explicit un serviciu care se lansează.


Automat se vor lansa toate dependențele acestuia.
Docker : Compunere containere

Compunerea – definește o aplicație independentă de platformă, bazată


pe containere.

CONCEPTE :
Aplicație = set de containere care rulează împreună și care partajează
un set de resurse și de canale de comunicare. Fiecare container
include o anumită componentă a aplicației (serviciu).
Service = componentă a aplicației; concept abstract implementat pe
platforme prin rularea aceleiași imagini (și configurare), posibil de mai
multe ori.
Serviciile comunică prin rețea.
Network = abstractizarea capabilității platformei de a stabili rute IP de
comunicare între serviciile din containere.
Docker : Compunere containere

CONCEPTE (cont):
Serviciile pot memora și partaja date persistente.
Volum = sistem de fișiere de nivel înalt montat la container.
Config = fișier montat în container în care sunt definite date de
configurare dependente de contextul de execuție sau de platformă.
(abstractizează diferite resurse și servicii de platformă)
Secret = fișier montat în container în care sunt definite date de
configurare senzitive care nu trebuie să fie expuse oricum.

Project = o instalare individuală a unei specificații de aplicație pe o


platformă.
Aceeași specificație poate fi instalată în proiecte diferite.

Explorați exemplul de la :
https://github.com/compose-spec/compose-spec/blob/master/spec.md
Docker : Compunere containere
https://github.com/compose-spec/compose-spec/blob/master/spec.md

Compose file – descriere componente aplicație (yaml file)


networks:
services: configs:
numeRetea :
numeServiciu : driver : numeConfig :
driver_opts : external : true
image :
… numeConfig : ...
ports :
numeRetea : ...
networks :
configs : volumes:
numeVolum :
secrets : driver : secrets:
volumes : driver_opts : numeSecret :
depends_on : size : external : true
numeVolum : ... numeSecret : ...
profiles :
environment :
Profile – definire mod sau context de utilizare
command :
Exemple : test, debug
numeServiciu : ... Implicit – servicul apare în toate profilele.

ATENȚIE : Specificația completă la https://docs.docker.com/compose/compose-file/


Docker : Compunere containere

Docker compose – instrument pentru definire și rulare aplicații Docker


multi-container.
https://docs.docker.com/compose/

Utilizat pentru definire și rulare :


⚫ Containere autonome
⚫ Service stacks instalabile în Swarm

Compose file – definește configurația componentelor aplicației (servicii,


rețele, volume) și a dependențelor dintre acestea (databases,
queues, caches, web service APIs, etc).
Docker : Compunere containere

Docker compose – instrument pentru definire și rulare aplicații Docker


multi-container.
https://docs.docker.com/compose/

Cazuri de utilizare Docker Compose :


- Contexte de dezvoltare
- Contexte pentru testare automată
- Instalare în mediul de producție
https://docs.docker.com/compose/#common-use-cases
https://docs.docker.com/compose/production/
Docker : Compunere containere

În context de dezvoltare :

Se poate atașa volum de disc în container, pe care să se plaseze


codul aplicației => permite recompilarea aplicației, după
modificări ale codului, fără a necesita reconstruirea imaginii.

Comanda Compose up –
- Copiază volumele din containerul vechi în cel nou
- Re-creaza doar containerele care s-au modificat

Lansarea unei comenzi docker-compose up va înlocui vechea


versiune, iar noua versiune apare clienților instantaneu.
Docker : Compunere containere

Fiecare proiect este un context izolat.


Pe baza aceluiași Compose file se pot crea mai multe proiecte :
• pe un sistem de dezvoltare : cópii multiple ale aceluiași context  rulare
unei cópie stabilă pentru fiecare ramură a proiectului
• pe server CI (integrare continuă) : câte un proiect pe fiecare build 
build-urile nu interferează
• pe aceeași gazdă, izolare proiecte ce ar putea folosi aceleași nume de
servicii

Flexibilitate mare : https://docs.docker.com/compose/extends/


— Combinare fișiere Compose, cu suprascriere
— Creare rapidă de variante
— Extindere pentru activități administrative, etc
— Includere de variabile pentru adaptarea la diferite contexte
— Extindere definiții la nivel de serviciu
Subiecte tratate

• Docker : Compunere containere

• Docker : Orchestrare containere

• Kubernetes : Orchestrare containere


Docker : Orchestrare containere

Compunere
Docker Compose – definire de aplicații simple multi-container ce rulează
pe aceeași gazdă.
Orchestrare
Docker Swarm – definire de aplicații multi-container care rulează pe mai
multe noduri gazdă.
Orchestrare (gestionare) a unui swarm.

Swarm = cluster de Docker Engines

Operații
- Creare swarm
- Instalare servicii ale aplicației în swarm
- Gestionare comportament swarm
Docker : Orchestrare containere

Caracteristici :

1. Creare și administrare cluster

2. Model descentralizat : rolurile nodurilor sunt definite la runtime, deci


nodurile se instalează indiferent de rolul lor viitor.

3. Model de servicii declarativ : definire declarativă a (stării ?) serviciilor


din stiva aplicației

4. Scalare : declarare număr de replici per serviciu; managerul swarm


adaugă/elimină taskuri pentru a menține o stare dorită.

5. Monitorizare stare cluster și refacere număr de replici dacă apare o


defecțiune la un nod.
Docker : Orchestrare containere

Caracteristici (cont.):
6. Rețea multi-host : Se poate specifica o rețea (suprapusă serviciilor).
Managerul asignează automat containerelor adrese din această rețea
la inițializarea sau actualizarea aplicației.
7. Descoperire servicii: Server DNS înglobat : Fiecarui serviciu i se
asignează un nume (DNS) după care poate fi descoperit.
8. Echilibrare încărcare: Porturile de acces la servicii se pot expune unui
load balancer extern. Intern, swarm permite specificarea modului de
distribuire pe noduri a containerelor serviciului.
9. Securitate implicită: Fiecare nod din swarm impune autentificare și
criptare TLS la comunicarea cu alte noduri.
10.Rulare actualizări: Se pot aplica incremental actualizări ale serviciului
la noduri. Managerul swarm permite controlul asupra întârzierilor între
instalarea serviciului pe diferite noduri. Dacă apar probleme se poate
face rollback la o versiune anterioară a serviciului.
Docker : Orchestrare containere

Swarm - grup de mașini pe care rulează Docker Engine în mod swarm (SwarmKit
integrat în Docker Engine)
Node - instanță de Docker engine participantă la un swarm :
- manager – gestionează resursele cluster și delegarea taskurilor la noduri worker
- worker – execută task-uri (rulează serviciu swarm) și notifică managerul referitor la stare.
OBS. Operatorul poate actualiza dinamic rolul unui nod.
Nodurile manager
- execută operații de orchestrare și de administrare cluster cu scopul de a
menține starea definită pentru swarm.
- aleg unul din nodurile manager pentru a conduce activitățile de orchestrare
- implicit pot fi concomitent și noduri worker
Nodurile worker
- recepționează și execută task-urile distribuite de noduri manager
- pe fiecare nod rulează un agent care notifică nodul manager despre starea
curentă a task-urilor care îi sunt asignate.
https://docs.docker.com/engine/swarm/key-concepts/
Orchestrare containere – Docker Swarm
https://docs.docker.com/engine/swarm/how-swarm-mode-works/nodes/

Problemă. 1 manager – nu asigură imediat recuperare din avarie


Soluție. Sistem distribuit cu N manageri, cu necesitatea stabilirii consensului
(algoritm Raft) între manageri referitor la starea serviciului.
N manageri => recuperare imediată după avarierea a cel mult (N-1)/2 manageri.
Docker : Orchestrare containere

Swarm service – definiție de task-uri de executat pe noduri.


Grup scalabil de containere cu facilități de rețea, gestionat automat.
Administrat / planificat de un swarm manager.
Accesat din exterior prin PublishedPort. (asignare explicită sau
implicită în domeniul 30000-32767).

Creare serviciu : imaginea container + comenzile de executat în


containere
Opțiuni de lansare – descriere componente și configurații
• Definire stare optimă : nr. de replici, resurse de rețea și de
stocare necesare, porturi expuse de serviciu spre exterior, ...).
• Definire mod de actualizare (e.g. rolling updates).
https://docs.docker.com/engine/swarm/key-concepts/
Docker : Orchestrare containere

Compose file deploy – subsecțiune OPȚIONALĂ în Compose file


- definește cerințe necesare la execuție – metadate despre serviciu
în vederea alocării de resurse adecvate și configurării
acestora corespunzătoare cerințelor de execuție a serviciului.
https://docs.docker.com/compose/compose-file/deploy/
Exemple :
Docker : Orchestrare containere

Swarm service – definițe de task-uri de executat pe noduri.


Task
• container în rulare (include comenzile de rulat în container), parte a unui
serviciu swarm și administrat de un swarm manager (este diferit de container
autonom).
• Unitatea atomică de planificare.
• Nodurile manager asignează task-uri nodurilor worker conform
numărului de replici setate pe serviciu.

Exemplu – serviciu cu 3 replici.

https://docs.docker.com/engine/swarm/how-swarm-mode-works/services/
Docker : Orchestrare containere

Creare serviciu și planificare task-


uri pe noduri.

https://docs.docker.com/engine/swarm/how-
swarm-mode-works/services/
Docker : Orchestrare containere

Servicii replicate și
servicii globale.

https://docs.docker.com/engine/swarm/
how-swarm-mode-works/services/

Servicii globale : servicii care trebuie să


ruleze pe toate nodurile din swarm.

Exemple : agenți de monitorizare,


scanare anti-viruși, etc.
Docker : Orchestrare containere
Echilibrare încărcare
https://docs.docker.com/engine/swarm/ingress/

Folosind serviciu intern de LB


Fiecare serviciu din swarm are o intrare în DNS.
Internal load balancing – distribuire cereri la serviciile din cluster pe baza numelui
DNS al serviciului.
Docker : Orchestrare containere
Echilibrare încărcare
https://docs.docker.com/engine/swarm/ingress/

Folosind și serviciu extern de LB


Gestionat de swarm manager : ingress load balancing pentru expunerea
serviciilor disponibile extern.
Solicitarile de acces la serviciu
se pot face pe PublishedPort al
oricărui nod și vor fi dirijate
către un task activ.
Docker : Tehnologia de orchestrare

Swarmkit

• Implementează nivelul software pentru orchestrare și


este inclus în Docker Engine.

• Este instrument de orchestrare sisteme distribuite

• Include primitive pentru

• descoperire nod,

• consens bazat pe algoritmul Raft,

• planificare task-uri, etc.


Docker : Tehnologia de orchestrare

Avantaje SwarmKit:
• Distribuire: Utilizează algoritmul Raft de stabilire a consensului pentru
coordonarea mai multor componente implicate în luarea de decizii =>
se evită punct unic de cădere.
• Securitate: Comunicarea între noduri și calitatea de membru în
swarm sunt securizate față de exterior; folosește TLS (autentificare nod,
autorizare rol, encriptare date transferate).
• Simplitate: simplu din punct de vedere operațional, minimizează
dependențele de infrastructură, nu necesită bază de date externă.
• Modificare dinamică automată a configurației unui serviciu (inclusiv
rețele și volume la care este conectat) fără restartarea manuală a
serviciului:
• actualizare configurație
• oprire taskuri cu configurare veche
• creare taskuri cu configurare nouă.
Subiecte tratate

• Docker : Compunere containere

• Docker : Orchestrare containere

• Kubernetes : Orchestrare containere


Kubernetes : Orchestrare

COMPONENTE https://kubernetes.io/docs/concepts/overview/components/

Cluster – noduri (worker) pe care pot rula aplicații containerizate.


kubelet – gestionare containere din nod
kube-proxy – proxy de comunicare prin rețea cu nodul
Container runtime – infrastructura de containerizare (ex. Containerd, CRI-O,
Docker?)
CONCEPTE Kubernetes : Orchestrare
Pod = grup de contaienere (1..n), co-localizate și co-planificate, care cooperează și
partajează resurse (spații de nume, stocare - volume cu sistem de fișiere - ,
comunicare în rețea).
- Unitate atomică de instalare și gestionare
- Include specificarea modului de rulare a containerelor
- Simulează o gazdă logică, formată din containerele ce conțin
componentele strâns cuplate ale unei aplicații (ex. Un container pentru
inițializarea aplicației și altul pentru aplicația propriu-zisă)
- Din perspectiva rețelei, toate procesele din aceste containere sunt locale
(localhost).
- Conține doar o instanță a unei aplicații => scalare și/sau toleranță la erori
prin creare replication (ReplicaSet = colecție de Pods) gestionată de un
controller

Exemplu de Pod cu 2 containere (actualizare


fișiere și publicare fișiere) care comunică prin
volum de stocare partajat.
https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/
Kubernetes : Orchestrare

CONCEPTE
Workload – aplicație ce rulează pe Kubernetes, într-un set de Pods.
Workload resource – resursă pentru creare și gestionare Pods.

Resurse pentru gestionare Pods încorporate în Kubernetes :


• Deployment = resursă pentru gestionare automată a unui grup scalabil de Pods
ale unei aplicații stateless (orice Pod este interschimbabil și poate fi înlocuit)
• StatefulSet = resursă pentru gestionare automată a unui grup de Pods cu
păstare stare
• DaemonSet = resursă pentru oferire de facilități locale nodurilor și Pod-urilor
unei aplicații stateless
• Job / Cron Job = activități lansate automat ce se execută până la terminarea lor

Kubernetes YAML file = descriere obiecte Kubernetes (componentele și


configurațiile unei aplicații)
Kubernetes : Orchestrare

CONCEPTE
Pod – conține și administrează unul sau mai multe containere în care este
instalată o instanță de aplicație.
Replica Set – gestionează instanțe multiple ale unei aplicații
• scalare
• toleranță la defecte – la căderea infrastructurii unui Pod se crează
alt Pod, iar dacă Pod-ul căzut revine, Kubernetes va elimina un Pod
pentru a păstra același număr de instanțe ale aplicației
• Modificare aplicație – creare n Pods cu noua versiune și păstrarea
celor anterioare până la eliminarea lor explicită
Deployment - gestionează instanțe multiple ale unei aplicații
• Utilizare Replica Sets pentru gestionare replici => scalare și
toleranță la defecte
• Facilități suplimentare orientate pe evoluția aplicației
Kubernetes : Orchestrare

Pod – conține și administrează unul sau mai multe containere în care este
instalată o instanță de aplicație.
Replica Set – gestionează instanțe multiple ale unei aplicații
Deployment - gestionează instanțe multiple ale unei aplicații
• Utilizare Replica Set pentru gestionare replici => scalare și toleranță
la defecte.
• Facilități suplimentare orientate pe evoluția aplicației
• Creare n Pods gradual în compensare cu eliminarea celor din
vechea versiune. (2 seturi de replici : old și new)
• Verificarea fiecărui container al noii versiuni pe măsură ce este
creat
• Eroare la container nou creat => păstrarea vechii versiuni a
acestuia și oprire instalare (deployment)
• Rollback deployment – inversare semnificație seturi de replici și
eliminare/recreare containere gradual.
Experiment

LAB – Experimentați :

https://docs.docker.com/get-started/orchestration/

https://docs.docker.com/get-started/swarm-deploy/

https://docs.docker.com/get-started/kube-deploy/

Studiați :

• CI (Continous Integration) cu Docker compose

https://semaphoreci.com/blog/2017/09/13/continuous-integration-with-
docker-compose.html

• CICD_with_Docker_Kubernetes_Semaphore.pdf

S-ar putea să vă placă și