{"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\/it\/blog\/administrirovanie\/prosti-openshift-my-nedostatochno-czenili-tebya-i-prinimali-kak-dolzhnoe","title":{"rendered":"Mi dispiace, OpenShift, non ti abbiamo apprezzato abbastanza e ti abbiamo dato per scontato.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Questo post \u00e8 stato scritto perch\u00e9 i nostri collaboratori hanno avuto molte conversazioni con i clienti riguardo allo sviluppo di applicazioni su Kubernetes e alle specifiche di tale sviluppo su OpenShift.<\/p>\n<p><img decoding=\"async\" alt=\"Mi dispiace, OpenShift, non ti abbiamo apprezzato abbastanza e ti abbiamo dato per scontato.\" src=\"\/wp-content\/uploads\/2020\/10\/ad447aeb80d3ae56ea4598cd959456de.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDi solito iniziamo con l'affermazione che Kubernetes \u00e8 semplicemente Kubernetes, mentre OpenShift \u00e8 gi\u00e0 una piattaforma Kubernetes, come Microsoft AKS o Amazon EKS. Ognuna di queste piattaforme ha i propri vantaggi, orientati a un diverso pubblico. E da l\u00ec la conversazione si sposta a confrontare i punti di forza e di debolezza delle piattaforme specifiche.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nIn generale, pensavamo di scrivere questo post con una conclusione del tipo \u00abAscoltate, non importa dove eseguire il codice, su OpenShift o su AKS, su EKS, su un Kubernetes personalizzato, insomma su qualsiasi Kubernetes <i>(per brevit\u00e0 lo chiameremo KUK)<\/i> \u2013 \u00e8 davvero semplice, sia da una parte che dall'altra\u00bb.<\/p>\n<p>Poi avevamo in programma di prendere il pi\u00f9 semplice \u00abHello World\u00bb e, utilizzando il suo esempio, mostrare cosa c'\u00e8 di comune e quali sono le differenze tra KUK e Red Hat OpenShift Container Platform (di seguito, OCP o semplicemente OpenShift).<\/p>\n<p>Tuttavia, durante la scrittura di questo post, abbiamo capito che ci siamo abituati cos\u00ec tanto a usare OpenShift che non ci rendiamo nemmeno conto di quanto sia cresciuto e trasformato in una piattaforma sorprendente, diventando molto pi\u00f9 di un semplice distribuzione di Kubernetes. Ci siamo abituati a considerare la maturit\u00e0 e la semplicit\u00e0 di OpenShift come scontate, trascurando la sua magnificenza.<\/p>\n<p>In sintesi, \u00e8 giunto il momento di una risoluzione fattiva, e ora confronteremo passo dopo passo il nostro \u00abHello World\u00bb su KUK e su OpenShift, e lo faremo in modo il pi\u00f9 obiettivo possibile (a parte quando esprimiamo qualche opinione personale sull'argomento). Se siete interessati a un'opinione puramente soggettiva su questo tema, potete leggerla <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/swlh\/im-so-sorry-openshift-i-ve-taken-you-for-granted-f36fb47ea4d9\">qui (EN)<\/a><\/noindex>. In questo post ci atterremo ai fatti e solo ai fatti.<\/p>\n<h3>Cluster<\/h3>\n<p>\nQuindi, per il nostro \u00abHello World\u00bb abbiamo bisogno di cluster. Diciamo subito \u00abno\u00bb a qualsiasi cloud pubblico per non pagare per server, registri, reti, traffico dati, ecc. Pertanto, scegliamo un semplice cluster singolo su <noindex><a rel=\"nofollow\" href=\"https:\/\/minikube.sigs.k8s.io\/docs\/start\/\">Minikube<\/a><\/noindex> (per KUK) e <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/products\/codeready-containers\/overview\">Code Ready Containers<\/a><\/noindex> (per il cluster OpenShift). Entrambi questi metodi sono davvero semplici da installare, ma richiederanno molte risorse sul tuo laptop.<\/p>\n<p><img decoding=\"async\" alt=\"Mi dispiace, OpenShift, non ti abbiamo apprezzato abbastanza e ti abbiamo dato per scontato.\" src=\"\/wp-content\/uploads\/2020\/10\/01c748365253fc9e11e817876629ae7e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Costruzione su KUK<\/h3>\n<p>\nDunque, andiamo.<\/p>\n<h4>Passo 1 \u2013 costruiamo la nostra immagine container<\/h4>\n<p>\nInizier\u00f2 distribuendo il nostro \u00abHello World\u00bb su minikube. Per farlo, avremo bisogno di:<\/p>\n<ol>\n<li>1. Docker installato.<\/li>\n<li>2. Git installato.<\/li>\n<li>3. Maven installato (in realt\u00e0, in questo progetto si utilizza il binario mvnw, quindi si pu\u00f2 fare anche a meno).<\/li>\n<li>4. L'effettivo codice sorgente, cio\u00e8 il clone del repository <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>\nPer prima cosa, dobbiamo creare un progetto Quarkus. Non spaventatevi se non avete mai lavorato con il sito Quarkus.io \u2013 \u00e8 facile. Basta scegliere i componenti che si desidera utilizzare nel progetto (RestEasy, Hibernate, Amazon SQS, Camel, ecc.), e poi Quarkus si occuper\u00e0 da solo di configurare l'archetipo maven e caricare tutto su github. Quindi, letteralmente un clic del mouse \u2013 ed \u00e8 fatto. \u00c8 per questo che amiamo Quarkus.<\/p>\n<p><img decoding=\"async\" alt=\"Mi dispiace, OpenShift, non ti abbiamo apprezzato abbastanza e ti abbiamo dato per scontato.\" src=\"\/wp-content\/uploads\/2020\/10\/39a62058d91f8443e77466d374d02d34.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Il modo pi\u00f9 semplice per costruire il nostro \u00abHello World\u00bb in un'immagine container \u00e8 utilizzare le estensioni quarkus-maven per Docker, che faranno tutto il lavoro necessario. Con l'introduzione di Quarkus, \u00e8 diventato davvero facile e semplice: aggiungete l'estensione container-image-docker e potete creare immagini usando i comandi maven.<\/p>\n<pre><code class=\"plaintext\">.\/mvnw quarkus:add-extension -Dextensions=\"container-image-docker\"\n<\/code><\/pre>\n<p>\nE infine, eseguiamo la costruzione della nostra immagine usando Maven. In questo modo il nostro codice sorgente si trasformer\u00e0 in un'immagine container pronta, che pu\u00f2 gi\u00e0 essere eseguita in un ambiente di esecuzione di container.<\/p>\n<p><img decoding=\"async\" alt=\"Mi dispiace, OpenShift, non ti abbiamo apprezzato abbastanza e ti abbiamo dato per scontato.\" 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>\nQuesto \u00e8 tutto, ora possiamo avviare il container con il comando docker run, mappando il nostro servizio sulla porta 8080, in modo da poterci accedere.<\/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=\"Mi dispiace, OpenShift, non ti abbiamo apprezzato abbastanza e ti abbiamo dato per scontato.\" src=\"\/wp-content\/uploads\/2020\/10\/4f46e13423d5027d85ebae2c98c926b8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Dopo che l'istanza del container \u00e8 stata avviata, resta solo da controllare con il comando curl che il nostro servizio funziona:<\/p>\n<p><img decoding=\"async\" alt=\"Mi dispiace, OpenShift, non ti abbiamo apprezzato abbastanza e ti abbiamo dato per scontato.\" src=\"\/wp-content\/uploads\/2020\/10\/1c1462f52d6a487863c21f8f72a09d1f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Quindi, tutto funziona e \u00e8 stata davvero facile e semplice.<\/p>\n<h4>Passo 2 \u2013 inviamo il nostro container al repository delle immagini di container<\/h4>\n<p>\nFino ad ora, l'immagine che abbiamo creato viene conservata localmente, nel nostro repository di container locale. Se vogliamo utilizzare questa immagine nel nostro ambiente KUK, dobbiamo caricarla in un altro repository. In Kubernetes non ci sono tali funzioni, quindi utilizzeremo dockerhub. Perch\u00e9, primo, \u00e8 gratuito, e secondo, (quasi) tutti lo fanno.<\/p>\n<p>Anche questo \u00e8 molto semplice, serve solo un account su dockerhub.<\/p>\n<p>Quindi, ci registriamo su dockerhub e carichiamo l\u00ec la nostra immagine.<\/p>\n<p><img decoding=\"async\" alt=\"Mi dispiace, OpenShift, non ti abbiamo apprezzato abbastanza e ti abbiamo dato per scontato.\" src=\"\/wp-content\/uploads\/2020\/10\/fb5d81ee15ca7594277c5a05da298fbd.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h4>Passo 3 \u2013 avviamo Kubernetes<\/h4>\n<p>\nCi sono molti modi per costruire la configurazione di kubernetes per eseguire il nostro \u00abHello World\u00bb, ma useremo il pi\u00f9 semplice di tutti, dato che siamo cos\u00ec...<\/p>\n<p>Per prima cosa avviamo il cluster minikube:<\/p>\n<pre><code class=\"plaintext\">minikube start\n<\/code><\/pre>\n<p><\/p>\n<h4>Passo 4 \u2013 distribuiamo la nostra immagine container<\/h4>\n<p>\nOra dobbiamo convertire il nostro codice e l'immagine del container nelle configurazioni di Kubernetes. In altre parole, abbiamo bisogno di una definizione per il pod e il deployment che faccia riferimento alla nostra immagine del container su Docker Hub. Uno dei modi pi\u00f9 semplici per farlo \u00e8 eseguire il comando create deployment, specificando la nostra immagine:<\/p>\n<p><img decoding=\"async\" alt=\"Mi dispiace, OpenShift, non ti abbiamo apprezzato abbastanza e ti abbiamo dato per scontato.\" 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>\nCon questo comando abbiamo detto a Kubernetes di creare una configurazione di deployment, che dovrebbe contenere la specifica del pod per la nostra immagine del container. Questo comando applicher\u00e0 anche questa configurazione al nostro cluster minikube e creer\u00e0 un deployment che scaricher\u00e0 la nostra immagine del container e avvier\u00e0 un pod nel cluster.<\/p>\n<h4>Passo 5 \u2013 apriamo l'accesso al nostro servizio<\/h4>\n<p>\nOra che abbiamo il nostro container distribuito, \u00e8 tempo di pensare a come configurare l'accesso esterno a questo servizio RESTful, che in effetti \u00e8 programmato nel nostro codice.<\/p>\n<p>Ci sono molti modi per farlo. Ad esempio, possiamo utilizzare il comando expose per creare automaticamente i componenti Kubernetes corrispondenti, come services ed endpoints. Infatti, \u00e8 esattamente ci\u00f2 che faremo, eseguendo il comando expose per il nostro oggetto deployment:<\/p>\n<pre><code class=\"plaintext\">kubectl expose deployment hello-quarkus --type=NodePort --port=8080\n<\/code><\/pre>\n<p>\nFermiamoci un attimo sull'opzione \"--type\" del comando expose.<\/p>\n<p>Quando facciamo expose e creiamo i componenti necessari per eseguire il nostro servizio, abbiamo bisogno che dall'esterno sia possibile connettersi al servizio hello-quarkus, che si trova all'interno della nostra rete programmabile. E il parametro <b>type<\/b> ci permette di creare e connettere elementi come i load balancer, per instradare il traffico a questa rete.<\/p>\n<p>Ad esempio, specificando <b>--type=LoadBalancer<\/b>, inizializziamo automaticamente un load balancer nel cloud pubblico per connetterci al nostro cluster Kubernetes. Questo \u00e8 ovviamente fantastico, ma dobbiamo capire che tale configurazione sar\u00e0 legata a un cloud pubblico specifico e sar\u00e0 pi\u00f9 difficile da trasferire tra istanze Kubernetes in ambienti diversi.<\/p>\n<p>Nel nostro esempio <b>--type=NodePort<\/b>, cio\u00e8 l'accesso al nostro servizio avviene tramite l'indirizzo IP del nodo e il numero di porta. Questa opzione consente di non utilizzare alcun cloud pubblico, ma richiede alcuni passaggi aggiuntivi. In primo luogo, abbiamo bisogno di un proprio load balancer, quindi installeremo un load balancer NGINX nel nostro cluster.<\/p>\n<h4>Passo 6 \u2013 installiamo il load balancer<\/h4>\n<p>\nMinikube ha diverse funzioni di piattaforma che semplificano la creazione dei componenti necessari per l'accesso esterno, come gli ingress controller. Minikube include un ingress controller NGINX, e ci rimane solo da attivarlo e configurarlo.<\/p>\n<pre><code class=\"plaintext\">minikube addons enable ingress\n<\/code><\/pre>\n<p>\nOra, con un solo comando, creiamo l'ingress controller NGINX che funzioner\u00e0 all'interno del nostro cluster 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>Passo 7 \u2013 configuriamo l'ingress<\/h4>\n<p>\nOra dobbiamo configurare l'ingress controller NGINX affinch\u00e9 gestisca le richieste di hello-quarkus.<\/p>\n<p><img decoding=\"async\" alt=\"Mi dispiace, OpenShift, non ti abbiamo apprezzato abbastanza e ti abbiamo dato per scontato.\" src=\"\/wp-content\/uploads\/2020\/10\/18183cb985436447cf15c501e4c6c3a3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><img decoding=\"async\" alt=\"Mi dispiace, OpenShift, non ti abbiamo apprezzato abbastanza e ti abbiamo dato per scontato.\" src=\"\/wp-content\/uploads\/2020\/10\/577f1e6218094b5ee23052d49869e838.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>E infine, dobbiamo applicare questa configurazione.<\/p>\n<p><img decoding=\"async\" alt=\"Mi dispiace, OpenShift, non ti abbiamo apprezzato abbastanza e ti abbiamo dato per scontato.\" 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=\"Mi dispiace, OpenShift, non ti abbiamo apprezzato abbastanza e ti abbiamo dato per scontato.\" src=\"\/wp-content\/uploads\/2020\/10\/68fba4ef3d2762a97dc5be5de9e6b864.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Poich\u00e9 stiamo facendo tutto questo sul nostro computer, aggiungiamo semplicemente l'indirizzo IP del nostro nodo nel file \/etc\/hosts, per indirizzare le richieste http al nostro minikube sul load balancer NGINX.<\/p>\n<pre><code class=\"plaintext\">192.168.99.100 hello-quarkus.info\n<\/code><\/pre>\n<p>\nEcco fatto, ora il nostro servizio minikube \u00e8 accessibile dall'esterno attraverso l'ingress controller NGINX.<\/p>\n<p><img decoding=\"async\" alt=\"Mi dispiace, OpenShift, non ti abbiamo apprezzato abbastanza e ti abbiamo dato per scontato.\" src=\"\/wp-content\/uploads\/2020\/10\/a456f34d168d43e9236e4769722b7f5d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Bene, \u00e8 stato facile, vero? O no?<\/h3>\n<p><img decoding=\"async\" alt=\"Mi dispiace, OpenShift, non ti abbiamo apprezzato abbastanza e ti abbiamo dato per scontato.\" src=\"\/wp-content\/uploads\/2020\/10\/237015dc06bb9d12eb4cd2944dc6df58.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Esecuzione su OpenShift (Code Ready Containers)<\/h3>\n<p>\nOra vediamo come si fa tutto questo sulla Red Hat OpenShift Container Platform (OCP).<\/p>\n<p>Come nel caso di minikube, scegliamo uno schema con un cluster OpenShift a nodo singolo sotto forma di Code Ready Containers (CRC). In passato si chiamava minishift ed era basato sul progetto OpenShift Origin, ora \u00e8 CRC ed \u00e8 costruito sulla OpenShift Container Platform di Red Hat.<\/p>\n<p>Qui non possiamo trattenere il nostro entusiasmo e dire: \"OpenShift \u00e8 fantastico!\"<\/p>\n<p>Inizialmente pensavamo di scrivere che sviluppare su OpenShift non \u00e8 diverso dallo sviluppare su Kubernetes. E in effetti \u00e8 cos\u00ec. Ma durante la scrittura di questo post ci siamo resi conto di quanti passaggi inutili si devono compiere quando non si ha OpenShift, e quindi, ribadiamo, \u00e8 fantastico. Ci piace quando le cose sono facili, e il modo in cui il nostro esempio viene distribuito e avviato su OpenShift, rispetto a minikube, ci ha spinto a scrivere questo post.<\/p>\n<p>Facciamo una panoramica del processo e vediamo cosa dobbiamo fare.<\/p>\n<p>Quindi, nell'esempio con minikube, iniziavamo con Docker... Aspetta, non abbiamo pi\u00f9 bisogno di avere Docker installato sulla macchina.<\/p>\n<p><b>E non ci serve nemmeno git locale.<br \/>\nE non ci serve Maven.<br \/>\nE non dobbiamo creare manualmente l'immagine del container.<br \/>\nE non dobbiamo cercare alcun repository di immagini del container.<br \/>\nE non dobbiamo installare l'ingress controller.<br \/>\nE non dobbiamo nemmeno configurare l'ingress.<\/b><\/p>\n<p>Hai capito, vero? Per avviare e lanciare la nostra applicazione su OpenShift, non \u00e8 necessario nulla di quanto elencato sopra. E il processo appare come segue.<\/p>\n<h4>Passo 1 \u2013 Avviamo il nostro cluster OpenShift<\/h4>\n<p>\nUtilizziamo Code Ready Containers di Red Hat, che \u00e8 fondamentalmente lo stesso di Minikube, ma con un cluster OpenShift mononodale completo.<\/p>\n<pre><code class=\"plaintext\">crc start\n<\/code><\/pre>\n<p><\/p>\n<h4>Passo 2 \u2013 Eseguiamo la build e il deployment dell'applicazione nel cluster OpenShift<\/h4>\n<p>\n\u00c8 proprio in questo passaggio che la semplicit\u00e0 e la comodit\u00e0 di OpenShift si manifestano in tutto il loro splendore. Come in tutte le distribuzioni di Kubernetes, abbiamo molti modi per avviare un'applicazione nel cluster. E, come nel caso di K8s, scegliamo specificamente il metodo pi\u00f9 semplice.<\/p>\n<p>OpenShift \u00e8 sempre stato concepito come una piattaforma per la creazione e l'esecuzione di applicazioni containerizzate. La creazione dei container \u00e8 sempre stata parte integrante di questa piattaforma, quindi qui ci sono molte risorse Kubernetes aggiuntive per le relative necessit\u00e0.<\/p>\n<p>Utilizzeremo il processo Source 2 Image (S2I) di OpenShift, che ha diversi modi per prendere il nostro sorgente (codice o file binari) e trasformarlo in un'immagine container che pu\u00f2 essere eseguita nel cluster OpenShift.<\/p>\n<p>Per questo avremo bisogno di due cose:<\/p>\n<ul>\n<li>Il nostro codice sorgente in un repository git<\/li>\n<li>Un'immagine builder su cui verr\u00e0 effettuata la build.<\/li>\n<\/ul>\n<p>\nEsistono molte di queste immagini, sostenute sia da Red Hat che dalla comunit\u00e0, e useremo l'immagine OpenJDK visto che sto costruendo un'app Java.<\/p>\n<p>\u00c8 possibile avviare una build S2I sia dalla console grafica di OpenShift Developer che dalla riga di comando. Utilizzeremo il comando new-app, indicandogli da dove prendere l'immagine builder e il nostro codice sorgente.<\/p>\n<p><img decoding=\"async\" alt=\"Mi dispiace, OpenShift, non ti abbiamo apprezzato abbastanza e ti abbiamo dato per scontato.\" 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>\nEcco fatto, la nostra applicazione \u00e8 stata creata. Nel processo S2I sono state eseguite le seguenti operazioni:<\/p>\n<ul>\n<li>\u00c8 stato creato un pod di build temporaneo per gestire le cose legate alla build dell'applicazione.<\/li>\n<li>\u00c8 stata creata una configurazione OpenShift Build.<\/li>\n<li>\u00c8 stata scaricata l'immagine builder nel registro docker interno di OpenShift.<\/li>\n<li>\u00c8 stato clonato 'Hello World' nel repository locale.<\/li>\n<li>Ha visto che c'era un pom di maven, e quindi ha compilato l'applicazione usando maven.<\/li>\n<li>\u00c8 stata creata una nuova immagine container contenente l'app Java compilata, e questa immagine \u00e8 stata depositata nel registro interno dei container.<\/li>\n<li>\u00c8 stata creata una Kubernetes Deployment con le specifiche del pod, del servizio, ecc.<\/li>\n<li>\u00c8 stato avviato il deployment dell'immagine container.<\/li>\n<li>\u00c8 stato rimosso il pod di build temporaneo.<\/li>\n<\/ul>\n<p>\nCi sono molte cose in questo elenco, ma ci\u00f2 che \u00e8 importante \u00e8 che l'intero processo di build avviene esclusivamente all'interno di OpenShift, il registro Docker interno si trova all'interno di OpenShift e il processo di build crea tutti i componenti Kubernetes e li lancia nel cluster.<\/p>\n<p>Se si monitora visivamente l'avvio di S2I nella console, si pu\u00f2 vedere come, durante la build, venga avviato il pod di build.<\/p>\n<p><img decoding=\"async\" alt=\"Mi dispiace, OpenShift, non ti abbiamo apprezzato abbastanza e ti abbiamo dato per scontato.\" src=\"\/wp-content\/uploads\/2020\/10\/bd69c6e27813b1211a11e522f28f45b7.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Ora diamo un'occhiata ai log del pod builder: prima di tutto, si vede come maven svolge il suo lavoro e scarica le dipendenze per la build della nostra applicazione Java.<\/p>\n<p><img decoding=\"async\" alt=\"Mi dispiace, OpenShift, non ti abbiamo apprezzato abbastanza e ti abbiamo dato per scontato.\" src=\"\/wp-content\/uploads\/2020\/10\/326192f9f9373e451d601b77052d67d1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Dopo che la build di maven \u00e8 completata, inizia la costruzione dell'immagine container, e poi questa immagine costruita viene inviata al repository interno.<\/p>\n<p><img decoding=\"async\" alt=\"Mi dispiace, OpenShift, non ti abbiamo apprezzato abbastanza e ti abbiamo dato per scontato.\" src=\"\/wp-content\/uploads\/2020\/10\/c97da4c17a8e275d39104126d0f87048.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Ecco, il processo di build \u00e8 completato. Ora assicuriamoci che i pod e i servizi della nostra applicazione siano avviati nel cluster.<\/p>\n<pre><code class=\"plaintext\">oc get service\n<\/code><\/pre>\n<p><img decoding=\"async\" alt=\"Mi dispiace, OpenShift, non ti abbiamo apprezzato abbastanza e ti abbiamo dato per scontato.\" src=\"\/wp-content\/uploads\/2020\/10\/f16a098a096128073f305e0444061417.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Ecco fatto. E solo un comando. Non ci resta che esporre questo servizio per accedervi dall'esterno.<\/p>\n<h4>Passo 3 \u2013 esponiamo il servizio per accesso esterno<\/h4>\n<p>\nCome nel caso di K8s, anche per il nostro 'Hello World' sulla piattaforma OpenShift \u00e8 necessario un router per indirizzare il traffico esterno al servizio all'interno del cluster. OpenShift lo fa in modo molto semplice. In primo luogo, nel cluster \u00e8 gi\u00e0 presente un componente di routing HAProxy (che pu\u00f2 essere sostituito con NGINX). In secondo luogo, ci sono risorse speciali con ampie possibilit\u00e0 di configurazione chiamate Routes, che ricordano gli oggetti Ingress nel vecchio buono Kubernetes (in effetti, le Route di OpenShift hanno influenzato fortemente il design degli oggetti Ingress che ora possono essere utilizzati anche in OpenShift), ma per il nostro 'Hello World', e per quasi tutti gli altri casi, ci basta la Route standard senza ulteriore configurazione.<\/p>\n<p>Per creare un FQDN instradabile per 'Hello World' (s\u00ec, in OpenShift c'\u00e8 il proprio DNS per l'instradamento tramite i nomi dei servizi), eseguiremo semplicemente l'expose per il nostro servizio:<\/p>\n<p><img decoding=\"async\" alt=\"Mi dispiace, OpenShift, non ti abbiamo apprezzato abbastanza e ti abbiamo dato per scontato.\" 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 guardiamo la Route appena creata, possiamo trovare il FQDN e altre informazioni sull'instradamento:<\/p>\n<pre><code class=\"plaintext\">oc get route\n<\/code><\/pre>\n<p><img decoding=\"async\" alt=\"Mi dispiace, OpenShift, non ti abbiamo apprezzato abbastanza e ti abbiamo dato per scontato.\" src=\"\/wp-content\/uploads\/2020\/10\/dc59c36166605ef0a5a24b2b7ffa65b6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>E infine, accediamo al nostro servizio dal browser:<\/p>\n<p><img decoding=\"async\" alt=\"Mi dispiace, OpenShift, non ti abbiamo apprezzato abbastanza e ti abbiamo dato per scontato.\" src=\"\/wp-content\/uploads\/2020\/10\/fccf6cae1746fa59df2ff8ffb6973666.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Ecco, ora \u00e8 stato davvero facile!<\/h3>\n<p>\nAmiamo Kubernetes e tutto ci\u00f2 che questa tecnologia consente, oltre a noi stessi amiamo la semplicit\u00e0 e la facilit\u00e0. Kubernetes \u00e8 stato creato per semplificare enormemente la gestione di contenitori distribuiti e scalabili, ma la sua semplicit\u00e0 oggi non basta pi\u00f9 per l'implementazione delle applicazioni. Qui entra in gioco OpenShift, che \u00e8 al passo con i tempi e offre un Kubernetes principalmente orientato agli sviluppatori. Sono stati investiti molti sforzi per adattare la piattaforma OpenShift specificamente per gli sviluppatori, inclusa la creazione di strumenti come S2I, ODI, Developer Portal, OpenShift Operator Framework, integrazione con IDE, Cataloghi per Sviluppatori, integrazione con Helm, monitoraggio e molti altri.<\/p>\n<p>Speriamo che questo articolo sia stato interessante e utile per voi. Potete trovare ulteriori risorse, materiali e altre cose utili per lo sviluppo sulla piattaforma OpenShift nel portale <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.0.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\/it\/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.0.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\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\/it\/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\udd47Ci dispiace, OpenShift, non ti abbiamo apprezzato abbastanza e ti abbiamo dato per scontato | ProHoster","description":"Questo post \u00e8 stato scritto perch\u00e9 i nostri collaboratori hanno avuto molte conversazioni con i clienti riguardo allo sviluppo di applicazioni su Kubernetes e alle specifiche di tale sviluppo su OpenShift.","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/prosti-openshift-my-nedostatochno-czenili-tebya-i-prinimali-kak-dolzhnoe","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","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\/it\/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\/it\/wp-json\/wp\/v2\/posts\/97254","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=97254"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/97254\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/97255"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=97254"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=97254"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=97254"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}