Virtuelne mašine i Linux kontejneri – Deo I

Virtuelizacija

Da li ste nekada poželeli da pokrenete neko okruženje na Vašem računaru, odvojeno od ostatka sistema? Ili možda da pokrenete neku stariju – legacy aplikaciju ili operativni sistem na računaru sa novijim hardverom? Ovo su samo neke od primena virtuelizacije. U seriji članaka „Virtuelne mašine i Linux kontejneri“ ćemo se upoznati sa virtuelnim mašinama i kontejnerima i videti koje su razlike između njih.

Virtuelizacija platforme putem virtuelnih mašina izvodi se na hardverskoj platformi putem host softvera – hipervizora koji stvara simulirano računarsko okruženje za gostujući operativni sistem. Dakle, kod virtuelnih mašina, gostujući operativni sistem se izvršava kao da se izvršava direktno na fizičkom hardveru.

Kontejneri su „laka“ tehnologija virtuelizacije koja se razlikuje od virtuelnih mašina po tome što ne emuliraju hardver i što dele kernel operativnog sistema sa hostom. Kontejner, u stvari, predstavlja izolovani korisnički prostor u kojem se procesi pokreću direktno na kernelu host sistema, ali imaju ograničen pristup resursima sistema.

Virtualne mašine vs. kontejneri

Linux kontejneri

Linux kontejneri su metod virtuelizacije na nivou operativnog sistema koji omogućava pokretanje više izolovanih Linux sistema na kontrolnom hostu koristeći jedan Linux kernel. Ovo omogućava cgroups funkcionalnost Linux kernela koja obezbeđuje ograničavanje resursa (procesora, radne memorije, U/I uređaja, mreže, …), kao i potpunu izolaciju pogleda gostujućeg operativnog sistema na radno okruženje.

U ovom i narednom članku obradićemo kreiranje i upravljanje virtuelnim mašinama i kontejnerima i na njih kao primer postaviti NodeJS web aplikaciju. Za upravljanje virtuelnim mašinama koristićemo VirtualBox, dok ćemo za upravljanje Linux kontejnerima koristiti dva alata – LXC i LXD.

Instalacija Ubuntu-a na VirutalBox-u

U narednom odeljku dato je uputstvo za kreiranje virtuelne mašine upotrebom VirtualBox-a, kao i instalacije operativnog sistema Ubuntu Server 18.04 na kreiranoj mašini.

Kako biste instalirali VirtualBox, aplikaciju možete preuzeti putem linka https://www.virtualbox.org/ i ispratiti instalaciju po koracima.

Kreiranje i podešavanje virtuelne mašine

Sada možemo napraviti novu virtuelnu mašinu. Za operativni sistem Ubuntu Server 18.04 (CLI verzija) potrebno je 256MB sistemske memorije, kao i 1.5GB prostora na disku, pa će podrazumevana podešavanja biti dovoljna. Ipak, pošto su ovo minimalni zahtevi za rad, i pošto ćemo instalirati dodatne potrebne alate, konfiguracija će biti malo drugačija.

1. Odabirom opcije New u toolbar-u kreiraćemo novu virtuelnu mašinu. Pošto ćemo koristiti 64-bitnu verziju Ubuntu Server 18.04 operativnog sistema, odabraćemo tip Linux i verziju Ubuntu (64-bit). Za veličinu memorije ćemo odabrati 1024MB.

Odabir operativnog sistema i naziva virtuelne mašine

2. Nakon podešavanja memorije, potrebno je podesiti disk. Kako bismo to odradili, odabraćemo opciju Create a virtual hard disk now, a zatim odabrati VDI (VirtualBox Disk Image). Nakon toga, potrebno je odabrati opciju za Storage on physical hard disk gde ćemo odabrati Dynamically allocated, kako ne bismo zauzimali više prostora na disku nego što nam je potrebno. Kod opcije File location and size unećemo naziv kreiranog diska i odabrati veličinu od 10GB.

Kreiranje virtuelnog hard diska

Nakon ovoga, virtuelna mašina je kreirana. Pre instalacije operativnog sistema, potrebno je podesiti mrežne adaptere. Kako bi moglo preko mreže spolja (iz lokalne mreže host računara) da se pristupa virtuelnoj mašini, jedan od adaptera biće NAT (Network Address Translation).

Podešavanje mrežnih adaptera

Instalacija Ubuntu Server-a 18.04

Nakon ovih podešavanja, možemo instalirati operativni sistem na virtuelnu mašinu.

1. Prvo je potrebno preuzeti odgovarajući .iso fajl sa strane https://www.ubuntu.com/download/server.

2. Prilikom prvog pokretanja virtuelne mašine, nudi se opcija odabira start-up diska za instalaciju operativnog sistema. Klikom na dugme za odabir diska, otvara se prozor u kojem je potrebno odabrati prethodno preuzeti fajl za instalaciju operativnog sistema. Nakon toga, biramo opciju start kako bismo započeli instalaciju.

Prozor za odabir startup diska

