{"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\/ro\/blog\/administrirovanie\/prosti-openshift-my-nedostatochno-czenili-tebya-i-prinimali-kak-dolzhnoe","title":{"rendered":"\u00cemi pare r\u0103u, OpenShift, nu te-am apreciat suficient \u0219i te-am considerat ca un dat.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Acest post este scris deoarece angaja\u021bii no\u0219tri au avut o mul\u021bime de discu\u021bii cu clien\u021bii despre dezvoltarea aplica\u021biilor pe Kubernetes \u0219i despre specificul acestei dezvolt\u0103ri pe OpenShift.<\/p>\n<p><img decoding=\"async\" alt=\"\u00cemi pare r\u0103u, OpenShift, nu te-am apreciat suficient \u0219i te-am considerat ca un dat.\" src=\"\/wp-content\/uploads\/2020\/10\/ad447aeb80d3ae56ea4598cd959456de.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDe obicei, \u00eencepem cu teza c\u0103 Kubernetes este pur \u0219i simplu Kubernetes, iar OpenShift este deja o platform\u0103 Kubernetes, la fel ca Microsoft AKS sau Amazon EKS. Fiecare dintre aceste platforme are avantajele sale, orientate c\u0103tre o anumit\u0103 audien\u021b\u0103 \u021bint\u0103. Dup\u0103 aceasta, discu\u021bia trece la compararea punctelor forte \u0219i slabe ale platformelor specifice.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\n\u00cen general, ne-am g\u00e2ndit s\u0103 scriem acest post cu concluzia de genul \u201eAsculta\u021bi, nu conteaz\u0103 unde s\u0103 rulezi codul, fie pe OpenShift, fie pe AKS, fie pe EKS, fie pe un Kubernetes personalizat, pur \u0219i simplu pe orice Kubernetes. <i>(pentru scurt, s\u0103-i spunem KUK).<\/i> Este \u00eentr-adev\u0103r simplu, at\u00e2t acolo, c\u00e2t \u0219i aici.<\/p>\n<p>Apoi, pl\u0103nuiam s\u0103 lu\u0103m un simplu \u201eHello World\u201d \u0219i s\u0103 ar\u0103t\u0103m prin exemplul acestuia ce este comun \u0219i care sunt diferen\u021bele dintre KUK \u0219i Red Hat OpenShift Container Platform (mai departe, OCP sau pur \u0219i simplu OpenShift).<\/p>\n<p>Cu toate acestea, pe parcursul scrierii acestui post, ne-am dat seama c\u0103 ne-am obi\u0219nuit at\u00e2t de mult s\u0103 folosim OpenShift, \u00eenc\u00e2t pur \u0219i simplu nu realiz\u0103m cum a evoluat \u0219i s-a transformat \u00eentr-o platform\u0103 uimitoare, care a devenit mult mai mult dec\u00e2t un simplu distribu\u021bie Kubernetes. Ne-am obi\u0219nuit s\u0103 consider\u0103m maturitatea \u0219i simplitatea OpenShift ca pe ceva normal, neglij\u00e2nd splendoarea sa.<\/p>\n<p>\u00cen general, a venit vremea c\u0103in\u021bei active, \u0219i acum vom compara pas cu pas debutul \u201eHello World\u201d pe KUK \u0219i pe OpenShift, \u0219i vom face acest lucru c\u00e2t mai obiectiv posibil (dar, poate, vom exprima uneori o p\u0103rere personal\u0103 asupra subiectului). Dac\u0103 e\u0219ti interesat de o opinie pur subiectiv\u0103 pe aceast\u0103 tem\u0103, o po\u021bi citi <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/swlh\/im-so-sorry-openshift-i-ve-taken-you-for-granted-f36fb47ea4d9\">aici (EN).<\/a><\/noindex>\u00cen acest post, \u00eens\u0103, ne vom men\u021bine la fapte \u0219i doar fapte.<\/p>\n<h3>Clustere.<\/h3>\n<p>\nA\u0219adar, pentru \u201eHello World\u201d avem nevoie de clustere. S\u0103 spunem \u201enu\u201d tuturor cloudurilor publice pentru a nu pl\u0103ti pentru servere, registre, re\u021bele, transfer de date etc. Prin urmare, alegem un cluster simplu pe un singur nod pe <noindex><a rel=\"nofollow\" href=\"https:\/\/minikube.sigs.k8s.io\/docs\/start\/\">Minikube<\/a><\/noindex> (pentru KUK) \u0219i <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/products\/codeready-containers\/overview\">Code Ready Containers<\/a><\/noindex> (pentru clusterul OpenShift). Ambele op\u021biuni sunt realmente simple de instalat, dar vor necesita destul de multe resurse pe laptopul t\u0103u.<\/p>\n<p><img decoding=\"async\" alt=\"\u00cemi pare r\u0103u, OpenShift, nu te-am apreciat suficient \u0219i te-am considerat ca un dat.\" src=\"\/wp-content\/uploads\/2020\/10\/01c748365253fc9e11e817876629ae7e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Construirea pe KUK.<\/h3>\n<p>\nA\u0219adar, s\u0103 \u00eencepem.<\/p>\n<h4>Pasul 1 \u2013 construim imaginea noastr\u0103 de container.<\/h4>\n<p>\nVoi \u00eencepe prin a desf\u0103\u0219ura \u201eHello World\u201d pe minikube. Pentru aceasta, avem nevoie de:<\/p>\n<ol>\n<li>1. Docker instalat.<\/li>\n<li>2. Git instalat.<\/li>\n<li>3. Maven instalat (de fapt, \u00een acest proiect se folose\u0219te binarul mvnw, a\u0219a c\u0103 se poate s\u0103 s\u0103rim aceast\u0103 etap\u0103).<\/li>\n<li>4. De fapt, sursa, adic\u0103 clonarea repo-ului <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>\nPrimul lucru pe care trebuie s\u0103-l facem este s\u0103 cre\u0103m un proiect Quarkus. Nu v\u0103 speria\u021bi dac\u0103 nu a\u021bi lucrat niciodat\u0103 cu site-ul Quarkus.io \u2013 este simplu. Trebuie doar s\u0103 selecta\u021bi componentele pe care dori\u021bi s\u0103 le folosi\u021bi \u00een proiect (RestEasy, Hibernate, Amazon SQS, Camel etc.), iar apoi Quarkus configureaz\u0103 singur arhetipul maven \u0219i public\u0103 totul pe github. Asta \u00eenseamn\u0103, practic, un singur click \u0219i gata. De asta iubim Quarkus.<\/p>\n<p><img decoding=\"async\" alt=\"\u00cemi pare r\u0103u, OpenShift, nu te-am apreciat suficient \u0219i te-am considerat ca un dat.\" src=\"\/wp-content\/uploads\/2020\/10\/39a62058d91f8443e77466d374d02d34.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Cea mai simpl\u0103 metod\u0103 de a construi \u201eHello World\u201d \u00een imaginea de container este s\u0103 folose\u0219ti extensiile quarkus-maven pentru Docker, care vor face \u00eentreaga munc\u0103 necesar\u0103. Odat\u0103 cu apari\u021bia Quarkus, acest lucru a devenit cu adev\u0103rat simplu: ad\u0103uga\u021bi extensia container-image-docker \u0219i pute\u021bi crea imagini cu comenzile maven.<\/p>\n<pre><code class=\"plaintext\">.\/mvnw quarkus:add-extension -Dextensions=\"container-image-docker\"\n<\/code><\/pre>\n<p>\n\u0218i, \u00een final, execut\u0103m construc\u021bia imaginii noastre folosind Maven. Ca rezultat, codul nostru surs\u0103 se transform\u0103 \u00eentr-o imagine de container care poate fi deja rulat\u0103 \u00een mediul de execu\u021bie al containerelor.<\/p>\n<p><img decoding=\"async\" alt=\"\u00cemi pare r\u0103u, OpenShift, nu te-am apreciat suficient \u0219i te-am considerat ca un dat.\" 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>\nIat\u0103, \u0219i asta este tot, acum putem rula containerul cu comanda docker run, map\u00e2nd serviciul nostru pe portul 8080, astfel \u00eenc\u00e2t s\u0103 poat\u0103 fi accesat.<\/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=\"\u00cemi pare r\u0103u, OpenShift, nu te-am apreciat suficient \u0219i te-am considerat ca un dat.\" src=\"\/wp-content\/uploads\/2020\/10\/4f46e13423d5027d85ebae2c98c926b8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Dup\u0103 ce instan\u021ba containerului s-a pornit, r\u0103m\u00e2ne doar s\u0103 verific\u0103m cu comanda curl c\u0103 serviciul nostru func\u021bioneaz\u0103:<\/p>\n<p><img decoding=\"async\" alt=\"\u00cemi pare r\u0103u, OpenShift, nu te-am apreciat suficient \u0219i te-am considerat ca un dat.\" src=\"\/wp-content\/uploads\/2020\/10\/1c1462f52d6a487863c21f8f72a09d1f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>A\u0219adar, totul func\u021bioneaz\u0103, \u0219i a fost cu adev\u0103rat simplu.<\/p>\n<h4>Pasul 2 \u2013 trimitem containerul nostru \u00een repository-ul de imagini de containere<\/h4>\n<p>\nDeocamdat\u0103, imaginea pe care am creat-o este stocat\u0103 local, \u00een depozitul nostru local de containere. Dac\u0103 dorim s\u0103 folosim aceast\u0103 imagine \u00een mediul nostru K8S, trebuie s\u0103 o plas\u0103m \u00eentr-un alt repository. \u00cen Kubernetes nu exist\u0103 astfel de func\u021bii, a\u0219a c\u0103 vom folosi dockerhub. Deoarece, pe de o parte, este gratuit, iar pe de alt\u0103 parte, (aproape) toat\u0103 lumea face asta.<\/p>\n<p>Este, de asemenea, foarte simplu, \u0219i avem nevoie doar de un cont pe dockerhub.<\/p>\n<p>A\u0219adar, ne conect\u0103m la dockerhub \u0219i trimitem imaginea noastr\u0103 acolo.<\/p>\n<p><img decoding=\"async\" alt=\"\u00cemi pare r\u0103u, OpenShift, nu te-am apreciat suficient \u0219i te-am considerat ca un dat.\" src=\"\/wp-content\/uploads\/2020\/10\/fb5d81ee15ca7594277c5a05da298fbd.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h4>Pasul 3 \u2013 pornim Kubernetes<\/h4>\n<p>\nExist\u0103 multe modalit\u0103\u021bi de a construi configura\u021bia Kubernetes pentru a rula \u201eHello World\u201d, dar vom folosi cea mai simpl\u0103 dintre ele, suntem a\u0219a\u2026<\/p>\n<p>Pentru \u00eenceput, pornim clusterul minikube:<\/p>\n<pre><code class=\"plaintext\">minikube start\n<\/code><\/pre>\n<p><\/p>\n<h4>Pasul 4 \u2013 desf\u0103\u0219ur\u0103m imaginea noastr\u0103 de container<\/h4>\n<p>\nAcum trebuie s\u0103 transform\u0103m codul nostru \u0219i imaginea containerului \u00een configura\u021biile Kubernetes. Cu alte cuvinte, avem nevoie de o defini\u021bie pod \u0219i deployment care s\u0103 fac\u0103 referire la imaginea noastr\u0103 pe Docker Hub. Una dintre cele mai simple modalit\u0103\u021bi de a face asta este s\u0103 rul\u0103m comanda create deployment, specific\u00e2nd imaginea noastr\u0103:<\/p>\n<p><img decoding=\"async\" alt=\"\u00cemi pare r\u0103u, OpenShift, nu te-am apreciat suficient \u0219i te-am considerat ca un dat.\" 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>\nPrin aceast\u0103 comand\u0103 am spus Kubernetes-ului nostru s\u0103 creeze configura\u021bia deployment, care trebuie s\u0103 con\u021bin\u0103 specifica\u021bia pod-ului pentru imaginea noastr\u0103 de container. Aceast\u0103 comand\u0103 va aplica, de asemenea, aceast\u0103 configura\u021bie \u00een clusterul nostru Minikube \u0219i va crea un deployment care va desc\u0103rca imaginea noastr\u0103 de container \u0219i va porni pod-ul \u00een cluster.<\/p>\n<h4>Pasul 5 \u2013 deschidem accesul la serviciul nostru<\/h4>\n<p>\nAcum, c\u00e2nd avem imaginea de container desf\u0103\u0219urat\u0103, este momentul s\u0103 ne g\u00e2ndim cum putem configura accesul extern la acest serviciu RESTful, care este, de fapt, programat \u00een codul nostru.<\/p>\n<p>Exist\u0103 multe modalit\u0103\u021bi. De exemplu, putem folosi comanda expose pentru a crea automat componentele Kubernetes corespunz\u0103toare, cum ar fi servicii \u0219i endpoint-uri. A\u0219a c\u0103 asta vom face, execut\u00e2nd comanda expose pentru obiectul nostru de deployment:<\/p>\n<pre><code class=\"plaintext\">kubectl expose deployment hello-quarkus --type=NodePort --port=8080\n<\/code><\/pre>\n<p>\nS\u0103 ne oprim pentru o clip\u0103 asupra op\u021biunii \u201e--type\u201d din comanda expose.<\/p>\n<p>C\u00e2nd facem expose \u0219i cre\u0103m componentele necesare pentru a rula serviciul nostru, trebuie, printre altele, s\u0103 ne asigur\u0103m c\u0103 putem accesa din exterior serviciul hello-quarkus, care se afl\u0103 \u00een interiorul re\u021belei noastre definite prin software. \u0218i parametru <b>type<\/b> ne permite s\u0103 cre\u0103m \u0219i s\u0103 conect\u0103m lucruri precum balansoarele de \u00eenc\u0103rcare, pentru a direc\u021biona traficul \u00een aceast\u0103 re\u021bea.<\/p>\n<p>De exemplu, specific\u00e2nd <b>type=LoadBalancer<\/b>, vom ini\u021bializa automat un balansoar de \u00eenc\u0103rcare \u00een cloud public, pentru a ne conecta la clusterul nostru Kubernetes. Desigur, asta este minunat, dar trebuie s\u0103 \u00een\u021belegem c\u0103 o astfel de configura\u021bie va fi str\u00e2ns legat\u0103 de un anumit cloud public \u0219i va fi mai greu de mutat \u00eentre instan\u021bele Kubernetes \u00een medii diferite.<\/p>\n<p>\u00cen exemplul nostru <b>type=NodePort<\/b>, adic\u0103 apelul c\u0103tre serviciul nostru se face prin adresa IP a nodului \u0219i num\u0103rul portului. Aceast\u0103 op\u021biune permite s\u0103 nu folosim nicio solu\u021bie cloud public\u0103, dar necesit\u0103 o serie de pa\u0219i suplimentari. \u00cen primul r\u00e2nd, avem nevoie de un balansator de \u00eenc\u0103rcare propriu, a\u0219a c\u0103 vom implementa \u00een clusterul nostru un balansator de \u00eenc\u0103rcare NGINX.<\/p>\n<h4>Pasul 6 \u2013 instal\u0103m balansatorul de \u00eenc\u0103rcare<\/h4>\n<p>\nMinikube are o serie de func\u021bii de platform\u0103 care faciliteaz\u0103 crearea componentelor necesare pentru accesul extern, cum ar fi controlerele ingress. Minikube vine cu un controler ingress Nginx, iar noi trebuie doar s\u0103-l activ\u0103m \u0219i s\u0103-l configur\u0103m.<\/p>\n<pre><code class=\"plaintext\">minikube addons enable ingress\n<\/code><\/pre>\n<p>\nAcum, cu o singur\u0103 comand\u0103, voi crea un controler ingress Nginx care va func\u021biona \u00een interiorul clusterului nostru minikube:<\/p>\n<pre><code class=\"plaintext\">ingress-nginx-controller-69ccf5d9d8-j5gs9 1\/1 Running 1 33m\n<\/code><\/pre>\n<p><\/p>\n<h4>Pasul 7 \u2013 configur\u0103m ingress<\/h4>\n<p>\nAcum trebuie s\u0103 configur\u0103m controlerul ingress Nginx pentru a interpreta cererile hello-quarkus.<\/p>\n<p><img decoding=\"async\" alt=\"\u00cemi pare r\u0103u, OpenShift, nu te-am apreciat suficient \u0219i te-am considerat ca un dat.\" src=\"\/wp-content\/uploads\/2020\/10\/18183cb985436447cf15c501e4c6c3a3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><img decoding=\"async\" alt=\"\u00cemi pare r\u0103u, OpenShift, nu te-am apreciat suficient \u0219i te-am considerat ca un dat.\" src=\"\/wp-content\/uploads\/2020\/10\/577f1e6218094b5ee23052d49869e838.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\u0218i, \u00een final, trebuie s\u0103 aplic\u0103m aceast\u0103 configura\u021bie.<\/p>\n<p><img decoding=\"async\" alt=\"\u00cemi pare r\u0103u, OpenShift, nu te-am apreciat suficient \u0219i te-am considerat ca un dat.\" 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=\"\u00cemi pare r\u0103u, OpenShift, nu te-am apreciat suficient \u0219i te-am considerat ca un dat.\" src=\"\/wp-content\/uploads\/2020\/10\/68fba4ef3d2762a97dc5be5de9e6b864.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Deoarece facem toate acestea pe computerul nostru, ad\u0103ug\u0103m pur \u0219i simplu adresa IP a nodului nostru \u00een fi\u0219ierul \/etc\/hosts pentru a direc\u021biona cererile http c\u0103tre minikube pe balansatorul de \u00eenc\u0103rcare NGINX.<\/p>\n<pre><code class=\"plaintext\">192.168.99.100 hello-quarkus.info\n<\/code><\/pre>\n<p>\nTotul, acum serviciul nostru minikube este disponibil extern prin controlerul ingress Nginx.<\/p>\n<p><img decoding=\"async\" alt=\"\u00cemi pare r\u0103u, OpenShift, nu te-am apreciat suficient \u0219i te-am considerat ca un dat.\" src=\"\/wp-content\/uploads\/2020\/10\/a456f34d168d43e9236e4769722b7f5d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Ei bine, a fost u\u0219or, nu-i a\u0219a? Sau nu prea?<\/h3>\n<p><img decoding=\"async\" alt=\"\u00cemi pare r\u0103u, OpenShift, nu te-am apreciat suficient \u0219i te-am considerat ca un dat.\" src=\"\/wp-content\/uploads\/2020\/10\/237015dc06bb9d12eb4cd2944dc6df58.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Lansare pe OpenShift (Code Ready Containers)<\/h3>\n<p>\nAcum s\u0103 vedem cum se face totul pe Red Hat OpenShift Container Platform (OCP).<\/p>\n<p>La fel ca \u00een cazul minikube, alegem schema cu un cluster OpenShift pe un singur nod sub forma Code Ready Containers (CRC). \u00cen trecut, aceasta se numea minishift \u0219i se baza pe proiectul OpenShift Origin, iar acum este CRC \u0219i construit\u0103 pe platforma OpenShift Container de la Red Hat.<\/p>\n<p>Aici, ne cerem scuze \u0219i nu ne putem ab\u021bine s\u0103 nu spunem: \u201eOpenShift este minunat!\u201d<\/p>\n<p>Ini\u021bial, am g\u00e2ndit s\u0103 scriem c\u0103 dezvoltarea pe OpenShift nu difer\u0103 de dezvoltarea pe Kubernetes. \u0218i, \u00een esen\u021b\u0103, a\u0219a este. Dar \u00een timpul scrierii acestui post ne-am amintit c\u00e2te mi\u0219c\u0103ri suplimentare sunt necesare atunci c\u00e2nd nu ai OpenShift, de aceea repet\u0103m, este minunat. Ne place c\u00e2nd totul este simplu de realizat, iar modul \u00een care se desf\u0103\u0219oar\u0103 at\u00e2t de u\u0219or comparativ cu minikube exemplul nostru pe OpenShift, ne-a motivat s\u0103 scriem acest post.<\/p>\n<p>S\u0103 trecem prin proces \u0219i s\u0103 vedem ce va trebui s\u0103 facem.<\/p>\n<p>A\u0219adar, \u00een exemplul cu minikube, am \u00eenceput cu Docker... Opri\u021bi, nu mai avem nevoie ca Docker s\u0103 fie instalat pe ma\u0219in\u0103.<\/p>\n<p><b>\u0218i git local nu este necesar.<br \/>\n\u0218i Maven nu este necesar.<br \/>\n\u0218i nu trebuie s\u0103 cre\u0103m manual imaginea containerului.<br \/>\n\u0218i nu trebuie s\u0103 c\u0103ut\u0103m un repository pentru imaginile containerelor.<br \/>\n\u0218i nu trebuie s\u0103 instal\u0103m un ingress controller.<br \/>\n\u0218i nici s\u0103 configur\u0103m ingress nu este necesar.<\/b><\/p>\n<p>A\u021bi \u00een\u021beles, da? Pentru a desf\u0103\u0219ura \u0219i a rula aplica\u021bia noastr\u0103 pe OpenShift, nu este nevoie de nimic din cele enumerate mai sus. Iar procesul arat\u0103 astfel.<\/p>\n<h4>Pasul 1 \u2013 Pornim clusterul nostru OpenShift<\/h4>\n<p>\nFolosim Code Ready Containers de la Red Hat, care este practic acela\u0219i lucru cu Minikube, dar cu un cluster OpenShift cu un singur nod complet func\u021bional.<\/p>\n<pre><code class=\"plaintext\">crc start\n<\/code><\/pre>\n<p><\/p>\n<h4>Pasul 2 \u2013 Construim \u0219i desf\u0103\u0219ur\u0103m aplica\u021bia \u00een clusterul OpenShift<\/h4>\n<p>\n\u00cen acest pas se manifest\u0103 pe deplin simplificarea \u0219i comoditatea OpenShift. Ca \u00een toate distribu\u021biile Kubernetes, avem multe moduri de a lansa aplica\u021bia \u00een cluster. \u0218i, ca \u0219i \u00een cazul Kubernetes, alegem \u00een mod special cea mai simpl\u0103 op\u021biune.<\/p>\n<p>OpenShift a fost \u00eentotdeauna construit ca o platform\u0103 pentru crearea \u0219i desf\u0103\u0219urarea aplica\u021biilor containerizate. Construirea containerelor a fost \u00eentotdeauna o parte esen\u021bial\u0103 a acestei platforme, a\u0219a c\u0103 exist\u0103 o mul\u021bime de resurse Kubernetes suplimentare pentru sarcinile corespunz\u0103toare.<\/p>\n<p>Vom folosi procesul Source 2 Image (S2I) al OpenShift, care are mai multe metode diferite pentru a lua sursa noastr\u0103 (cod sau fi\u0219iere binare) \u0219i a o transforma \u00eentr-o imagine de container care ruleaz\u0103 \u00een clusterul OpenShift.<\/p>\n<p>Pentru aceasta avem nevoie de dou\u0103 lucruri:<\/p>\n<ul>\n<li>Codul nostru surs\u0103 \u00een repository git<\/li>\n<li>Imaginea builder, pe baza c\u0103reia va fi efectuat\u0103 construc\u021bia.<\/li>\n<\/ul>\n<p>\nExist\u0103 o mul\u021bime de astfel de imagini, sus\u021binute at\u00e2t de Red Hat, c\u00e2t \u0219i de comunitate, iar noi ne vom folosi de imaginea OpenJDK, deoarece construiesc o aplica\u021bie Java.<\/p>\n<p>Putem lansa construc\u021bia S2I at\u00e2t din consola grafic\u0103 a OpenShift Developer, c\u00e2t \u0219i din linia de comand\u0103. Vom folosi comanda new-app, specific\u00e2nd de unde s\u0103 lu\u0103m imaginea builder \u0219i codul nostru surs\u0103.<\/p>\n<p><img decoding=\"async\" alt=\"\u00cemi pare r\u0103u, OpenShift, nu te-am apreciat suficient \u0219i te-am considerat ca un dat.\" 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>\nTotul, aplica\u021bia noastr\u0103 a fost creat\u0103. \u00cen acest proces, S2I a efectuat urm\u0103toarele ac\u021biuni:<\/p>\n<ul>\n<li>A creat un build-pod de serviciu pentru toate lucrurile legate de construc\u021bia aplica\u021biei.<\/li>\n<li>A creat configura\u021bia OpenShift Build.<\/li>\n<li>A desc\u0103rcat imaginea builder \u00een registrul docker intern OpenShift.<\/li>\n<li>A clonat \u00abHello World\u00bb \u00een repository-ul local.<\/li>\n<li>Am observat c\u0103 exist\u0103 un pom.xml \u00een Maven, a\u0219a c\u0103 am compilat aplica\u021bia folosind Maven.<\/li>\n<li>Am creat o nou\u0103 imagine de container care con\u021bine aplica\u021bia Java compilat\u0103 \u0219i am pus aceast\u0103 imagine \u00een registrul intern de containere.<\/li>\n<li>Am creat un Deployment Kubernetes cu specifica\u021biile pod-ului, serviciului etc.<\/li>\n<li>Am lansat desf\u0103\u0219urarea imaginii de container.<\/li>\n<li>Am \u0219ters pod-ul de build temporar.<\/li>\n<\/ul>\n<p>\nExist\u0103 multe lucruri \u00een aceast\u0103 list\u0103, dar principala idee este c\u0103 \u00eentreaga compilare se desf\u0103\u0219oar\u0103 exclusiv \u00een OpenShift, registrul Docker intern se afl\u0103 \u00een OpenShift, iar procesul de compilare creeaz\u0103 toate componentele Kubernetes \u0219i le ruleaz\u0103 \u00een cluster.<\/p>\n<p>Dac\u0103 urm\u0103rim vizual lansarea S2I \u00een consol\u0103, putem vedea cum, \u00een timpul compil\u0103rii, se lanseaz\u0103 pod-ul de build.<\/p>\n<p><img decoding=\"async\" alt=\"\u00cemi pare r\u0103u, OpenShift, nu te-am apreciat suficient \u0219i te-am considerat ca un dat.\" src=\"\/wp-content\/uploads\/2020\/10\/bd69c6e27813b1211a11e522f28f45b7.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\u0218i acum s\u0103 arunc\u0103m o privire asupra jurnalelor pod-ului builder: \u00een primul r\u00e2nd, se poate observa cum Maven \u00ee\u0219i face treaba \u0219i descarc\u0103 dependen\u021bele pentru compilarea aplica\u021biei noastre Java.<\/p>\n<p><img decoding=\"async\" alt=\"\u00cemi pare r\u0103u, OpenShift, nu te-am apreciat suficient \u0219i te-am considerat ca un dat.\" src=\"\/wp-content\/uploads\/2020\/10\/326192f9f9373e451d601b77052d67d1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Dup\u0103 ce compilarea cu Maven s-a \u00eencheiat, \u00eencepe construirea imaginii de container, iar apoi aceast\u0103 imagine compilat\u0103 este trimis\u0103 \u00een depozitul intern.<\/p>\n<p><img decoding=\"async\" alt=\"\u00cemi pare r\u0103u, OpenShift, nu te-am apreciat suficient \u0219i te-am considerat ca un dat.\" src=\"\/wp-content\/uploads\/2020\/10\/c97da4c17a8e275d39104126d0f87048.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Totul, procesul de compilare s-a \u00eencheiat. Acum s\u0103 ne asigur\u0103m c\u0103 pod-urile \u0219i serviciile aplica\u021biei noastre au fost lansate \u00een cluster.<\/p>\n<pre><code class=\"plaintext\">oc get service\n<\/code><\/pre>\n<p><img decoding=\"async\" alt=\"\u00cemi pare r\u0103u, OpenShift, nu te-am apreciat suficient \u0219i te-am considerat ca un dat.\" src=\"\/wp-content\/uploads\/2020\/10\/f16a098a096128073f305e0444061417.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Asta e tot. \u0218i doar o singur\u0103 comand\u0103. R\u0103m\u00e2ne doar s\u0103 facem expose al acestui serviciu pentru acces extern.<\/p>\n<h4>Pasul 3 \u2013 facem expose al serviciului pentru acces extern<\/h4>\n<p>\nLa fel ca \u00een cazul CUK, pe platforma OpenShift aplica\u021biei noastre \u00abHello World\u00bb \u00eei trebuie un router pentru a direc\u021biona traficul extern c\u0103tre serviciul din cluster. \u00cen OpenShift, acest lucru este foarte simplu. \u00cen primul r\u00e2nd, \u00een cluster este instalat \u00een mod implicit componenta de rutare HAProxy (o putem schimba cu NGINX). \u00cen al doilea r\u00e2nd, exist\u0103 resurse speciale care permit o configurare extins\u0103, numite Routes, care seam\u0103n\u0103 cu obiectele Ingress din vechiul Kubernetes (de fapt, Routes din OpenShift au influen\u021bat semnificativ designul obiectelor Ingress, care acum pot fi utilizate \u0219i \u00een OpenShift), dar pentru \u00abHello World\u00bb \u0219i \u00een aproape toate celelalte cazuri, ne va ajunge Route standard f\u0103r\u0103 configurare suplimentar\u0103.<\/p>\n<p>Pentru a crea un FQDN rutabil pentru \u00abHello World\u00bb (da, \u00een OpenShift exist\u0103 un DNS propriu pentru rutare dup\u0103 numele serviciilor), trebuie doar s\u0103 efectu\u0103m un expose pentru serviciul nostru:<\/p>\n<p><img decoding=\"async\" alt=\"\u00cemi pare r\u0103u, OpenShift, nu te-am apreciat suficient \u0219i te-am considerat ca un dat.\" 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>\nDac\u0103 verific\u0103m Route-ul tocmai creat, putem g\u0103si FQDN-ul \u0219i alte informa\u021bii de rutare:<\/p>\n<pre><code class=\"plaintext\">oc get route\n<\/code><\/pre>\n<p><img decoding=\"async\" alt=\"\u00cemi pare r\u0103u, OpenShift, nu te-am apreciat suficient \u0219i te-am considerat ca un dat.\" src=\"\/wp-content\/uploads\/2020\/10\/dc59c36166605ef0a5a24b2b7ffa65b6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\u0218i \u00een final, ne adres\u0103m serviciului nostru din browser:<\/p>\n<p><img decoding=\"async\" alt=\"\u00cemi pare r\u0103u, OpenShift, nu te-am apreciat suficient \u0219i te-am considerat ca un dat.\" src=\"\/wp-content\/uploads\/2020\/10\/fccf6cae1746fa59df2ff8ffb6973666.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>\u0218i acum, asta a fost \u00eentr-adev\u0103r u\u0219or!<\/h3>\n<p>\nNe place Kubernetes \u0219i tot ce poate face aceast\u0103 tehnologie, precum \u0219i ne place simplitatea \u0219i u\u0219urin\u021ba. Kubernetes a fost creat pentru a simplifica extraordinar exploatarea containerelor distribuite \u0219i scalabile, dar pentru a pune \u00een func\u021biune aplica\u021biile, simplitatea acestuia nu mai este suficient\u0103 ast\u0103zi. \u0218i aici intervine OpenShift, care \u021bine pasul cu vremea \u0219i ofer\u0103 Kubernetes, axat \u00een primul r\u00e2nd pe dezvoltatori. Au fost investite multe eforturi pentru a adapta platforma OpenShift pentru dezvoltatori, inclusiv crearea de instrumente precum S2I, ODI, Developer Portal, OpenShift Operator Framework, integrare cu IDE-uri, cataloage pentru dezvoltatori, integrare cu Helm, monitorizare \u0219i multe altele.<\/p>\n<p>Sper\u0103m c\u0103 acest articol a fost interesant \u0219i util pentru voi. Pute\u021bi g\u0103si resurse suplimentare, materiale \u0219i alte lucruri utile pentru dezvoltarea pe platforma OpenShift pe portalul <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/\">Red Hat Developers<\/a><\/noindex>.<br \/>\n<br \/>Sursa: <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.2 - 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\/ro\/blog\/administrirovanie\/prosti-openshift-my-nedostatochno-czenili-tebya-i-prinimali-kak-dolzhnoe\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\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\/ro\/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\udd47Ne pare r\u0103u, OpenShift, nu te-am apreciat suficient \u0219i te-am tratat de parc\u0103 ar fi fost de la sine \u00een\u021beles | ProHoster","description":"Acest post este scris deoarece angaja\u021bii no\u0219tri au avut o mul\u021bime de discu\u021bii cu clien\u021bii despre dezvoltarea aplica\u021biilor pe Kubernetes \u0219i despre specificul acestei dezvolt\u0103ri pe OpenShift.","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/prosti-openshift-my-nedostatochno-czenili-tebya-i-prinimali-kak-dolzhnoe","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","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\/ro\/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\/ro\/wp-json\/wp\/v2\/posts\/97254","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=97254"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/97254\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/97255"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=97254"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=97254"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=97254"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}