{"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\/pl\/blog\/administrirovanie\/prosti-openshift-my-nedostatochno-czenili-tebya-i-prinimali-kak-dolzhnoe","title":{"rendered":"Przykro mi, OpenShift, za ma\u0142o ci\u0119 doceniali\u015bmy i traktowali\u015bmy jako rzecz oczywist\u0105","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ten post zosta\u0142 napisany, poniewa\u017c nasi pracownicy mieli wiele rozm\u00f3w z klientami na temat tworzenia aplikacji w Kubernetes oraz specyfiki takiego rozwoju na OpenShift.<\/p>\n<p><img decoding=\"async\" alt=\"Przykro mi, OpenShift, za ma\u0142o ci\u0119 doceniali\u015bmy i traktowali\u015bmy jako rzecz oczywist\u0105\" src=\"\/wp-content\/uploads\/2020\/10\/ad447aeb80d3ae56ea4598cd959456de.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nZwykle zaczynamy od tezy, \u017ce Kubernetes to po prostu Kubernetes, a OpenShift to ju\u017c platforma Kubernetes, jak Microsoft AKS czy Amazon EKS. Ka\u017cda z tych platform ma swoje zalety, ukierunkowane na r\u00f3\u017cne grupy docelowe. A p\u00f3\u017aniej rozmowa p\u0142ynnie przechodzi w por\u00f3wnanie mocnych i s\u0142abych stron konkretnych platform.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nOg\u00f3lnie rzecz bior\u0105c, my\u015bleli\u015bmy o napisaniu tego posta z wnioskiem w stylu: \u201eS\u0142uchajcie, gdzie uruchamia\u0107 kod, na OpenShift czy na AKS, EKS, jakim\u015b dostosowanym Kubernetes, czy na jakimkolwiek Kubernetes, to naprawd\u0119 nie ma znaczenia\u201d. <i>(dla skr\u00f3tu nazwijmy to KUK)<\/i> \u2013 to naprawd\u0119 proste zar\u00f3wno tam, jak i tam.<\/p>\n<p>Nast\u0119pnie planowali\u015bmy wzi\u0105\u0107 najprostsz\u0105 aplikacj\u0119 \u201eHello World\u201d i na jej przyk\u0142adzie pokaza\u0107, co jest wsp\u00f3lnego i jakie s\u0105 r\u00f3\u017cnice mi\u0119dzy KUK a Red Hat OpenShift Container Platform (dalej, OCP lub po prostu OpenShift).<\/p>\n<p>Jednak w trakcie pisania tego posta zrozumieli\u015bmy, \u017ce tak bardzo przywykli\u015bmy do korzystania z OpenShift, \u017ce po prostu nie dostrzegamy, jak bardzo si\u0119 rozwin\u0105\u0142 i sta\u0142 niesamowit\u0105 platform\u0105, kt\u00f3ra sta\u0142a si\u0119 czym\u015b wi\u0119cej ni\u017c tylko dystrybucj\u0105 Kubernetes. Przyzwyczaili\u015bmy si\u0119 traktowa\u0107 dojrza\u0142o\u015b\u0107 i prostot\u0119 OpenShift jako co\u015b naturalnego, pomijaj\u0105c jego wspania\u0142o\u015b\u0107.<\/p>\n<p>Czas na aktywne zado\u015b\u0107uczynienie, a teraz krok po kroku por\u00f3wnamy wprowadzenie do dzia\u0142ania naszego \u201eHello World\u201d na KUK i na OpenShift, i zrobimy to jak najbardziej obiektywnie (cho\u0107 czasami wyra\u017caj\u0105c osobiste zainteresowanie tematem). Je\u015bli interesuje Ci\u0119 wy\u0142\u0105cznie subiektywna opinia na ten temat, to mo\u017cna j\u0105 przeczyta\u0107. <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/swlh\/im-so-sorry-openshift-i-ve-taken-you-for-granted-f36fb47ea4d9\">tutaj (EN)<\/a><\/noindex>. A w tym po\u015bcie b\u0119dziemy trzyma\u0107 si\u0119 fakt\u00f3w i tylko fakt\u00f3w.<\/p>\n<h3>Klastery<\/h3>\n<p>\nWi\u0119c do naszego \u201eHello World\u201d potrzebne s\u0105 klastry. Od razu m\u00f3wimy \u201enie\u201d wszelkim publicznym chmurom, aby nie p\u0142aci\u0107 za serwery, rejestry, sieci, transfer danych itp. W zwi\u0105zku z tym wybieramy proste, jednouwzgl\u0119dnione klastry na <noindex><a rel=\"nofollow\" href=\"https:\/\/minikube.sigs.k8s.io\/docs\/start\/\">Minikube<\/a><\/noindex> (dla KUK) oraz <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/products\/codeready-containers\/overview\">Code Ready Containers<\/a><\/noindex> (dla klastra OpenShift). Oba te warianty s\u0105 naprawd\u0119 proste w instalacji, ale wymagaj\u0105 sporo zasob\u00f3w na Twoim laptopie.<\/p>\n<p><img decoding=\"async\" alt=\"Przykro mi, OpenShift, za ma\u0142o ci\u0119 doceniali\u015bmy i traktowali\u015bmy jako rzecz oczywist\u0105\" src=\"\/wp-content\/uploads\/2020\/10\/01c748365253fc9e11e817876629ae7e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Budowanie na KUK<\/h3>\n<p>\nNo to zaczynajmy.<\/p>\n<h4>Krok 1 \u2013 budujemy nasz obraz kontenera<\/h4>\n<p>\nZacznijmy od tego, \u017ce uruchomimy nasze \u201eHello World\u201d na minikube. W tym celu potrzebne b\u0119d\u0105:<\/p>\n<ol>\n<li>1. Zainstalowany Docker.<\/li>\n<li>2. Zainstalowany Git.<\/li>\n<li>3. Zainstalowany Maven (tak naprawd\u0119 w tym projekcie u\u017cywany jest binarka mvnw, wi\u0119c mo\u017cna to pomin\u0105\u0107).<\/li>\n<li>4. Sam kod \u017ar\u00f3d\u0142owy, czyli klon repozytorium <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>\nNa pocz\u0105tku musimy stworzy\u0107 projekt Quarkus. Nie martwcie si\u0119, je\u015bli nigdy nie pracowali\u015bcie z stron\u0105 Quarkus.io \u2013 to jest proste. Wystarczy wybra\u0107 komponenty, kt\u00f3re chcecie u\u017cy\u0107 w projekcie (RestEasy, Hibernate, Amazon SQS, Camel itp.), a nast\u0119pnie Quarkus samodzielnie, bez waszego udzia\u0142u, skonfiguruje archetyp maven i umie\u015bci wszystko na githubie. To znaczy, dos\u0142ownie jeden klik myszk\u0105 \u2013 i gotowe. Za to w\u0142a\u015bnie kochamy Quarkus.<\/p>\n<p><img decoding=\"async\" alt=\"Przykro mi, OpenShift, za ma\u0142o ci\u0119 doceniali\u015bmy i traktowali\u015bmy jako rzecz oczywist\u0105\" src=\"\/wp-content\/uploads\/2020\/10\/39a62058d91f8443e77466d374d02d34.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Najprostszym sposobem na zbudowanie naszego \"Hello World\" w obrazie kontenera \u2013 jest u\u017cycie rozszerze\u0144 quarkus-maven dla Dockera, kt\u00f3re wykonaj\u0105 ca\u0142\u0105 niezb\u0119dn\u0105 prac\u0119. Z pojawieniem si\u0119 Quarkus to naprawd\u0119 sta\u0142o si\u0119 \u0142atwe i proste: dodajecie rozszerzenie container-image-docker i mo\u017cecie tworzy\u0107 obrazy za pomoc\u0105 polece\u0144 maven.<\/p>\n<pre><code class=\"plaintext\">.\/mvnw quarkus:add-extension -Dextensions=\"container-image-docker\"\n<\/code><\/pre>\n<p>\nA teraz przeprowadzamy budow\u0119 naszego obrazu, u\u017cywaj\u0105c Maven. W wyniku nasz kod \u017ar\u00f3d\u0142owy zostaje przekszta\u0142cony w gotowy obraz kontenera, kt\u00f3ry mo\u017cna ju\u017c uruchomi\u0107 w \u015brodowisku wykonywania kontener\u00f3w.<\/p>\n<p><img decoding=\"async\" alt=\"Przykro mi, OpenShift, za ma\u0142o ci\u0119 doceniali\u015bmy i traktowali\u015bmy jako rzecz oczywist\u0105\" 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>\nOto, i wszystko, teraz mo\u017cna uruchomi\u0107 kontener poleceniem docker run, mapuj\u0105c nasz\u0105 us\u0142ug\u0119 na port 8080, aby mo\u017cna by\u0142o si\u0119 do niej odwo\u0142a\u0107.<\/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=\"Przykro mi, OpenShift, za ma\u0142o ci\u0119 doceniali\u015bmy i traktowali\u015bmy jako rzecz oczywist\u0105\" src=\"\/wp-content\/uploads\/2020\/10\/4f46e13423d5027d85ebae2c98c926b8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Po uruchomieniu instancji kontenera wystarczy tylko sprawdzi\u0107 poleceniem curl, czy nasza us\u0142uga dzia\u0142a:<\/p>\n<p><img decoding=\"async\" alt=\"Przykro mi, OpenShift, za ma\u0142o ci\u0119 doceniali\u015bmy i traktowali\u015bmy jako rzecz oczywist\u0105\" src=\"\/wp-content\/uploads\/2020\/10\/1c1462f52d6a487863c21f8f72a09d1f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Tak wi\u0119c, wszystko dzia\u0142a i naprawd\u0119 by\u0142o to \u0142atwe i proste.<\/p>\n<h4>Krok 2 \u2013 wysy\u0142amy nasz kontener do repozytorium obraz\u00f3w kontener\u00f3w<\/h4>\n<p>\nJak dot\u0105d nasz stworzony obraz jest przechowywany lokalnie, w naszym lokalnym repozytorium kontener\u00f3w. Je\u015bli chcemy u\u017cywa\u0107 tego obrazu w naszym \u015brodowisku K8S, musimy go umie\u015bci\u0107 w jakim\u015b innym repozytorium. W Kubernetes nie ma takich funkcji, wi\u0119c b\u0119dziemy u\u017cywa\u0107 dockerhub. Po pierwsze, jest darmowy, a po drugie, (prawie) wszyscy tak robi\u0105.<\/p>\n<p>To r\u00f3wnie\u017c jest bardzo proste i potrzebne jest tutaj tylko konto na dockerhubie.<\/p>\n<p>A wi\u0119c logujemy si\u0119 do dockerhub i wysy\u0142amy tam nasz obraz.<\/p>\n<p><img decoding=\"async\" alt=\"Przykro mi, OpenShift, za ma\u0142o ci\u0119 doceniali\u015bmy i traktowali\u015bmy jako rzecz oczywist\u0105\" src=\"\/wp-content\/uploads\/2020\/10\/fb5d81ee15ca7594277c5a05da298fbd.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h4>Krok 3 \u2013 uruchamiamy Kubernetes<\/h4>\n<p>\nIstnieje wiele sposob\u00f3w na z\u0142o\u017cenie konfiguracji kubernetes do uruchomienia naszego \"Hello World\", ale skorzystamy z najprostszej z nich, tacy ju\u017c jeste\u015bmy...<\/p>\n<p>Na pocz\u0105tek uruchamiamy klaster minikube:<\/p>\n<pre><code class=\"plaintext\">minikube start\n<\/code><\/pre>\n<p><\/p>\n<h4>Krok 4 - wdra\u017camy nasz obraz kontenera<\/h4>\n<p>\nTeraz musimy przekszta\u0142ci\u0107 nasz kod i obraz kontenera na konfiguracje kubernetes. Innymi s\u0142owy, potrzebujemy definicji pod i deploymentu wskazuj\u0105cej na nasz obraz na dockerhub. Jednym z najprostszych sposob\u00f3w, aby to zrobi\u0107, jest uruchomienie polecenia create deployment, wskazuj\u0105c na nasz obraz:<\/p>\n<p><img decoding=\"async\" alt=\"Przykro mi, OpenShift, za ma\u0142o ci\u0119 doceniali\u015bmy i traktowali\u015bmy jako rzecz oczywist\u0105\" 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>\nTym poleceniem powiedzieli\u015bmy naszemu KUBECIE stworzy\u0107 konfiguracj\u0119 deploymentu, kt\u00f3ra powinna zawiera\u0107 specyfikacj\u0119 pod'a dla naszego obrazu kontenera. To polecenie r\u00f3wnie\u017c zastosuje t\u0119 konfiguracj\u0119 do naszego klastra minikube i stworzy deployment, kt\u00f3ry pobierze nasz obraz kontenera i uruchomi pod w klastrze.<\/p>\n<h4>Krok 5 - otwieramy dost\u0119p do naszego serwisu<\/h4>\n<p>\nTeraz, gdy mamy wdro\u017cony obraz kontenera, czas pomy\u015ble\u0107, jak skonfigurowa\u0107 zewn\u0119trzny dost\u0119p do tego serwisu Restful, kt\u00f3ry rzeczywi\u015bcie jest zaprogramowany w naszym kodzie.<\/p>\n<p>Jest wiele sposob\u00f3w na to. Na przyk\u0142ad, mo\u017cna u\u017cy\u0107 polecenia expose, aby automatycznie stworzy\u0107 odpowiednie komponenty Kubernetes, takie jak us\u0142ugi i punkty ko\u0144cowe. W\u0142a\u015bnie tak zamierzamy zrobi\u0107, wykonuj\u0105c polecenie expose dla naszego obiektu deployment:<\/p>\n<pre><code class=\"plaintext\">kubectl expose deployment hello-quarkus --type=NodePort --port=8080\n<\/code><\/pre>\n<p>\nZatrzymajmy si\u0119 na chwil\u0119 przy opcji \"--type\" polecenia expose.<\/p>\n<p>Kiedy wykonujemy expose i tworzymy komponenty niezb\u0119dne do uruchomienia naszego serwisu, musimy, mi\u0119dzy innymi, zapewni\u0107, \u017ce na zewn\u0105trz mo\u017cliwe b\u0119dzie po\u0142\u0105czenie z us\u0142ug\u0105 hello-quarkus, kt\u00f3ra znajduje si\u0119 w naszej definiowanej programowo sieci. I parametr <b>type<\/b> pozwala nam stworzy\u0107 i po\u0142\u0105czy\u0107 takie rzeczy, jak load balancery, aby kierowa\u0107 ruch do tej sieci.<\/p>\n<p>Na przyk\u0142ad, wpisuj\u0105c <b>type=LoadBalancer<\/b>, automatycznie inicjujemy load balancer w publicznej chmurze, aby po\u0142\u0105czy\u0107 si\u0119 z naszym klastrem Kubernetes. To, oczywi\u015bcie, wspaniale, ale trzeba rozumie\u0107, \u017ce taka konfiguracja b\u0119dzie \u015bci\u015ble zwi\u0105zana z konkretn\u0105 publiczn\u0105 chmur\u0105 i b\u0119dzie trudniejsza do przenoszenia mi\u0119dzy instancjami Kubernetes w r\u00f3\u017cnych \u015brodowiskach.<\/p>\n<p>W naszym przyk\u0142adzie <b>type=NodePort<\/b>, czyli dost\u0119p do naszej us\u0142ugi odbywa si\u0119 za po\u015brednictwem adresu IP i numeru portu w\u0119z\u0142a. Ta opcja pozwala na niekorzystanie z \u017cadnych publicznych chmur, ale wymaga kilku dodatkowych krok\u00f3w. Po pierwsze, potrzebny jest w\u0142asny load balancer, dlatego wdro\u017cymy w naszym klastrze load balancer NGINX.<\/p>\n<h4>Krok 6 \u2013 instalacja load balancera<\/h4>\n<p>\nMinikube ma szereg funkcji platformowych, u\u0142atwiaj\u0105cych tworzenie wymaganych komponent\u00f3w do zewn\u0119trznego dost\u0119pu, takich jak kontrolery ingress. Minikube dostarczany jest z kontrolerem ingress Nginx, wi\u0119c wystarczy go tylko w\u0142\u0105czy\u0107 i skonfigurowa\u0107.<\/p>\n<pre><code class=\"plaintext\">minikube addons enable ingress\n<\/code><\/pre>\n<p>\nTeraz za pomoc\u0105 jednego polecenia utworzymy kontroler ingress Nginx, kt\u00f3ry b\u0119dzie dzia\u0142a\u0142 wewn\u0105trz naszego klastra 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>Krok 7 \u2013 konfiguracja ingress<\/h4>\n<p>\nTeraz musimy skonfigurowa\u0107 kontroler ingress Nginx, aby obs\u0142ugiwa\u0142 \u017c\u0105dania hello-quarkus.<\/p>\n<p><img decoding=\"async\" alt=\"Przykro mi, OpenShift, za ma\u0142o ci\u0119 doceniali\u015bmy i traktowali\u015bmy jako rzecz oczywist\u0105\" src=\"\/wp-content\/uploads\/2020\/10\/18183cb985436447cf15c501e4c6c3a3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><img decoding=\"async\" alt=\"Przykro mi, OpenShift, za ma\u0142o ci\u0119 doceniali\u015bmy i traktowali\u015bmy jako rzecz oczywist\u0105\" src=\"\/wp-content\/uploads\/2020\/10\/577f1e6218094b5ee23052d49869e838.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>I w ko\u0144cu musimy zastosowa\u0107 t\u0119 konfiguracj\u0119.<\/p>\n<p><img decoding=\"async\" alt=\"Przykro mi, OpenShift, za ma\u0142o ci\u0119 doceniali\u015bmy i traktowali\u015bmy jako rzecz oczywist\u0105\" 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=\"Przykro mi, OpenShift, za ma\u0142o ci\u0119 doceniali\u015bmy i traktowali\u015bmy jako rzecz oczywist\u0105\" src=\"\/wp-content\/uploads\/2020\/10\/68fba4ef3d2762a97dc5be5de9e6b864.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Poniewa\u017c robimy to wszystko na swoim komputerze, po prostu dodajemy adres IP swojego w\u0119z\u0142a do pliku \/etc\/hosts, aby kierowa\u0107 \u017c\u0105dania http do naszego minikube na load balancer NGINX.<\/p>\n<pre><code class=\"plaintext\">192.168.99.100 hello-quarkus.info\n<\/code><\/pre>\n<p>\nGotowe, teraz nasza us\u0142uga minikube jest dost\u0119pna z zewn\u0105trz przez kontroler ingress Nginx.<\/p>\n<p><img decoding=\"async\" alt=\"Przykro mi, OpenShift, za ma\u0142o ci\u0119 doceniali\u015bmy i traktowali\u015bmy jako rzecz oczywist\u0105\" src=\"\/wp-content\/uploads\/2020\/10\/a456f34d168d43e9236e4769722b7f5d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>No c\u00f3\u017c, to by\u0142o \u0142atwe, prawda? A mo\u017ce nie za bardzo?<\/h3>\n<p><img decoding=\"async\" alt=\"Przykro mi, OpenShift, za ma\u0142o ci\u0119 doceniali\u015bmy i traktowali\u015bmy jako rzecz oczywist\u0105\" src=\"\/wp-content\/uploads\/2020\/10\/237015dc06bb9d12eb4cd2944dc6df58.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Uruchomienie na OpenShift (Code Ready Containers)<\/h3>\n<p>\nA teraz zobaczmy, jak to wszystko dzia\u0142a na platformie Red Hat OpenShift Container Platform (OCP).<\/p>\n<p>Podobnie jak w przypadku minikube, wybieramy schemat z jedno w\u0119z\u0142owym klastrem OpenShift w formie Code Ready Containers (CRC). Wcze\u015bniej nazywa\u0142o si\u0119 to minishift i by\u0142o oparte na projekcie OpenShift Origin, teraz to CRC i jest zbudowane na platformie Red Hat OpenShift Container.<\/p>\n<p>Tutaj, przepraszamy, nie mo\u017cemy powstrzyma\u0107 si\u0119 od powiedzenia: \u201eOpenShift jest wspania\u0142y!\u201d<\/p>\n<p>Pocz\u0105tkowo my\u015bleli\u015bmy, \u017ce napisanie, i\u017c rozw\u00f3j na OpenShift niczym si\u0119 nie r\u00f3\u017cni od rozwoju na Kubernetes, b\u0119dzie zasadne. I w zasadzie tak jest. Jednak podczas pisania tego posta przypomnieli\u015bmy sobie, ile zb\u0119dnych ruch\u00f3w trzeba wykona\u0107, gdy nie masz OpenShift, dlatego powtarzamy: jest wspania\u0142y. Lubimy, gdy wszystko dzieje si\u0119 \u0142atwo, a to, jak prosto w por\u00f3wnaniu do minikube wdra\u017ca si\u0119 i uruchamia nasz przyk\u0142ad na OpenShift, sk\u0142oni\u0142o nas do napisania tego posta.<\/p>\n<p>Przejd\u017amy do procesu i sprawd\u017amy, co b\u0119dziemy musieli zrobi\u0107.<\/p>\n<p>Zatem w przyk\u0142adzie z minikube zaczynali\u015bmy od Dockera\u2026 Chwileczk\u0119, nie potrzebujemy ju\u017c, aby Docker by\u0142 zainstalowany na maszynie.<\/p>\n<p><b>I lokalny git nie jest nam potrzebny.<br \/>\nI Maven nie jest potrzebny.<br \/>\nNie musimy te\u017c r\u0119cznie tworzy\u0107 obrazu kontenera.<br \/>\nNie musimy szuka\u0107 jakiego\u015b repozytorium obraz\u00f3w kontenerowych.<br \/>\nNie musimy te\u017c instalowa\u0107 kontrolera ingress.<br \/>\nKonfiguracja ingress r\u00f3wnie\u017c nie jest konieczna.<\/b><\/p>\n<p>Rozumiesz, tak? Aby wdro\u017cy\u0107 i uruchomi\u0107 nasz\u0105 aplikacj\u0119 na OpenShift, nie potrzebujemy nic z wymienionych wcze\u015bniej rzeczy. A sam proces wygl\u0105da nast\u0119puj\u0105co.<\/p>\n<h4>Krok 1 \u2013 Uruchamiamy sw\u00f3j klaster OpenShift<\/h4>\n<p>\nU\u017cywamy Code Ready Containers od Red Hat, kt\u00f3ry w zasadzie jest tym samym co Minikube, ale oferuje pe\u0142noprawny jednolity klaster Openshift.<\/p>\n<pre><code class=\"plaintext\">crc start\n<\/code><\/pre>\n<p><\/p>\n<h4>Krok 2 \u2013 Wykonujemy budow\u0119 i wdro\u017cenie aplikacji w klastrze OpenShift<\/h4>\n<p>\nTo w\u0142a\u015bnie na tym etapie prostota i wygoda OpenShift ukazuj\u0105 si\u0119 w ca\u0142ej okaza\u0142o\u015bci. Jak w ka\u017cdym dystrybucji Kubernetes, mamy wiele sposob\u00f3w uruchomienia aplikacji w klastrze. I, jak w przypadku K8s, celowo wybieramy najprostsze rozwi\u0105zanie.<\/p>\n<p>OpenShift zawsze by\u0142 budowany jako platforma do tworzenia i uruchamiania aplikacji kontenerowych. Budowanie kontener\u00f3w od pocz\u0105tku by\u0142o nieod\u0142\u0105czn\u0105 cz\u0119\u015bci\u0105 tej platformy, dlatego istnieje tutaj mn\u00f3stwo dodatkowych zasob\u00f3w Kubernetes do odpowiednich zada\u0144.<\/p>\n<p>B\u0119dziemy korzysta\u0107 z procesu Source 2 Image (S2I) OpenShift, kt\u00f3ry oferuje kilka r\u00f3\u017cnych metod, aby wzi\u0105\u0107 nasz \u017ar\u00f3d\u0142owy kod (lub pliki binarne) i przekszta\u0142ci\u0107 go w obraz kontenera, kt\u00f3ry mo\u017cna uruchomi\u0107 w klastrze OpenShift.<\/p>\n<p>Do tego b\u0119d\u0105 nam potrzebne dwie rzeczy:<\/p>\n<ul>\n<li>Nasz kod \u017ar\u00f3d\u0142owy w repozytorium git<\/li>\n<li>Obraz Builder, na podstawie kt\u00f3rego b\u0119dzie wykonywane budowanie.<\/li>\n<\/ul>\n<p>\nIstnieje wiele takich obraz\u00f3w, wspieranych zar\u00f3wno przez Red Hat, jak i na poziomie spo\u0142eczno\u015bci, a my skorzystamy z obrazu OpenJDK, poniewa\u017c buduj\u0119 aplikacj\u0119 w Javie.<\/p>\n<p>Uruchomienie budowy S2I mo\u017cna przeprowadzi\u0107 zar\u00f3wno z graficznego interfejsu konsoli OpenShift Developer, jak i z linii polece\u0144. Skorzystamy z polecenia new-app, wskazuj\u0105c, sk\u0105d bra\u0107 obraz builder i nasz kod \u017ar\u00f3d\u0142owy.<\/p>\n<p><img decoding=\"async\" alt=\"Przykro mi, OpenShift, za ma\u0142o ci\u0119 doceniali\u015bmy i traktowali\u015bmy jako rzecz oczywist\u0105\" 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>\nGotowe, nasza aplikacja zosta\u0142a stworzona. Proces S2I wykona\u0142 nast\u0119puj\u0105ce czynno\u015bci:<\/p>\n<ul>\n<li>Utworzono specjalny build-pod do r\u00f3\u017cnych zada\u0144 zwi\u0105zanych z budowaniem aplikacji.<\/li>\n<li>Utworzono konfiguracj\u0119 OpenShift Build.<\/li>\n<li>Pobrano obraz buildera do wewn\u0119trznego rejestru docker OpenShift.<\/li>\n<li>Skopiowano 'Hello World' do lokalnego repozytorium.<\/li>\n<li>Zauwa\u017cy\u0142em, \u017ce jest tam plik maven pom, wi\u0119c skompilowa\u0142em aplikacj\u0119 za pomoc\u0105 maven.<\/li>\n<li>Utworzy\u0142em nowy obraz kontenery, zawieraj\u0105cy skompilowan\u0105 aplikacj\u0119 Java, i umie\u015bci\u0142em ten obraz w wewn\u0119trznym rejestrze kontener\u00f3w.<\/li>\n<li>Utworzy\u0142em Kubernetes Deployment z specyfikacjami pod\u2019a, us\u0142ugi itp.<\/li>\n<li>Uruchomi\u0142em wdro\u017cenie obrazu kontenera.<\/li>\n<li>Usun\u0105\u0142em s\u0142u\u017cbowy build-pod.<\/li>\n<\/ul>\n<p>\nW tej li\u015bcie jest wiele rzeczy, ale najwa\u017cniejsze jest to, \u017ce ca\u0142y proces budowy odbywa si\u0119 wy\u0142\u0105cznie wewn\u0105trz OpenShift, wewn\u0119trzny rejestr Docker znajduje si\u0119 w OpenShift, a proces budowy tworzy wszystkie komponenty Kubernetes i uruchamia je w klastrze.<\/p>\n<p>Je\u015bli wizualnie \u015bledzi\u0107 uruchomienie S2I w konsoli, mo\u017cna zobaczy\u0107, jak podczas budowy uruchamia si\u0119 build pod.<\/p>\n<p><img decoding=\"async\" alt=\"Przykro mi, OpenShift, za ma\u0142o ci\u0119 doceniali\u015bmy i traktowali\u015bmy jako rzecz oczywist\u0105\" src=\"\/wp-content\/uploads\/2020\/10\/bd69c6e27813b1211a11e522f28f45b7.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>A teraz przyjrzyjmy si\u0119 logom builder pod\u2019a: po pierwsze, wida\u0107, jak maven wykonuje swoj\u0105 prac\u0119 i pobiera zale\u017cno\u015bci do budowy naszej aplikacji java.<\/p>\n<p><img decoding=\"async\" alt=\"Przykro mi, OpenShift, za ma\u0142o ci\u0119 doceniali\u015bmy i traktowali\u015bmy jako rzecz oczywist\u0105\" src=\"\/wp-content\/uploads\/2020\/10\/326192f9f9373e451d601b77052d67d1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Po zako\u0144czeniu budowy maven uruchamiana jest budowa obrazu kontenera, a nast\u0119pnie ten zbudowany obraz jest wysy\u0142any do wewn\u0119trznego repozytorium.<\/p>\n<p><img decoding=\"async\" alt=\"Przykro mi, OpenShift, za ma\u0142o ci\u0119 doceniali\u015bmy i traktowali\u015bmy jako rzecz oczywist\u0105\" src=\"\/wp-content\/uploads\/2020\/10\/c97da4c17a8e275d39104126d0f87048.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Wszystko, proces budowy zako\u0144czony. Teraz upewnijmy si\u0119, \u017ce w klastrze uruchomi\u0142y si\u0119 pod\u2019y i us\u0142ugi naszej aplikacji.<\/p>\n<pre><code class=\"plaintext\">oc get service\n<\/code><\/pre>\n<p><img decoding=\"async\" alt=\"Przykro mi, OpenShift, za ma\u0142o ci\u0119 doceniali\u015bmy i traktowali\u015bmy jako rzecz oczywist\u0105\" src=\"\/wp-content\/uploads\/2020\/10\/f16a098a096128073f305e0444061417.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>To wszystko. I tylko jedna komenda. Musimy teraz tylko expose tej us\u0142ugi, aby uzyska\u0107 dost\u0119p z zewn\u0105trz.<\/p>\n<h4>Krok 3 \u2013 expose us\u0142ugi dla dost\u0119pu z zewn\u0105trz<\/h4>\n<p>\nTak jak w przypadku CUK, na platformie OpenShift nasz \u00abHello World\u00bb r\u00f3wnie\u017c potrzebuje routera, aby kierowa\u0107 ruch zewn\u0119trzny do us\u0142ugi wewn\u0105trz klastra. W OpenShift jest to bardzo proste. Po pierwsze, w klastrze domy\u015blnie zainstalowany jest komponent routingu HAProxy (mo\u017cna go zmieni\u0107 na NGINX). Po drugie, istniej\u0105 specjalne i elastyczne zasoby, kt\u00f3re nazywaj\u0105 si\u0119 Routes i przypominaj\u0105 obiekty Ingress w starym dobrym Kubernetes (w rzeczywisto\u015bci Routes w OpenShift znacz\u0105co wp\u0142yn\u0119\u0142y na projekt obiekt\u00f3w Ingress, kt\u00f3re mo\u017cna teraz r\u00f3wnie\u017c u\u017cywa\u0107 w OpenShift), ale dla naszego \u00abHello World\u00bb oraz niemal we wszystkich innych przypadkach wystarczy standardowy Route bez dodatkowego konfigurowania.<\/p>\n<p>Aby stworzy\u0107 routowalny FQDN dla \u00abHello World\u00bb (tak, w OpenShift istnieje sw\u00f3j DNS do kierowania na podstawie nazw us\u0142ug), po prostu wykonamy expose dla naszej us\u0142ugi:<\/p>\n<p><img decoding=\"async\" alt=\"Przykro mi, OpenShift, za ma\u0142o ci\u0119 doceniali\u015bmy i traktowali\u015bmy jako rzecz oczywist\u0105\" 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>\nJe\u015bli przyjrzymy si\u0119 w\u0142a\u015bnie utworzonemu Route, to mo\u017cna znale\u017a\u0107 FQDN i inne informacje dotycz\u0105ce routingu:<\/p>\n<pre><code class=\"plaintext\">oc get route\n<\/code><\/pre>\n<p><img decoding=\"async\" alt=\"Przykro mi, OpenShift, za ma\u0142o ci\u0119 doceniali\u015bmy i traktowali\u015bmy jako rzecz oczywist\u0105\" src=\"\/wp-content\/uploads\/2020\/10\/dc59c36166605ef0a5a24b2b7ffa65b6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>I na ko\u0144cu, zwracamy si\u0119 do naszej us\u0142ugi z przegl\u0105darki:<\/p>\n<p><img decoding=\"async\" alt=\"Przykro mi, OpenShift, za ma\u0142o ci\u0119 doceniali\u015bmy i traktowali\u015bmy jako rzecz oczywist\u0105\" src=\"\/wp-content\/uploads\/2020\/10\/fccf6cae1746fa59df2ff8ffb6973666.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>A teraz to by\u0142o naprawd\u0119 \u0142atwe!<\/h3>\n<p>\nKochamy Kubernetes i wszystko, co ta technologia umo\u017cliwia, ale r\u00f3wnie\u017c uwielbiamy prostot\u0119 i \u0142atwo\u015b\u0107. Kubernetes zosta\u0142 stworzony, aby niesamowicie upro\u015bci\u0107 eksploatacj\u0119 rozproszonych, skalowalnych kontener\u00f3w, jednak do uruchamiania aplikacji ta prostota nie wystarcza ju\u017c dzisiaj. I tutaj wkracza OpenShift, kt\u00f3ry pod\u0105\u017ca za czasami i oferuje Kubernetes, przede wszystkim skupiony na deweloperze. W\u0142o\u017cono mn\u00f3stwo pracy, aby dostosowa\u0107 platform\u0119 OpenShift specjalnie dla dewelopera, w tym stworzenie takich narz\u0119dzi jak S2I, ODI, Developer Portal, OpenShift Operator Framework, integracja z IDE, Katalogi Deweloper\u00f3w, integracja z Helm, monitorowanie i wiele innych.<\/p>\n<p>Mamy nadziej\u0119, \u017ce ten artyku\u0142 by\u0142 dla Ciebie interesuj\u0105cy i przydatny. Dodatkowe zasoby, materia\u0142y oraz inne przydatne elementy do rozwoju na platformie OpenShift mo\u017cna znale\u017a\u0107 na portalu <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/\">Red Hat Developers<\/a><\/noindex>.<br \/>\n<br \/>\u0179r\u00f3d\u0142o: <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.1.1 - 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\/pl\/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.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\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\/pl\/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\udd47Przepraszam, OpenShift, nie doceniali\u015bmy ci\u0119 wystarczaj\u0105co i traktowali\u015bmy ci\u0119 jako co\u015b oczywistego | ProHoster","description":"Ten post zosta\u0142 napisany, poniewa\u017c nasi pracownicy mieli wiele rozm\u00f3w z klientami na temat tworzenia aplikacji w Kubernetes oraz specyfiki takiego rozwoju na OpenShift.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/prosti-openshift-my-nedostatochno-czenili-tebya-i-prinimali-kak-dolzhnoe","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","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\/pl\/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\/pl\/wp-json\/wp\/v2\/posts\/97254","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=97254"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/97254\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/97255"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=97254"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=97254"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=97254"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}