3. Na početku instalacije potrebno je odabrati jezik operativnog sistema, kao i raspored tastera na tastaturi. U trećem koraku, biramo opciju Install Ubuntu. Nakon toga, slede podešavanja mrežnih interfejsa mašine. Ovde ćemo ostaviti sve kako je podrazumevano. Kod odabira diska za particionisanje radi instalacije, biramo ceo disk nakon čega se automatski prave particije. I ovde ćemo ostaviti podrazumevana podešavanja i započeti formatiranje diska, kao i instalaciju.

Konfigurisanje mrežnih interfejsa

4. Dok se u pozadini instalira OS, potrebno je da kreiramo korisnika i damo naziv serveru. Takođe, kao opcija nam se nudi instalacija OpenSSH servera, što ćemo odabrati kako bismo mogli da, između ostalog, prebacimo aplikaciju na virtuelnu mašinu. Nakon toga, stižemo do koraka u kojem se mogu instalirati neki dodatni paketi, koji nama neće biti potrebni, pa je tu potrebno samo nastaviti dalje i sačekati da se instalacija završi.

Opcija za instalaciju OpenSSH servera

5. Na kraju, potrebno je restartovati mašinu i ukloniti instalacioni disk odabirom opcije Devices->Optical Drives->Remove disk from virtual drive u meniju prozora virtuelne mašine. Nakon ovoga, server će biti spreman za korišćenje.

Postavljanje web aplikacije

U tekstu koji sledi, videćemo kako instalirati potrebne alate i postaviti NodeJS aplikaciju na kreiranu virtuelnu mašinu, kao i obaviti potrebna podešavanja kako bi aplikacija bila dostupna preko Interneta. Sve što će biti obrađeno u okviru ovog dela, u drugom delu ćemo primeniti prilikom postavljanja aplikacije na Linux kontejnere.

Instalacija potrebnih alata

Prvo što nam je potrebno od alata su NodeJS i npm (Node Package Manager). Instalacija NodeJS-a (verzije 10.15.3) obavlja se unosom sledećih komandi:

curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash - sudo apt-get install -y nodejs 

Kako instalacija NodeJS-a uključuje i npm, nije ga potrebno naknadno instalirati, mada je moguće da postoji novija verzija koja se razlikuje od one koja dolazi uz Node. Najnoviju verziju npm-a je moguće instalirati unosom komande:

sudo npm install -g npm@latest 

Ono što nam je cilj jeste da postavimo aplikaciju na virtuelnu mašinu tako da bude dostupna u kontinuitetu i radi u pozadini, a olakšavajuća okolnost bi bila i kada ne bismo morali da razmišljamo o ručnom pokretanju aplikacije prilikom restartovanja mašine. U tome će nam pomoći PM2 – menadžer procesa. Poslednja stabilna verzija PM2 se može instalirati unosom komande:

sudo npm install pm2@latest -g 

Podešavanje i pokretanje aplikacije

Nakon instalacije potrebnih alata, možemo preći na podešavanje aplikacije.

Na početku, potrebno je prebaciti potrebne fajlove i instalirati potrebne Node module za aplikaciju. Fajlovi se mogu prebaciti putem FileZilla-e ili sličnog alata.

Vratimo se sada još na mrežna podešavanja. Kao što smo pomenuli, jedan adapter naše mašine je povezan na NAT i ima mogućnost port forwarding-a (preusmeravanje saobraćaja sa određenog porta host sistema na određeni port gostujućeg). To znači da možemo da unesemo pravilo za preusmeravanje koje će konekcije na localhost adresu (127.0.0.1) host mašine sa odabranog porta preusmeriti na adresu dodeljenu virtuelnoj mašini (što se može videti nakon pokretanja virtuelne mašine) na port 22 (ssh port). Zatim se, putem FileZilla-e može pristupiti virtuelnoj mašini upotrebom adrese 127.0.0.1 i odabranog porta.

Node moduli se razlikuju u zavisnosti od operativnog sistema i zauzimaju dosta prostora, pa nije pametno kopirati ih na server. Bolja praksa je kopirati samo package.json fajl, a zatim na serveru pokrenuti komandu npm install i pustiti npm da odradi šta je potrebno.

Nakon prebacivanja fajlova i instaliranja modula, možemo pokrenuti aplikaciju unosom komande:

pm2 start app.js 

unutar foldera u kome se nalazi aplikacija (app.js predstavlja fajl u kome se nalazi kod serverskog dela aplikacije). Ovom komandom se aplikacija pokreće kao pozadinski proces i PM2 je nadgleda i pokreće ukoliko dođe do prekida u radu.

Kao što smo pomenuli, PM2 nudi mogućnost automatskog pokretanja aplikacije kreiranjem startup skripte. Kako bismo generisali ovu skriptu, potrebno je da ukucamo sledeću komandu:

pm2 startup 

