{"id":97254,"date":"2020-10-17T02:42:32","date_gmt":"2020-10-17T00:42:32","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/prosti-openshift-my-nedostatochno-czenili-tebya-i-prinimali-kak-dolzhnoe"},"modified":"2020-10-17T02:42:32","modified_gmt":"2020-10-17T00:42:32","slug":"prosti-openshift-my-nedostatochno-czenili-tebya-i-prinimali-kak-dolzhnoe","status":"publish","type":"post","link":"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/prosti-openshift-my-nedostatochno-czenili-tebya-i-prinimali-kak-dolzhnoe","title":{"rendered":"\u017dao mi je, OpenShift, nismo te dovoljno cijenili i uzeli te zdravo za gotovo","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ova objava je napisana jer su na\u0161i zaposlenici imali puno razgovora s klijentima o razvoju aplikacija na Kubernetesu i specifi\u010dnostima takvog razvoja na OpenShift-u.<\/p>\n<p><img decoding=\"async\" alt=\"\u017dao mi je, OpenShift, nismo te dovoljno cijenili i uzeli te zdravo za gotovo\" src=\"\/wp-content\/uploads\/2020\/10\/ad447aeb80d3ae56ea4598cd959456de.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nObi\u010dno po\u010dinjemo s tezom da je Kubernetes jednostavno Kubernetes, dok je OpenShift ve\u0107 Kubernetes platforma, poput Microsoft AKS ili Amazon EKS. Svaka od ovih platformi ima svoje prednosti, usmjerene na odre\u0111enu ciljanu publiku. Nakon toga, razgovor se prelijeva u usporedbu snaga i slabosti konkretnih platformi.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nU su\u0161tini, razmi\u0161ljali smo o tome da napi\u0161emo ovu objavu s zaklju\u010dkom tipa \u201eSlu\u0161ajte, zapravo nije va\u017eno gdje pokre\u0107ete kod, na OpenShift-u ili na AKS-u, na EKS-u, na nekom prilago\u0111enom Kubernetes-u, zapravo na bilo kojem Kubernetes-u <i>(radi jednostavnosti, nazovimo ga KUK)<\/i> \u2013 to je stvarno jednostavno, i tamo i ovdje.<\/p>\n<p>Zatim smo planirali uzeti najjednostavniji \u201eHello World\u201c i na njegovom primjeru prikazati \u0161to je zajedni\u010dko i koje su razlike izme\u0111u KUK-a i Red Hat OpenShift Container Platform (dalje, OCP ili jednostavno OpenShift).<\/p>\n<p>Me\u0111utim, tijekom pisanja ove objave, shvatili smo da smo se toliko dugo i sna\u017eno navikli koristiti OpenShift, da jednostavno ne primje\u0107ujemo koliko je narastao i postao nevjerojatna platforma koja je mnogo vi\u0161e od obi\u010dnog Kubernetes distribucije. Navikli smo do\u017eivljavati zrelost i jednostavnost OpenShift-a kao ne\u0161to podrazumijevano, zanemaruju\u0107i njegovu veli\u010danstvenost.<\/p>\n<p>U su\u0161tini, do\u0161lo je vrijeme za aktivno pokajanje, i sada \u0107emo korak po korak usporediti uvo\u0111enje svog \u201eHello World\u201c na KUK-u i na OpenShift-u, i to \u0107emo u\u010diniti \u0161to objektivnije (pa mo\u017eda i iskazuju\u0107i povremeno osobni odnos prema temi). Ako vas zanima isklju\u010divo subjektivno mi\u0161ljenje o ovoj temi, mo\u017eete pro\u010ditati <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/swlh\/im-so-sorry-openshift-i-ve-taken-you-for-granted-f36fb47ea4d9\">ovdje (EN)<\/a><\/noindex>. A u ovoj objavi \u0107emo se dr\u017eati \u010dinjenica i samo \u010dinjenica.<\/p>\n<h3>Klasteri<\/h3>\n<p>\nDakle, za na\u0161 \u201eHello World\u201c potrebni su klasteri. Odmah ka\u017eemo \u201ene\u201c svim javnim oblacima, kako ne bismo pla\u0107ali za servere, registre, mre\u017ee, prijenos podataka itd. Stoga biramo jednostavni jednoklju\u010dni klaster na <noindex><a rel=\"nofollow\" href=\"https:\/\/minikube.sigs.k8s.io\/docs\/start\/\">Minikube<\/a><\/noindex> (za KUK) i <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/products\/codeready-containers\/overview\">Code Ready Containers<\/a><\/noindex> (za OpenShift klaster). Obje ove opcije su zapravo jednostavne za instalaciju, ali \u0107e zahtijevati prili\u010dno mnogo resursa na va\u0161em laptopu.<\/p>\n<p><img decoding=\"async\" alt=\"\u017dao mi je, OpenShift, nismo te dovoljno cijenili i uzeli te zdravo za gotovo\" src=\"\/wp-content\/uploads\/2020\/10\/01c748365253fc9e11e817876629ae7e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Izgradnja na KUK-u<\/h3>\n<p>\nDakle, idemo.<\/p>\n<h4>Korak 1 \u2013 izradimo na\u0161u kontejnersku sliku<\/h4>\n<p>\nZapo\u010dnimo s tim da \u0107emo implementirati na\u0161 \u201eHello World\u201c na minikube-u. Za to \u0107e biti potrebno:<\/p>\n<ol>\n<li>1. Instalirani Docker.<\/li>\n<li>2. Instalirani Git.<\/li>\n<li>3. Instalirani Maven (usput, u ovom projektu koristi se mvnw binarna verzija, pa se mo\u017ee pro\u0107i i bez njega).<\/li>\n<li>4. Sam izvorni kod, tj. klon repozitorija <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/gcolman\/quarkus-hello-world.git\">github.com\/gcolman\/quarkus-hello-world.git<\/a><\/noindex><\/li>\n<\/ol>\n<p>\nPrvo \u0161to treba u\u010diniti je stvoriti Quarkus projekt. Ne bojte se ako nikada niste radili sa stranicom Quarkus.io \u2013 to je lako. Samo odaberite komponente koje \u017eelite koristiti u projektu (RestEasy, Hibernate, Amazon SQS, Camel itd.), a zatim \u0107e Quarkus sam, bez va\u0161eg sudjelovanja, postaviti Maven arhetip i sve objaviti na github. Drugim rije\u010dima, doslovno jedan klik mi\u0161em \u2013 i gotovo. Zato volimo Quarkus.<\/p>\n<p><img decoding=\"async\" alt=\"\u017dao mi je, OpenShift, nismo te dovoljno cijenili i uzeli te zdravo za gotovo\" src=\"\/wp-content\/uploads\/2020\/10\/39a62058d91f8443e77466d374d02d34.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Najlak\u0161i na\u010din za izradu na\u0161eg 'Hello World' u kontejnerski obrazac je kori\u0161tenje quarkus-maven ekstenzija za Docker, koje \u0107e odraditi sav potreban posao. Sa dolaskom Quarkusa, ovo je postalo zaista lako i jednostavno: dodajte ekstenziju container-image-docker i mo\u017eete stvarati slike s Maven komandama.<\/p>\n<pre><code class=\"plaintext\">.\/mvnw quarkus:add-extension -Dextensions=\"container-image-docker\"\n<\/code><\/pre>\n<p>\nI kona\u010dno, izvodimo izgradnju na\u0161eg obrasca koriste\u0107i Maven. Kao rezultat, na\u0161 izvorni kod se pretvara u gotov kontejnerski obrazac, koji se ve\u0107 mo\u017ee pokrenuti u okru\u017eenju kontejnera.<\/p>\n<p><img decoding=\"async\" alt=\"\u017dao mi je, OpenShift, nismo te dovoljno cijenili i uzeli te zdravo za gotovo\" src=\"\/wp-content\/uploads\/2020\/10\/94b74cac6616896eb672a72302e70169.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<pre><code class=\"plaintext\">.\/mvnw -X clean package -Dquarkus.container-image.build=true\n<\/code><\/pre>\n<p>\nEto, to je to, sada mo\u017eemo pokrenuti kontejner s docker run, mapiraju\u0107i na\u0161 servis na port 8080, kako bismo mu mogli pristupiti.<\/p>\n<pre><code class=\"plaintext\">docker run -i --rm -p 8080:8080 gcolman\/quarkus-hello-world\n<\/code><\/pre>\n<p><img decoding=\"async\" alt=\"\u017dao mi je, OpenShift, nismo te dovoljno cijenili i uzeli te zdravo za gotovo\" src=\"\/wp-content\/uploads\/2020\/10\/4f46e13423d5027d85ebae2c98c926b8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Nakon \u0161to se instanca kontejnera pokrene, ostaje samo provjeriti s komandama curl da na\u0161 servis radi:<\/p>\n<p><img decoding=\"async\" alt=\"\u017dao mi je, OpenShift, nismo te dovoljno cijenili i uzeli te zdravo za gotovo\" src=\"\/wp-content\/uploads\/2020\/10\/1c1462f52d6a487863c21f8f72a09d1f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Dakle, sve radi, i to je bilo zaista lako i jednostavno.<\/p>\n<h4>Korak 2 \u2013 \u0161aljemo na\u0161 kontejner u repozitorij kontejnerskih slika<\/h4>\n<p>\nZa sada, stvorena slika se \u010duva lokalno, u na\u0161em lokalnom kontejnerskom skladi\u0161tu. Ako \u017eelimo koristiti ovu sliku u svom K8S okru\u017eenju, trebamo je pohraniti u neki drugi repozitorij. U Kubernetesu nema takvih funkcija, pa \u0107emo koristiti dockerhub. Zato \u0161to, prvo, besplatan je, a drugo, (skoro) svi tako rade.<\/p>\n<p>To je tako\u0111er vrlo jednostavno, a ovdje je potreban samo ra\u010dun na dockerhub.<\/p>\n<p>Dakle, kreiramo dockerhub i \u0161aljemo na\u0161u sliku tamo.<\/p>\n<p><img decoding=\"async\" alt=\"\u017dao mi je, OpenShift, nismo te dovoljno cijenili i uzeli te zdravo za gotovo\" src=\"\/wp-content\/uploads\/2020\/10\/fb5d81ee15ca7594277c5a05da298fbd.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h4>Korak 3 \u2013 pokre\u0107emo Kubernetes<\/h4>\n<p>\nPostoji mnogo na\u010dina za izradu konfiguracije kubernetes za pokretanje na\u0161eg 'Hello World', ali koristit \u0107emo najjednostavniji od njih, takvi smo ljudi\u2026<\/p>\n<p>Za po\u010detak pokre\u0107emo minikube klaster:<\/p>\n<pre><code class=\"plaintext\">minikube start\n<\/code><\/pre>\n<p><\/p>\n<h4>Korak 4 \u2013 implementiramo na\u0161 kontejnerski imid\u017e<\/h4>\n<p>\nSada je potrebno pretvoriti na\u0161 kod i kontejnerski imid\u017e u Kubernetes konfiguracije. Drugim rije\u010dima, potrebna nam je definicija pod-a i deployment-a s referencom na na\u0161 kontejnerski imid\u017e na DockerHubu. Jedan od najlak\u0161ih na\u010dina da to u\u010dinimo je pokretanje komande create deployment, ukazuju\u0107i na na\u0161 imid\u017e:<\/p>\n<p><img decoding=\"async\" alt=\"\u017dao mi je, OpenShift, nismo te dovoljno cijenili i uzeli te zdravo za gotovo\" src=\"\/wp-content\/uploads\/2020\/10\/0bd984a5b414310daca039289dd35cd2.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<pre><code class=\"plaintext\">kubectl create deployment hello-quarkus --image=gcolman\/quarkus-hello-world:1.0.0-SNAPSHOT\n<\/code><\/pre>\n<p>\nOvom komandom smo rekli na\u0161em KUBET-u da stvori konfiguraciju deployment-a koja bi trebala sadr\u017eavati specifikaciju pod-a za na\u0161 kontejnerski imid\u017e. Ova komanda tako\u0111e primenjuje ovu konfiguraciju na na\u0161 minikube klaster i stvara deployment koji \u0107e preuzeti na\u0161 kontejnerski imid\u017e i pokrenuti pod u klasteru.<\/p>\n<h4>Korak 5 \u2013 otvaramo pristup na\u0161oj usluzi<\/h4>\n<p>\nSada kada imamo implementirani kontejnerski imid\u017e, vreme je da razmislimo kako konfigurisati spolja\u0161nji pristup ovom Restful servisu, koji je zapravo programiran u na\u0161em kodu.<\/p>\n<p>Postoji mnogo na\u010dina na koje to mo\u017eemo u\u010diniti. Na primer, mo\u017eemo koristiti komandu expose da automatski kreiramo odgovaraju\u0107e Kubernetes komponente, kao \u0161to su usluge i krajnje ta\u010dke. U biti, to \u0107emo i uraditi, izvr\u0161avaju\u0107i komandu expose za na\u0161 objekat deployment-a:<\/p>\n<pre><code class=\"plaintext\">kubectl expose deployment hello-quarkus --type=NodePort --port=8080\n<\/code><\/pre>\n<p>\nZaustavimo se na trenutak na opciji \"--type\" komande expose.<\/p>\n<p>Kada radimo expose i kreiramo komponente potrebne za pokretanje na\u0161e usluge, me\u0111u ostalim, trebamo omogu\u0107iti spoljnu vezu sa uslugom hello-quarkus koja se nalazi unutar na\u0161e softverski definisane mre\u017ee. I parametar <b>type<\/b> omogu\u0107ava nam da kreiramo i pove\u017eemo stvari kao \u0161to su balansatori optere\u0107enja, kako bismo usmerili saobra\u0107aj u tu mre\u017eu.<\/p>\n<p>Na primer, upisivanjem <b>type=LoadBalancer<\/b>, automatski inicijalizujemo balansator optere\u0107enja u javnom obla\u010dnosti kako bismo pristupili na\u0161em Kubernetes klasteru. To, naravno, zvu\u010di sjajno, ali treba razumeti da \u0107e takva konfiguracija biti \u010dvrsto vezana za odre\u0111eno javno obla\u010dnost i bi\u0107e te\u017ee prenosiva izme\u0111u Kubernetes instanci u razli\u010ditim okru\u017eenjima.<\/p>\n<p>U na\u0161em primeru <b>type=NodePort<\/b>, odnosno, pristup na\u0161em servisu ide putem IP adrese \u010dvora i broja porta. Ova opcija ne zahtijeva kori\u0161tenje javnih oblaka, ali zahtijeva odre\u0111ene dodatne korake. Prvo, potreban nam je vlastiti balansirnik optere\u0107enja, pa \u0107emo u svom klasteru postaviti balansirnik optere\u0107enja NGINX.<\/p>\n<h4>Korak 6 \u2013 postavljamo balansirnik optere\u0107enja<\/h4>\n<p>\nMinikube ima niz platformskih funkcija koje olak\u0161avaju kreiranje potrebnih komponenti za pristup izvana, poput ingress kontrolera. Minikube dolazi s ingress kontrolerom Nginx, a samo ga trebamo uklju\u010diti i konfigurirati.<\/p>\n<pre><code class=\"plaintext\">minikube addons enable ingress\n<\/code><\/pre>\n<p>\nSada \u0107emo samo jednim naredbom stvoriti ingress kontroler Nginx koji \u0107e raditi unutar na\u0161eg minikube klastera:<\/p>\n<pre><code class=\"plaintext\">ingress-nginx-controller-69ccf5d9d8-j5gs9 1\/1 Pokre\u0107e se 1 33m\n<\/code><\/pre>\n<p><\/p>\n<h4>Korak 7 \u2013 Konfiguriramo ingress<\/h4>\n<p>\nSada trebamo konfigurirati ingress kontroler Nginx kako bi procesirao zahtjeve hello-quarkus.<\/p>\n<p><img decoding=\"async\" alt=\"\u017dao mi je, OpenShift, nismo te dovoljno cijenili i uzeli te zdravo za gotovo\" src=\"\/wp-content\/uploads\/2020\/10\/18183cb985436447cf15c501e4c6c3a3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><img decoding=\"async\" alt=\"\u017dao mi je, OpenShift, nismo te dovoljno cijenili i uzeli te zdravo za gotovo\" src=\"\/wp-content\/uploads\/2020\/10\/577f1e6218094b5ee23052d49869e838.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>I, kona\u010dno, trebamo primijeniti ovu konfiguraciju.<\/p>\n<p><img decoding=\"async\" alt=\"\u017dao mi je, OpenShift, nismo te dovoljno cijenili i uzeli te zdravo za gotovo\" src=\"\/wp-content\/uploads\/2020\/10\/c519d7763cd1c685063a6bbab6a813ea.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<pre><code class=\"plaintext\">kubectl apply -f ingress.yml\n<\/code><\/pre>\n<p><img decoding=\"async\" alt=\"\u017dao mi je, OpenShift, nismo te dovoljno cijenili i uzeli te zdravo za gotovo\" src=\"\/wp-content\/uploads\/2020\/10\/68fba4ef3d2762a97dc5be5de9e6b864.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Budu\u0107i da sve to radimo na svom ra\u010dunalu, jednostavno dodajemo IP adresu svog \u010dvora u datoteku \/etc\/hosts kako bismo usmjerili http zahtjeve na na\u0161 minikube na balansirnik optere\u0107enja NGINX.<\/p>\n<pre><code class=\"plaintext\">192.168.99.100 hello-quarkus.info\n<\/code><\/pre>\n<p>\nSve, sada je na\u0161 minikube servis dostupan izvana putem ingress kontrolera Nginx.<\/p>\n<p><img decoding=\"async\" alt=\"\u017dao mi je, OpenShift, nismo te dovoljno cijenili i uzeli te zdravo za gotovo\" src=\"\/wp-content\/uploads\/2020\/10\/a456f34d168d43e9236e4769722b7f5d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Pa, to je bilo lako, zar ne? Ili ne tako lako?<\/h3>\n<p><img decoding=\"async\" alt=\"\u017dao mi je, OpenShift, nismo te dovoljno cijenili i uzeli te zdravo za gotovo\" src=\"\/wp-content\/uploads\/2020\/10\/237015dc06bb9d12eb4cd2944dc6df58.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Pokretanje na OpenShiftu (Code Ready Containers)<\/h3>\n<p>\nA sada pogledajmo kako se sve to radi na Red Hat OpenShift Container Platform (OCP).<\/p>\n<p>Kao u slu\u010daju s minikube, biramo shemu s jednodesnim klasterom OpenShift u obliku Code Ready Containers (CRC). Ranije je to bilo poznato kao minishift i temeljilo se na projektu OpenShift Origin, a sada je to CRC i izgra\u0111eno na Red Hat-ovoj OpenShift Container Platform.<\/p>\n<p>Ovdje se, izvinjavamo se, ne mo\u017eemo suzdr\u017eati a da ne ka\u017eemo: \u201eOpenShift je divan!\u201c<\/p>\n<p>Isprva smo mislili napisati da razvoj na OpenShiftu ne razlikuje se od razvoja na Kubernetesu. U su\u0161tini, to i jest tako. No tijekom pisanja ovog posta sjetili smo se koliko dodatnih koraka treba poduzeti kada nemate OpenShift, i stoga, ponavljamo, divan je. Volimo kada je sve lako, i to koliko je lako u usporedbi s minikube kada se na\u0161 primjer postavlja i pokre\u0107e na OpenShift, zapravo nas je potaknulo na pisanje ovog posta.<\/p>\n<p>Pro\u0111imo kroz postupak i vidimo \u0161to \u0107emo trebati u\u010diniti.<\/p>\n<p>Dakle, u primjeru s minikube po\u010deli smo s Docker-om\u2026 \u010cekaj, vi\u0161e nam ne treba da na ma\u0161ini bude instaliran Docker.<\/p>\n<p><b>Lokalni git nam tako\u0111er nije potreban.<br \/>\nMaven tako\u0111er nije potreban.<br \/>\nNije potrebno ru\u010dno stvarati kontejnersku sliku.<br \/>\nNije potrebno tra\u017eiti neki repozitorij kontejnerskih slika.<br \/>\nNije potrebno instalirati ingress kontroler.<br \/>\nNije potrebno niti konfigurirati ingress.<\/b><\/p>\n<p>Razumijete, zar ne? Da biste pokrenuli i pokrenuli na\u0161u aplikaciju na OpenShift-u, nije potrebno ni\u0161ta od navedenog. A sam proces izgleda ovako.<\/p>\n<h4>Korak 1 \u2013 Pokre\u0107emo svoj OpenShift klaster.<\/h4>\n<p>\nKoristimo Code Ready Containers od Red Hat-a, koji je u su\u0161tini kao Minikube, ali s punim jednomodnim OpenShift klasterom.<\/p>\n<pre><code class=\"plaintext\">crc start\n<\/code><\/pre>\n<p><\/p>\n<h4>Korak 2 \u2013 Izvr\u0161avamo izgradnju i implementaciju aplikacije u OpenShift klasteru.<\/h4>\n<p>\nOvdje se jednostavnost i korisnost OpenShift-a o\u010dituje u punom sjaju. Kao i u svim distribucijama Kubernetes-a, imamo mnogo na\u010dina za pokretanje aplikacije unutar klastera. I, kao u slu\u010daju KUB-a, posebno biramo najjednostavniji na\u010din.<\/p>\n<p>OpenShift je uvijek bio osmi\u0161ljen kao platforma za izradu i pokretanje kontejnerskih aplikacija. Izgradnja kontejnera uvijek je bila neodvojiv dio ove platforme, stoga ovdje postoji puno dodatnih Kubernetes resursa za odgovaraju\u0107e zadatke.<\/p>\n<p>\u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c OpenShift&#8217;\u043e\u0432\u0441\u043a\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 Source 2 Image (S2I), \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u0437\u044f\u0442\u044c \u043d\u0430\u0448 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a (\u043a\u043e\u0434 \u0438\u043b\u0438 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b) \u0438 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0435\u0433\u043e \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043d\u044b\u0439 \u043e\u0431\u0440\u0430\u0437, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c\u044b\u0439 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 OpenShift.<\/p>\n<p>Za to \u0107e nam biti potrebne dvije stvari:<\/p>\n<ul>\n<li>Na\u0161 izvorni kod u git repozitoriju.<\/li>\n<li>Builder slika na temelju koje \u0107e se izgradnja izvr\u0161iti.<\/li>\n<\/ul>\n<p>\nPostoji mnogo takvih slika, podr\u017eanih kao od strane Red Hat-a, tako i na razini zajednice, a mi \u0107emo koristiti sliku OpenJDK, budu\u0107i da gradim Java aplikaciju.<\/p>\n<p>Pokretanje S2I izgradnje mogu\u0107e je, kao iz grafi\u010dkog su\u010delja OpenShift Developer-a, tako i iz naredbenog retka. Mi \u0107emo koristiti naredbu new-app, navode\u0107i joj odakle preuzeti builder sliku i na\u0161 izvorni kod.<\/p>\n<p><img decoding=\"async\" alt=\"\u017dao mi je, OpenShift, nismo te dovoljno cijenili i uzeli te zdravo za gotovo\" src=\"\/wp-content\/uploads\/2020\/10\/64b8091c6857999c94dd907ad12fa9ae.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<pre><code class=\"plaintext\">oc new-app registry.access.redhat.com\/ubi8\/openjdk-11:latest~https:\/\/github.com\/gcolman\/quarkus-hello-world.git\n<\/code><\/pre>\n<p>\nSve, na\u0161a aplikacija je stvorena. Pri tome je S2I proces izvr\u0161io sljede\u0107e stvari:<\/p>\n<ul>\n<li>Stvorio je pomo\u0107ni build-pod za razne stvari vezane za izgradnju aplikacije.<\/li>\n<li>Stvorio je OpenShift Build konfiguraciju.<\/li>\n<li>Preuzeo je builder sliku u unutarnji Docker registar OpenShift-a.<\/li>\n<li>Klonirao je 'Hello World' u lokalni repozitorij.<\/li>\n<li>Primijetio sam da postoji maven pom, pa sam sastavio aplikaciju koriste\u0107i maven.<\/li>\n<li>Stvorio sam novu sliku kontejnera koja sadr\u017ei sastavljenu Java aplikaciju i smjestio tu sliku u interni registar kontejnera.<\/li>\n<li>Stvorio sam Kubernetes Deployment sa specifikacijama pod-a, servisa itd.<\/li>\n<li>Pokrenuo sam deploy slike kontejnera.<\/li>\n<li>Izbrisao sam pomo\u0107ni build-pod.<\/li>\n<\/ul>\n<p>\nNa ovom popisu ima puno toga, ali va\u017eno je da se cijela izrada odvija isklju\u010divo unutar OpenShifta; unutarnji Docker registar nalazi se unutar OpenShifta, a proces izrade stvara sve komponente Kubernetes-a i pokre\u0107e ih u klasteru.<\/p>\n<p>Ako vizualno pratite pokretanje S2I u konzoli, mo\u017eete vidjeti kako se prilikom izrade pokre\u0107e build pod.<\/p>\n<p><img decoding=\"async\" alt=\"\u017dao mi je, OpenShift, nismo te dovoljno cijenili i uzeli te zdravo za gotovo\" src=\"\/wp-content\/uploads\/2020\/10\/bd69c6e27813b1211a11e522f28f45b7.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Sada pogledajmo logove builder pod-a: prvo, tu se vidi kako maven obavlja svoj posao i preuzima ovisnosti za izgradnju na\u0161e java aplikacije.<\/p>\n<p><img decoding=\"async\" alt=\"\u017dao mi je, OpenShift, nismo te dovoljno cijenili i uzeli te zdravo za gotovo\" src=\"\/wp-content\/uploads\/2020\/10\/326192f9f9373e451d601b77052d67d1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Nakon \u0161to je zavr\u0161ena maven izrada, pokre\u0107e se izrada slike kontejnera, a zatim se ta napravljena slika \u0161alje u internu repozitorij.<\/p>\n<p><img decoding=\"async\" alt=\"\u017dao mi je, OpenShift, nismo te dovoljno cijenili i uzeli te zdravo za gotovo\" src=\"\/wp-content\/uploads\/2020\/10\/c97da4c17a8e275d39104126d0f87048.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Sve, proces izrade je zavr\u0161en. Sada se uvjerimo da su se podovi i servisi na\u0161e aplikacije pokrenuli u klasteru.<\/p>\n<pre><code class=\"plaintext\">oc get service\n<\/code><\/pre>\n<p><img decoding=\"async\" alt=\"\u017dao mi je, OpenShift, nismo te dovoljno cijenili i uzeli te zdravo za gotovo\" src=\"\/wp-content\/uploads\/2020\/10\/f16a098a096128073f305e0444061417.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>To je to. I samo jedna naredba. Ostaje nam samo izvesti ovaj servis za pristup izvana.<\/p>\n<h4>Korak 3 \u2013 izvodimo servis za pristup izvana<\/h4>\n<p>\nKao i u slu\u010daju KUB-a, na\u0161emu \"Hello World\" na OpenShiftu tako\u0111er je potreban usmjeriva\u010d za usmjeravanje vanjskog prometa na servis unutar klastera. U OpenShiftu je to vrlo jednostavno. Prvo, komponenta usmjeravanja HAProxy je po defaultu instalirana u klasteru (mo\u017ee se zamijeniti s NGINX-om). Drugo, ovdje postoje specijalni resursi koji podr\u017eavaju opse\u017enu prilagodbu, koji se nazivaju Routes i podsje\u0107aju na Ingress objekte u starom dobrom Kubernetes-u (zaista, OpenShift-ovi Routes su sna\u017eno utjecali na dizajn Ingress objekata, koji se sada mogu koristiti i u OpenShiftu), ali za na\u0161 \"Hello World\", kao i za gotovo sve ostale slu\u010dajeve, posta\u0107e dovoljna standardna Route bez dodatne prilagodbe.<\/p>\n<p>Da stvorimo usmjerivi FQDN za \"Hello World\" (da, u OpenShiftu postoji vlastiti DNS za usmjeravanje po imenima servisa), jednostavno \u0107emo izvesti na\u0161 servis:<\/p>\n<p><img decoding=\"async\" alt=\"\u017dao mi je, OpenShift, nismo te dovoljno cijenili i uzeli te zdravo za gotovo\" src=\"\/wp-content\/uploads\/2020\/10\/d6b76943594aa71195ca9af500db6c10.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<pre><code class=\"plaintext\">oc expose service quarkus-hello-world\n<\/code><\/pre>\n<p>\nAko pogledamo upravo stvoreni Route, mo\u017eemo prona\u0107i FQDN i druge informacije o usmjeravanju:<\/p>\n<pre><code class=\"plaintext\">oc get route\n<\/code><\/pre>\n<p><img decoding=\"async\" alt=\"\u017dao mi je, OpenShift, nismo te dovoljno cijenili i uzeli te zdravo za gotovo\" src=\"\/wp-content\/uploads\/2020\/10\/dc59c36166605ef0a5a24b2b7ffa65b6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>I kona\u010dno, obrati se na\u0161em servisu iz preglednika:<\/p>\n<p><img decoding=\"async\" alt=\"\u017dao mi je, OpenShift, nismo te dovoljno cijenili i uzeli te zdravo za gotovo\" src=\"\/wp-content\/uploads\/2020\/10\/fccf6cae1746fa59df2ff8ffb6973666.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>A sada je to zaista bilo lako!<\/h3>\n<p>\nVolimo Kubernetes i sve \u0161to ova tehnologija omogu\u0107ava, a tako\u0111er cijenimo jednostavnost i lako\u0107u. Kubernetes je razvijen kako bi nevjerojatno pojednostavio upravljanje distribuiranim skalabilnim kontejnerima, ali za pu\u0161tanje aplikacija u rad, njegovoj jednostavnosti danas vi\u0161e nije dovoljno. I tu dolazi OpenShift, koji prati trendove i nudi Kubernetes koji je prvenstveno usmjeren na programere. Ulo\u017eeni su ogromni napori kako bi se platforma OpenShift prilagodila ba\u0161 programerima, uklju\u010duju\u0107i razvoj alata poput S2I, ODI, Developer Portal, OpenShift Operator Framework, integraciju s IDE-ima, Developer Catalogues, integraciju s Helm-om, pra\u0107enje i mnoge druge.<\/p>\n<p>Nadamo se da je ovaj \u010dlanak bio zanimljiv i koristan za vas. Dodatne resurse, materijale i druge korisne stvari za razvoj na platformi OpenShift mo\u017eete prona\u0107i na portalu <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/\">Red Hat Developers<\/a><\/noindex>.<br \/>\n<br \/>Izvor: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/redhatrussia\/blog\/523568\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u042d\u0442\u043e\u0442 \u043f\u043e\u0441\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0443 \u043d\u0430\u0448\u0438\u0445 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432 \u0431\u044b\u043b\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440\u043e\u0432 \u0441 \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c\u0438 \u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 Kubernetes \u0438 \u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0435 \u0442\u0430\u043a\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0430 OpenShift. \u041d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u043c\u044b \u043e\u0431\u044b\u0447\u043d\u043e \u0441 \u0442\u0435\u0437\u0438\u0441\u0430, \u0447\u0442\u043e Kubernetes \u2013 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e Kubernetes, \u0430 OpenShift \u2013 \u044d\u0442\u043e \u0443\u0436\u0435 Kubernetes-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430, \u043a\u0430\u043a Microsoft AKS \u0438\u043b\u0438 Amazon EKS. \u0423 \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0437 \u044d\u0442\u0438\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0438 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":97255,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-97254","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.4 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u042d\u0442\u043e\u0442 \u043f\u043e\u0441\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0443 \u043d\u0430\u0448\u0438\u0445 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432 \u0431\u044b\u043b\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440\u043e\u0432 \u0441 \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c\u0438 \u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 Kubernetes \u0438 \u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0435 \u0442\u0430\u043a\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0430 OpenShift.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/prosti-openshift-my-nedostatochno-czenili-tebya-i-prinimali-kak-dolzhnoe\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"hr_HR\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041f\u0440\u043e\u0441\u0442\u0438, OpenShift, \u043c\u044b \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0446\u0435\u043d\u0438\u043b\u0438 \u0442\u0435\u0431\u044f \u0438 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u043b\u0438 \u043a\u0430\u043a \u0434\u043e\u043b\u0436\u043d\u043e\u0435 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u042d\u0442\u043e\u0442 \u043f\u043e\u0441\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0443 \u043d\u0430\u0448\u0438\u0445 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432 \u0431\u044b\u043b\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440\u043e\u0432 \u0441 \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c\u0438 \u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 Kubernetes \u0438 \u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0435 \u0442\u0430\u043a\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0430 OpenShift.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/prosti-openshift-my-nedostatochno-czenili-tebya-i-prinimali-kak-dolzhnoe\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-10-17T00:42:32+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-10-17T00:42:32+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47\u017dao nam je, OpenShift, nismo te dovoljno cijenili i uzimali smo te zdravo za gotovo | ProHoster","description":"Ova objava je napisana jer su na\u0161i zaposlenici imali puno razgovora s klijentima o razvoju aplikacija na Kubernetesu i specifi\u010dnostima takvog razvoja na OpenShift-u.","canonical_url":"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/prosti-openshift-my-nedostatochno-czenili-tebya-i-prinimali-kak-dolzhnoe","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hr_HR","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041f\u0440\u043e\u0441\u0442\u0438, OpenShift, \u043c\u044b \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0446\u0435\u043d\u0438\u043b\u0438 \u0442\u0435\u0431\u044f \u0438 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u043b\u0438 \u043a\u0430\u043a \u0434\u043e\u043b\u0436\u043d\u043e\u0435 | ProHoster","og:description":"\u042d\u0442\u043e\u0442 \u043f\u043e\u0441\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0443 \u043d\u0430\u0448\u0438\u0445 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432 \u0431\u044b\u043b\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440\u043e\u0432 \u0441 \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c\u0438 \u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 Kubernetes \u0438 \u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0435 \u0442\u0430\u043a\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0430 OpenShift.","og:url":"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/prosti-openshift-my-nedostatochno-czenili-tebya-i-prinimali-kak-dolzhnoe","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-10-17T00:42:32+00:00","article:modified_time":"2020-10-17T00:42:32+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"97254","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 10:24:26","updated":"2022-09-30 14:35:33","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts\/97254","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/comments?post=97254"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts\/97254\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media\/97255"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media?parent=97254"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/categories?post=97254"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/tags?post=97254"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}