{"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\/pt\/blog\/administrirovanie\/prosti-openshift-my-nedostatochno-czenili-tebya-i-prinimali-kak-dolzhnoe","title":{"rendered":"Desculpe, OpenShift, n\u00e3o te valorizamos o suficiente e tomamos voc\u00ea como certo.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Este post foi escrito porque nossos colaboradores tiveram muitas conversas com clientes sobre o desenvolvimento de aplica\u00e7\u00f5es no Kubernetes e as especificidades desse tipo de desenvolvimento no OpenShift.<\/p>\n<p><img decoding=\"async\" alt=\"Desculpe, OpenShift, n\u00e3o te valorizamos o suficiente e tomamos voc\u00ea como certo.\" src=\"\/wp-content\/uploads\/2020\/10\/ad447aeb80d3ae56ea4598cd959456de.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nGeralmente come\u00e7amos com a tese de que Kubernetes \u00e9 apenas Kubernetes, enquanto OpenShift \u00e9 uma plataforma Kubernetes, assim como Microsoft AKS ou Amazon EKS. Cada uma dessas plataformas tem suas vantagens, voltadas para diferentes p\u00fablicos-alvo. E ap\u00f3s isso, a conversa flui para a compara\u00e7\u00e3o dos pontos fortes e fracos de cada plataforma espec\u00edfica.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nEm geral, est\u00e1vamos pensando em escrever este post com uma conclus\u00e3o do tipo: \"Olha, n\u00e3o importa onde executar o c\u00f3digo, no OpenShift ou no AKS, no EKS, em um Kubernetes personalizado, em qualquer Kubernetes\". <i>(para abreviar, chamaremos de KUK)<\/i> \u2013 \u00e9 realmente simples, tanto l\u00e1 quanto c\u00e1.<\/p>\n<p>Depois, planej\u00e1vamos pegar o simples \"Hello World\" e, a partir dele, mostrar o que \u00e9 comum e quais s\u00e3o as diferen\u00e7as entre KUK e a Red Hat OpenShift Container Platform (daqui em diante, OCP ou apenas OpenShift).<\/p>\n<p>No entanto, ao longo da reda\u00e7\u00e3o deste post, percebemos que nos acostumamos tanto a usar o OpenShift que simplesmente n\u00e3o reconhecemos como ele cresceu e se transformou em uma plataforma incr\u00edvel, que se tornou muito mais do que apenas uma distribui\u00e7\u00e3o do Kubernetes. Nos acostumamos a considerar a maturidade e a simplicidade do OpenShift como garantidas, esquecendo de seu esplendor.<\/p>\n<p>Em geral, chegou a hora do arrependimento ativo, e agora vamos comparar passo a passo a implanta\u00e7\u00e3o do nosso \"Hello World\" no KUK e no OpenShift, e faremos isso da forma mais objetiva poss\u00edvel (exceto por, \u00e0s vezes, expressar nosso sentimento sobre o assunto). Se voc\u00ea est\u00e1 interessado em uma opini\u00e3o puramente subjetiva sobre isso, pode l\u00ea-la <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/swlh\/im-so-sorry-openshift-i-ve-taken-you-for-granted-f36fb47ea4d9\">aqui (EN)<\/a><\/noindex>. E neste post, nos manteremos nos fatos e apenas nos fatos.<\/p>\n<h3>Clusters<\/h3>\n<p>\nEnt\u00e3o, para o nosso \"Hello World\", precisamos de clusters. Vamos logo dizer \"n\u00e3o\" a qualquer nuvem p\u00fablica, para n\u00e3o pagarmos por servidores, registros, redes, transfer\u00eancia de dados, etc. Portanto, escolhemos um simples cluster de um \u00fanico n\u00f3 em <noindex><a rel=\"nofollow\" href=\"https:\/\/minikube.sigs.k8s.io\/docs\/start\/\">Minikube<\/a><\/noindex> (para o KUK) e <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/products\/codeready-containers\/overview\">Code Ready Containers<\/a><\/noindex> (para o cluster OpenShift). Ambas as op\u00e7\u00f5es s\u00e3o realmente simples de instalar, mas exigir\u00e3o muitos recursos no seu laptop.<\/p>\n<p><img decoding=\"async\" alt=\"Desculpe, OpenShift, n\u00e3o te valorizamos o suficiente e tomamos voc\u00ea como certo.\" src=\"\/wp-content\/uploads\/2020\/10\/01c748365253fc9e11e817876629ae7e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Compila\u00e7\u00e3o no KUK<\/h3>\n<p>\nEnt\u00e3o, vamos l\u00e1.<\/p>\n<h4>Passo 1 \u2013 vamos compilar nossa imagem de cont\u00eainer<\/h4>\n<p>\nCome\u00e7aremos por implantar nosso \"Hello World\" no Minikube. Para isso, precisaremos de:<\/p>\n<ol>\n<li>1. Docker instalado.<\/li>\n<li>2. Git instalado.<\/li>\n<li>3. Maven instalado (na verdade, neste projeto, usamos o bin\u00e1rio mvnw, ent\u00e3o n\u00e3o \u00e9 necess\u00e1rio).<\/li>\n<li>4. O c\u00f3digo-fonte propriamente dito, ou seja, o clone do reposit\u00f3rio <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>\nPrimeiramente, precisamos criar um projeto Quarkus. N\u00e3o se preocupe se voc\u00ea nunca trabalhou com o site Quarkus.io \u2013 \u00e9 f\u00e1cil. Basta escolher os componentes que deseja usar no projeto (RestEasy, Hibernate, Amazon SQS, Camel, etc.), e o Quarkus ir\u00e1 configurar automaticamente o archetype do maven e disponibilizar tudo no GitHub. Ent\u00e3o, literalmente, \u00e9 um clique do mouse \u2013 e est\u00e1 pronto. \u00c9 por isso que amamos o Quarkus.<\/p>\n<p><img decoding=\"async\" alt=\"Desculpe, OpenShift, n\u00e3o te valorizamos o suficiente e tomamos voc\u00ea como certo.\" src=\"\/wp-content\/uploads\/2020\/10\/39a62058d91f8443e77466d374d02d34.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>A maneira mais simples de compilar nosso 'Hello World' em uma imagem de cont\u00eainer \u00e9 usar a extens\u00e3o quarkus-maven para Docker, que far\u00e1 todo o trabalho necess\u00e1rio. Com a chegada do Quarkus, isso se tornou realmente f\u00e1cil: voc\u00ea adiciona a extens\u00e3o container-image-docker e pode criar imagens com comandos do maven.<\/p>\n<pre><code class=\"plaintext\">.\/mvnw quarkus:add-extension -Dextensions=\"container-image-docker\"\n<\/code><\/pre>\n<p>\nE, finalmente, compilamos nossa imagem usando o Maven. Como resultado, nosso c\u00f3digo-fonte se transforma em uma imagem de cont\u00eainer pronta para ser executada no ambiente de execu\u00e7\u00e3o de cont\u00eaineres.<\/p>\n<p><img decoding=\"async\" alt=\"Desculpe, OpenShift, n\u00e3o te valorizamos o suficiente e tomamos voc\u00ea como certo.\" 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>\nE isso \u00e9 tudo, agora podemos iniciar o cont\u00eainer com o comando docker run, mapeando nosso servi\u00e7o para a porta 8080, para que possa ser acessado.<\/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=\"Desculpe, OpenShift, n\u00e3o te valorizamos o suficiente e tomamos voc\u00ea como certo.\" src=\"\/wp-content\/uploads\/2020\/10\/4f46e13423d5027d85ebae2c98c926b8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Depois que a inst\u00e2ncia do cont\u00eainer for iniciada, resta apenas verificar com o comando curl se nosso servi\u00e7o est\u00e1 funcionando:<\/p>\n<p><img decoding=\"async\" alt=\"Desculpe, OpenShift, n\u00e3o te valorizamos o suficiente e tomamos voc\u00ea como certo.\" src=\"\/wp-content\/uploads\/2020\/10\/1c1462f52d6a487863c21f8f72a09d1f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Assim, tudo est\u00e1 funcionando e foi realmente f\u00e1cil.<\/p>\n<h4>Passo 2 \u2013 enviamos nosso cont\u00eainer para o reposit\u00f3rio de imagens de cont\u00eainer<\/h4>\n<p>\nAt\u00e9 agora, a imagem que criamos est\u00e1 armazenada localmente, em nosso reposit\u00f3rio local de cont\u00eaineres. Se quisermos usar essa imagem em nosso ambiente K8s, precisamos coloc\u00e1-la em algum outro reposit\u00f3rio. No Kubernetes, n\u00e3o h\u00e1 tais funcionalidades, ent\u00e3o usaremos o dockerhub. Porque, em primeiro lugar, \u00e9 gratuito, e em segundo lugar, (quase) todos fazem isso.<\/p>\n<p>Isso tamb\u00e9m \u00e9 muito simples, e s\u00f3 precisamos de uma conta no dockerhub.<\/p>\n<p>Ent\u00e3o, configuramos o dockerhub e enviamos nossa imagem para l\u00e1.<\/p>\n<p><img decoding=\"async\" alt=\"Desculpe, OpenShift, n\u00e3o te valorizamos o suficiente e tomamos voc\u00ea como certo.\" src=\"\/wp-content\/uploads\/2020\/10\/fb5d81ee15ca7594277c5a05da298fbd.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h4>Passo 3 \u2013 iniciamos o Kubernetes<\/h4>\n<p>\nExistem muitas maneiras de montar a configura\u00e7\u00e3o do Kubernetes para executar nosso 'Hello World', mas usaremos a mais simples, somos assim...<\/p>\n<p>Para come\u00e7ar, iniciamos o cluster minikube:<\/p>\n<pre><code class=\"plaintext\">minikube start\n<\/code><\/pre>\n<p><\/p>\n<h4>Passo 4 \u2013 implantamos nossa imagem de cont\u00eainer<\/h4>\n<p>\nAgora precisamos converter nosso c\u00f3digo e a imagem do cont\u00eainer em configura\u00e7\u00f5es do Kubernetes. Em outras palavras, precisamos da defini\u00e7\u00e3o de pod e deployment, apontando para nossa imagem de cont\u00eainer no Docker Hub. Uma das maneiras mais simples de fazer isso \u00e9 rodar o comando create deployment, especificando nossa imagem:<\/p>\n<p><img decoding=\"async\" alt=\"Desculpe, OpenShift, n\u00e3o te valorizamos o suficiente e tomamos voc\u00ea como certo.\" 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>\nCom este comando, dissemos ao nosso K8S para criar uma configura\u00e7\u00e3o de deployment que deve conter a especifica\u00e7\u00e3o do pod para nossa imagem de cont\u00eainer. Este comando tamb\u00e9m aplicar\u00e1 essa configura\u00e7\u00e3o ao nosso cluster minikube, criando um deployment que baixar\u00e1 nossa imagem de cont\u00eainer e iniciar\u00e1 o pod no cluster.<\/p>\n<h4>Passo 5 \u2013 abrindo o acesso ao nosso servi\u00e7o<\/h4>\n<p>\nAgora que temos a imagem de cont\u00eainer implantada, \u00e9 hora de pensar em como configurar o acesso externo a este servi\u00e7o Restful, que est\u00e1, na verdade, programado em nosso c\u00f3digo.<\/p>\n<p>Existem v\u00e1rias maneiras de fazer isso. Por exemplo, podemos usar o comando expose para criar automaticamente os componentes do Kubernetes necess\u00e1rios, como services e endpoints. E \u00e9 exatamente isso que faremos, executando o comando expose para nosso objeto de deployment:<\/p>\n<pre><code class=\"plaintext\">kubectl expose deployment hello-quarkus --type=NodePort --port=8080\n<\/code><\/pre>\n<p>\nVamos parar um momento para discutir a op\u00e7\u00e3o \"--type\" do comando expose.<\/p>\n<p>Quando fazemos o expose e criamos os componentes necess\u00e1rios para executar nosso servi\u00e7o, precisamos que, entre outras coisas, seja poss\u00edvel acessar o servi\u00e7o hello-quarkus que est\u00e1 dentro da nossa rede program\u00e1vel. E o par\u00e2metro <b>tipo<\/b> nos permite criar e conectar coisas como balanceadores de carga para direcionar o tr\u00e1fego para essa rede.<\/p>\n<p>Por exemplo, especificando <b>type=LoadBalancer<\/b>, automaticamente inicializamos um balanceador de carga na nuvem p\u00fablica, para nos conectar ao nosso cluster Kubernetes. Isso, claro, \u00e9 \u00f3timo, mas precisamos entender que essa configura\u00e7\u00e3o ficar\u00e1 rigidamente presa a uma nuvem p\u00fablica espec\u00edfica e ser\u00e1 mais dif\u00edcil de migrar entre inst\u00e2ncias de Kubernetes em diferentes ambientes.<\/p>\n<p>No nosso exemplo <b>type=NodePort<\/b>, ou seja, a chamada ao nosso servi\u00e7o \u00e9 feita pelo IP do n\u00f3 e pelo n\u00famero da porta. Esta op\u00e7\u00e3o permite n\u00e3o usar nenhuma nuvem p\u00fablica, mas requer uma s\u00e9rie de etapas adicionais. Primeiro, voc\u00ea precisa do seu pr\u00f3prio balanceador de carga, ent\u00e3o vamos implementar um balanceador de carga NGINX em nosso cluster.<\/p>\n<h4>Passo 6 \u2013 Instalando o balanceador de carga<\/h4>\n<p>\nO minikube possui uma s\u00e9rie de funcionalidades de plataforma que facilitam a cria\u00e7\u00e3o dos componentes necess\u00e1rios para acesso externo, como os controladores de ingress. O Minikube vem com um controlador de ingress Nginx, e s\u00f3 precisamos ativ\u00e1-lo e configur\u00e1-lo.<\/p>\n<pre><code class=\"plaintext\">minikube addons enable ingress\n<\/code><\/pre>\n<p>\nAgora, com um \u00fanico comando, criaremos o controlador de ingress Nginx que funcionar\u00e1 dentro do nosso cluster minikube:<\/p>\n<pre><code class=\"plaintext\">ingress-nginx-controller-69ccf5d9d8-j5gs9 1\/1 Rodando 1 33m\n<\/code><\/pre>\n<p><\/p>\n<h4>Passo 7 \u2013 Configurando o ingress<\/h4>\n<p>\nAgora precisamos configurar o controlador de ingress Nginx para que ele possa processar as requisi\u00e7\u00f5es hello-quarkus.<\/p>\n<p><img decoding=\"async\" alt=\"Desculpe, OpenShift, n\u00e3o te valorizamos o suficiente e tomamos voc\u00ea como certo.\" src=\"\/wp-content\/uploads\/2020\/10\/18183cb985436447cf15c501e4c6c3a3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><img decoding=\"async\" alt=\"Desculpe, OpenShift, n\u00e3o te valorizamos o suficiente e tomamos voc\u00ea como certo.\" src=\"\/wp-content\/uploads\/2020\/10\/577f1e6218094b5ee23052d49869e838.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>E, finalmente, precisamos aplicar essa configura\u00e7\u00e3o.<\/p>\n<p><img decoding=\"async\" alt=\"Desculpe, OpenShift, n\u00e3o te valorizamos o suficiente e tomamos voc\u00ea como certo.\" 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=\"Desculpe, OpenShift, n\u00e3o te valorizamos o suficiente e tomamos voc\u00ea como certo.\" src=\"\/wp-content\/uploads\/2020\/10\/68fba4ef3d2762a97dc5be5de9e6b864.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Como estamos fazendo tudo isso em nosso computador, basta adicionar o IP do seu n\u00f3 ao arquivo \/etc\/hosts, para direcionar as requisi\u00e7\u00f5es http ao nosso minikube no balanceador de carga NGINX.<\/p>\n<pre><code class=\"plaintext\">192.168.99.100 hello-quarkus.info\n<\/code><\/pre>\n<p>\nPronto! Agora nosso servi\u00e7o minikube est\u00e1 acess\u00edvel externamente atrav\u00e9s do controlador de ingress Nginx.<\/p>\n<p><img decoding=\"async\" alt=\"Desculpe, OpenShift, n\u00e3o te valorizamos o suficiente e tomamos voc\u00ea como certo.\" src=\"\/wp-content\/uploads\/2020\/10\/a456f34d168d43e9236e4769722b7f5d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Ent\u00e3o, foi f\u00e1cil, n\u00e3o? Ou n\u00e3o t\u00e3o f\u00e1cil assim?<\/h3>\n<p><img decoding=\"async\" alt=\"Desculpe, OpenShift, n\u00e3o te valorizamos o suficiente e tomamos voc\u00ea como certo.\" src=\"\/wp-content\/uploads\/2020\/10\/237015dc06bb9d12eb4cd2944dc6df58.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Executando no OpenShift (Code Ready Containers)<\/h3>\n<p>\nAgora vamos ver como isso \u00e9 feito na Red Hat OpenShift Container Platform (OCP).<\/p>\n<p>Assim como no caso do minikube, escolhemos o esquema de um cluster de n\u00f3 \u00fanico OpenShift na forma de Code Ready Containers (CRC). Antes, isso era conhecido como minishift e era baseado no projeto OpenShift Origin, agora \u00e9 CRC e constru\u00eddo na plataforma OpenShift da Red Hat.<\/p>\n<p>Aqui, desculpe, n\u00e3o podemos deixar de dizer: \"OpenShift \u00e9 maravilhoso!\"<\/p>\n<p>Inicialmente, pensamos em escrever que o desenvolvimento no OpenShift n\u00e3o \u00e9 diferente do desenvolvimento no Kubernetes. E, em ess\u00eancia, \u00e9 verdade. Mas, ao escrever este post, lembramos quantas etapas desnecess\u00e1rias s\u00e3o necess\u00e1rias quando voc\u00ea n\u00e3o tem o OpenShift, e por isso, reafirmamos, ele \u00e9 maravilhoso. N\u00f3s adoramos quando tudo \u00e9 f\u00e1cil, e a maneira como nosso exemplo \u00e9 implantado e iniciado no OpenShift em compara\u00e7\u00e3o com o minikube \u00e9, na verdade, o que nos motivou a escrever este post.<\/p>\n<p>Vamos dar uma olhada no processo e ver o que precisaremos fazer.<\/p>\n<p>Ent\u00e3o, no exemplo com minikube, come\u00e7amos com o Docker... Espere, n\u00e3o precisamos mais que o Docker esteja instalado na m\u00e1quina.<\/p>\n<p><b>E o git local n\u00e3o \u00e9 necess\u00e1rio.<br \/>\nE o Maven tamb\u00e9m n\u00e3o \u00e9 necess\u00e1rio.<br \/>\nE n\u00e3o \u00e9 necess\u00e1rio criar manualmente a imagem do container.<br \/>\nE n\u00e3o \u00e9 preciso procurar por algum reposit\u00f3rio de imagens de containers.<br \/>\nE n\u00e3o \u00e9 necess\u00e1rio instalar o controlador de ingress.<br \/>\nE tamb\u00e9m n\u00e3o \u00e9 preciso configurar o ingress.<\/b><\/p>\n<p>Voc\u00eas entenderam, certo? Para implantar e executar nosso aplicativo no OpenShift, n\u00e3o \u00e9 necess\u00e1rio nada do que foi mencionado acima. E o processo \u00e9 o seguinte.<\/p>\n<h4>Passo 1 \u2013 Inicie seu cluster OpenShift<\/h4>\n<p>\nEstamos usando o Code Ready Containers da Red Hat, que na verdade \u00e9 o mesmo Minikube, mas com um cluster OpenShift de n\u00f3 \u00fanico completo.<\/p>\n<pre><code class=\"plaintext\">crc start\n<\/code><\/pre>\n<p><\/p>\n<h4>Passo 2 \u2013 Realize a constru\u00e7\u00e3o e implanta\u00e7\u00e3o do aplicativo no cluster OpenShift<\/h4>\n<p>\n\u00c9 neste passo que a simplicidade e conveni\u00eancia do OpenShift se manifestam plenamente. Assim como em todas as distribui\u00e7\u00f5es do Kubernetes, temos v\u00e1rias maneiras de iniciar um aplicativo no cluster. E, como no caso do K8S, escolhemos deliberadamente a abordagem mais simples.<\/p>\n<p>O OpenShift sempre foi constru\u00eddo como uma plataforma para criar e executar aplicativos em containers. A constru\u00e7\u00e3o de containers sempre foi uma parte essencial dessa plataforma, portanto, aqui existem muitos recursos adicionais do Kubernetes para as tarefas correspondentes.<\/p>\n<p>Vamos usar o processo Source 2 Image (S2I) do OpenShift, que possui v\u00e1rias maneiras de pegar nosso c\u00f3digo-fonte (c\u00f3digo ou arquivos bin\u00e1rios) e transform\u00e1-lo em uma imagem de cont\u00eainer que pode ser executada em um cluster OpenShift.<\/p>\n<p>Para isso, precisaremos de duas coisas:<\/p>\n<ul>\n<li>Nosso c\u00f3digo-fonte em um reposit\u00f3rio git<\/li>\n<li>A imagem do Builder, a partir da qual a constru\u00e7\u00e3o ser\u00e1 realizada.<\/li>\n<\/ul>\n<p>\nExistem muitas dessas imagens, suportadas tanto pela Red Hat quanto pela comunidade, e usaremos a imagem do OpenJDK, j\u00e1 que estou construindo um aplicativo Java.<\/p>\n<p>Iniciar a constru\u00e7\u00e3o S2I pode ser feito tanto pela interface gr\u00e1fica do OpenShift Developer quanto pela linha de comando. Usaremos o comando new-app, especificando de onde pegar a imagem do builder e nosso c\u00f3digo-fonte.<\/p>\n<p><img decoding=\"async\" alt=\"Desculpe, OpenShift, n\u00e3o te valorizamos o suficiente e tomamos voc\u00ea como certo.\" 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>\nPronto, nosso aplicativo est\u00e1 criado. Nesse processo, o S2I executou as seguintes tarefas:<\/p>\n<ul>\n<li>Criou um pod de build auxiliar para todas as tarefas relacionadas \u00e0 constru\u00e7\u00e3o do aplicativo.<\/li>\n<li>Criou a configura\u00e7\u00e3o de Build do OpenShift.<\/li>\n<li>Baixou a imagem do builder para o registro docker interno do OpenShift.<\/li>\n<li>Clonou 'Hello World' no reposit\u00f3rio local.<\/li>\n<li>Vi um que havia um maven pom, ent\u00e3o compilei o aplicativo usando maven.<\/li>\n<li>Criei uma nova imagem de cont\u00eainer contendo o aplicativo Java compilado e armazenei esta imagem no registro de cont\u00eaineres interno.<\/li>\n<li>Criei um Deployment do Kubernetes com as especifica\u00e7\u00f5es do pod, servi\u00e7o, etc.<\/li>\n<li>Iniciei o deploy da imagem do cont\u00eainer.<\/li>\n<li>Removi o pod de build tempor\u00e1rio.<\/li>\n<\/ul>\n<p>\nEsta lista tem muitas informa\u00e7\u00f5es, mas o principal \u00e9 que toda a constru\u00e7\u00e3o ocorre exclusivamente dentro do OpenShift, o registro Docker interno est\u00e1 dentro do OpenShift, e o processo de constru\u00e7\u00e3o cria todos os componentes do Kubernetes e os inicia no cluster.<\/p>\n<p>Se voc\u00ea acompanhar visualmente a execu\u00e7\u00e3o do S2I no console, poder\u00e1 ver como o pod de build \u00e9 iniciado durante a constru\u00e7\u00e3o.<\/p>\n<p><img decoding=\"async\" alt=\"Desculpe, OpenShift, n\u00e3o te valorizamos o suficiente e tomamos voc\u00ea como certo.\" src=\"\/wp-content\/uploads\/2020\/10\/bd69c6e27813b1211a11e522f28f45b7.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Agora vamos olhar os logs do pod builder: primeiro, \u00e9 poss\u00edvel ver como o maven faz seu trabalho e baixa as depend\u00eancias para construir nosso aplicativo java.<\/p>\n<p><img decoding=\"async\" alt=\"Desculpe, OpenShift, n\u00e3o te valorizamos o suficiente e tomamos voc\u00ea como certo.\" src=\"\/wp-content\/uploads\/2020\/10\/326192f9f9373e451d601b77052d67d1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Depois que a constru\u00e7\u00e3o do maven \u00e9 conclu\u00edda, a constru\u00e7\u00e3o da imagem do cont\u00eainer \u00e9 iniciada, e ent\u00e3o essa imagem constru\u00edda \u00e9 enviada para o reposit\u00f3rio interno.<\/p>\n<p><img decoding=\"async\" alt=\"Desculpe, OpenShift, n\u00e3o te valorizamos o suficiente e tomamos voc\u00ea como certo.\" src=\"\/wp-content\/uploads\/2020\/10\/c97da4c17a8e275d39104126d0f87048.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Tudo pronto, o processo de constru\u00e7\u00e3o foi conclu\u00eddo. Agora vamos garantir que os pods e servi\u00e7os do nosso aplicativo foram iniciados no cluster.<\/p>\n<pre><code class=\"plaintext\">oc get service\n<\/code><\/pre>\n<p><img decoding=\"async\" alt=\"Desculpe, OpenShift, n\u00e3o te valorizamos o suficiente e tomamos voc\u00ea como certo.\" src=\"\/wp-content\/uploads\/2020\/10\/f16a098a096128073f305e0444061417.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>E \u00e9 isso. E tudo com um \u00fanico comando. Agora, s\u00f3 precisamos expor este servi\u00e7o para acesso externo.<\/p>\n<h4>Passo 3 \u2013 Expondo o servi\u00e7o para acesso externo<\/h4>\n<p>\nAssim como no caso do KUK, na plataforma OpenShift, nosso 'Hello World' tamb\u00e9m precisa de um roteador para direcionar o tr\u00e1fego externo ao servi\u00e7o dentro do cluster. No OpenShift, isso \u00e9 feito de forma muito simples. Primeiro, h\u00e1 um componente de roteamento HAProxy instalado por padr\u00e3o no cluster (que pode ser trocado pelo mesmo NGINX). Em segundo lugar, existem recursos especiais e altamente configur\u00e1veis que se chamam Routes e lembram objetos Ingress no bom e velho Kubernetes (na verdade, os Routes do OpenShift influenciaram bastante o design dos objetos Ingress, que agora tamb\u00e9m podem ser usados no OpenShift), mas para o nosso 'Hello World', assim como na maioria dos outros casos, um Route padr\u00e3o sem configura\u00e7\u00e3o adicional ser\u00e1 suficiente.<\/p>\n<p>Para criar um FQDN rote\u00e1vel para 'Hello World' (sim, no OpenShift h\u00e1 um DNS pr\u00f3prio para roteamento por nomes de servi\u00e7os), basta executar o expose para o nosso servi\u00e7o:<\/p>\n<p><img decoding=\"async\" alt=\"Desculpe, OpenShift, n\u00e3o te valorizamos o suficiente e tomamos voc\u00ea como certo.\" 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>\nSe voc\u00ea olhar o Route rec\u00e9m-criado, poder\u00e1 encontrar o FQDN e outras informa\u00e7\u00f5es sobre roteamento:<\/p>\n<pre><code class=\"plaintext\">oc get route\n<\/code><\/pre>\n<p><img decoding=\"async\" alt=\"Desculpe, OpenShift, n\u00e3o te valorizamos o suficiente e tomamos voc\u00ea como certo.\" src=\"\/wp-content\/uploads\/2020\/10\/dc59c36166605ef0a5a24b2b7ffa65b6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>E finalmente, acessamos nosso servi\u00e7o a partir do navegador:<\/p>\n<p><img decoding=\"async\" alt=\"Desculpe, OpenShift, n\u00e3o te valorizamos o suficiente e tomamos voc\u00ea como certo.\" src=\"\/wp-content\/uploads\/2020\/10\/fccf6cae1746fa59df2ff8ffb6973666.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Agora sim, isso foi realmente f\u00e1cil!<\/h3>\n<p>\nN\u00f3s amamos Kubernetes e tudo o que essa tecnologia permite, assim como amamos a simplicidade e a facilidade. Kubernetes foi criado para simplificar incrivelmente a opera\u00e7\u00e3o de cont\u00eaineres escal\u00e1veis e distribu\u00eddos, mas, para trazer aplicativos online, essa simplicidade j\u00e1 n\u00e3o \u00e9 suficiente hoje. \u00c9 aqui que entra o OpenShift, que est\u00e1 em sintonia com os tempos e oferece um Kubernetes orientado principalmente para o desenvolvedor. Muitos esfor\u00e7os foram investidos para moldar a plataforma OpenShift especificamente para desenvolvedores, incluindo a cria\u00e7\u00e3o de ferramentas como S2I, ODI, Developer Portal, OpenShift Operator Framework, integra\u00e7\u00e3o com IDEs, Cat\u00e1logos de Desenvolvedores, integra\u00e7\u00e3o com Helm, monitoramento e muitos outros.<\/p>\n<p>Esperamos que este artigo tenha sido interessante e \u00fatil para voc\u00ea. Recursos adicionais, materiais e outras coisas \u00fateis para o desenvolvimento na plataforma OpenShift podem ser encontrados no portal <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/\">Red Hat Developers<\/a><\/noindex>.<br \/>\n<br \/>Fonte: <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.3 - 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\/pt\/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.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\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\/pt\/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\udd47Desculpe, OpenShift, n\u00e3o valorizamos voc\u00ea o suficiente e tomamos como garantido | ProHoster","description":"Este post foi escrito porque nossos colaboradores tiveram muitas conversas com clientes sobre o desenvolvimento de aplica\u00e7\u00f5es no Kubernetes e as especificidades desse tipo de desenvolvimento no OpenShift.","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/prosti-openshift-my-nedostatochno-czenili-tebya-i-prinimali-kak-dolzhnoe","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","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\/pt\/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\/pt\/wp-json\/wp\/v2\/posts\/97254","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=97254"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/97254\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/97255"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=97254"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=97254"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=97254"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}