Nakon ovoga, u izlazu komande ćemo dobiti uputstvo za postavljanje skripte, tj. komandu koju treba izvršiti kako bi se skripta postavila za pokretanje pri uključivanju mašine. Međutim, to nije sve. Prethodnim komandama obezbedili smo da se automatski pokreću sve aplikacije koje pokreće PM2, ali još uvek nemamo spisak tih aplikacija. Čuvanje trenutnog spiska (koji se može dobiti izvršavanjem komande pm2 list) obavlja se komandom:

pm2 save 

nakon čega će aplikacija biti spremna za rad.

Kako bismo aplikaciji mogli pristupiti iz lokalne mreže kojoj pripada host računar, potrebno je da dodamo pravilo za port forwarding koje će saobraćaj koji dolazi na proizvoljan port host sistema preusmeriti na port virtuelne mašine na kojem sluša naša aplikacija.

Podešavanje port forwardinga sa host sistema ka virtuelnoj mašini

Ovakvim podešavanjem, bez navedenih IP adresa, saobraćaj koji dolazi na bilo koju IP adresu računara (preko bilo kog mrežnog interfejsa) biće preusmeren na bilo koju IP adresu virtuelne mašine. Ukoliko je potrebno, možete odrediti sa koje konkretne IP adrese će saobraćaj biti preusmeren na odgovarajuću IP adresu virtuelne mašine i time u nekoj meri ograničiti pristup aplikaciji. Mi ćemo ostaviti pravilo onako kako je na slici.

Sada našoj aplikaciji mogu pristupiti uređaji iz lokalne mreže. Međutim, aplikacija još uvek nije dostupna preko Interneta pošto je velika verovatnoća da je i lokalna mreža NAT-ovana. Dakle, potebno je podesiti port forwarding na ruteru što se radi na sličan način kao kod virtuelne mašine.

Napomena: Interfejs rutera, raspored opcija, kao i podešavanja se mogu razlikovati u zavisnosti od internet provajdera i proizvođača rutera. U narednom tekstu biće objašnjeno podešavanje Cisco rutera.

Da bismo pristupili podešavanjima rutera, potrebno je da u browser-u ukucamo adresu 192.168.0.1 (adresa gateway-a lokalne mreže) i prijavimo se sa korisničkim imenom i lozinkom. Kod ovog rutera, moguća je prijava bez unosa korisničkog imena i lozinke, što ne mora biti slučaj ukoliko su podrazumevano korisničko ime i/ili lozinka promenjeni. Zatim je potrebno pronaći opciju za podešavanje port forwarding-a koja se kod Cisco rutera nalazi u delu Applications & Gaming->Port range forwarding. Za externalstart i end portove se mogu odabrati bilo koji slobodni portovi preko kojih želite da se sa interneta pristupa aplikaciji (start i end će biti jednaki). Međutim, za internal start i end port neophodno je odabrati port sa kojeg se preusmerava saobraćaj od host mašine ka virtuelnoj mašini kako bi se napravio lanac prosleđivanja saobraćaja od rutera do virtuelne mašine. I ovde imamo mogućnost odabira adrese na koju se prosleđuje saobraćaj, koju ćemo iskoristiti kako bi se saobraćaj prosledio na računar na kojem se nalazi virtuelna mašina. Ovde je potrebno uneti IP adresu tog računara u lokalnoj mreži. Na kraju, potrebno je odabrati koji će paketi biti preusmereni (TCP, UDP ili oba), uključiti pravilo i sačuvati podešavanja.

Podešavanje port forwardinga na ruteru

Sada možemo pristupiti aplikaciji preko Interneta. Sve što je potrebno jeste da saznamo našu javnu IP adresu, što je moguće odraditi na različite načine zavisno od operativnog sistema. Na Windows operativnim sistemima, jednostavna pretraga rečenice „What’s my ip?“ na https://www.google.com/ je dovoljna. Na Linux operativnim sistemima, moguće je izvršiti sledeću komandu kako bi se dobila javna IP adresa:

host myip.opendns.com resolver1.opendns.com | grep "myip.opendns.com has" | awk '{print $4}' 

Nakon saznanja javne IP adrese, potrebno je ukucati je u browser zajedno sa portom koji je ranije odabran kao external port u podešavanjima rutera i aplikacija će biti dostupna.

U narednom delu obradićemo upravljanje Linux kontejnerima na dva načina, kao i videti prednosti i razlike virtuelnih mašina naspram kontejnera.

Literatura

Autor: Jelena Colic

Studentkinja završne godine Informatike na Prirodno-matematičkom fakultetu u Kragujevcu. Tokom studija je bila polaznica radionica i praksi nekoliko IT firmi, kao i mentor programiranja na Matematičkoj radionici mladih. Vredna i motivisana osoba, sa željom za učenjem novih stvari.

Jelena Colic

Studentkinja završne godine Informatike na Prirodno-matematičkom fakultetu u Kragujevcu. Tokom studija je bila polaznica radionica i praksi nekoliko IT firmi, kao i mentor programiranja na Matematičkoj radionici mladih. Vredna i motivisana osoba, sa željom za učenjem novih stvari.