{"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 scritto perch\u00e9 i nostri collaboratori hanno avuto molte conversazioni con i clienti sullo sviluppo di applicazioni su Kubernetes e sulle specificit\u00e0 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 la tesi 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 pubblico specifico. Da l\u00ec, la conversazione si sposta su un confronto tra i punti di forza e di debolezza delle diverse piattaforme.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nIn generale, volevamo scrivere questo post con la conclusione del tipo \u00abAscoltate, non importa dove eseguire il codice, su OpenShift o su AKS, su EKS, su qualche Kubernetes personalizzato, s\u00ec, su qualsiasi Kubernetes <i>(per brevit\u00e0 lo chiameremo KUK)<\/i> \u2013 \u00e8 davvero semplice, sia l\u00ec che l\u00e0\u00bb.<\/p>\n<p>Poi avevamo pianificato di prendere il semplice \u00abHello World\u00bb e con il suo esempio mostrare cosa hanno in comune e quali sono le differenze tra KUK e Red Hat OpenShift Container Platform (d'ora in poi, OCP o semplicemente OpenShift).<\/p>\n<p>Tuttavia, durante la scrittura di questo post, ci siamo resi conto che ci siamo abituati talmente tanto a utilizzare OpenShift che non ci rendiamo conto di come sia cresciuto e si sia trasformato in una piattaforma straordinaria, diventando molto pi\u00f9 di un semplice distributore di Kubernetes. Abbiamo dato per scontata la maturit\u00e0 e la semplicit\u00e0 di OpenShift, trascurando la sua grandezza.<\/p>\n<p>In generale, \u00e8 giunto il momento di un sincero ravvedimento, e ora confronteremo passo passo l'implementazione del nostro \u00abHello World\u00bb su KUK e su OpenShift, e lo faremo nel modo pi\u00f9 oggettivo possibile (tranne per il fatto di mostrare talvolta un'opinione personale sull'argomento). Se siete interessati a un'opinione puramente soggettiva su questo argomento, 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 atteneremo ai fatti e solo ai fatti.<\/p>\n<h3>Cluster<\/h3>\n<p>\nQuindi, per il nostro \u00abHello World\u00bb abbiamo bisogno di cluster. Diremo subito \u00abno\u00bb a qualsiasi cloud pubblico, per non pagare server, registry, rete, trasferimenti di dati, ecc. Pertanto, scegliamo un semplice cluster a nodo 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). Entrambe queste opzioni sono davvero semplici da installare, ma richiederanno abbastanza risorse sul vostro 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>\nBene, iniziamo.<\/p>\n<h4>Passo 1 \u2013 costruiamo la nostra immagine del contenitore<\/h4>\n<p>\nIniziamo con il distribuire il nostro \u00abHello World\u00bb su minikube. Per questo 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 a meno di questo).<\/li>\n<li>4. Il sorgente vero e proprio, ovvero una copia 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 preoccupatevi se non avete mai lavorato con il sito Quarkus.io: \u00e8 facile. Basta scegliere i componenti che si desidera utilizzare nel progetto (RestEasy, Hibernate, Amazon SQS, Camel, ecc.), e poi Quarkus configurer\u00e0 da solo, senza alcun vostro intervento, l\u2019archetipo Maven e pubblicher\u00e0 tutto su GitHub. In altre parole, basta un clic del mouse, ed \u00e8 fatto. Questo \u00e8 ci\u00f2 che amiamo di 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 'Hello World' in un'immagine container \u00e8 utilizzare le estensioni quarkus-maven per Docker, che faranno tutto il lavoro necessario. Con l'arrivo di Quarkus, questo \u00e8 diventato davvero facile e semplice: aggiungete l'estensione container-image-docker e potrete creare le immagini con 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 utilizzando Maven. Di conseguenza, il nostro codice sorgente si trasforma in un'immagine container gi\u00e0 pronta, che pu\u00f2 essere eseguita nell'ambiente di esecuzione del 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>\nEcco, quindi, tutto. Ora potete avviare il container con il comando docker run, mappando il nostro servizio sulla porta 8080, in modo che possa essere raggiunto.<\/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 funzioni:<\/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, ed \u00e8 stato davvero facile e semplice.<\/p>\n<h4>Passo 2 \u2013 inviamo il nostro container al repository di immagini container<\/h4>\n<p>\nFinora, l\u2019immagine che abbiamo creato \u00e8 memorizzata localmente, nel nostro archivio container locale. Se vogliamo utilizzare quest\u2019immagine nel nostro ambiente Kubernetes, dobbiamo conservarla in un altro repository. In Kubernetes non ci sono queste funzioni, quindi utilizzeremo Docker Hub. Perch\u00e9, prima di tutto, \u00e8 gratuito, e in secondo luogo, (quasi) tutti lo fanno.<\/p>\n<p>\u00c8 anche molto semplice, ed \u00e8 necessario solo avere un account su Docker Hub.<\/p>\n<p>Quindi, facciamo il login su Docker Hub e inviamo 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 assemblare la configurazione Kubernetes per eseguire il nostro 'Hello World', ma useremo il metodo pi\u00f9 semplice, proprio perch\u00e9 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>Passaggio 4 \u2013 distribuiamo la nostra immagine del contenitore<\/h4>\n<p>\nOra dobbiamo convertire il nostro codice e l'immagine del contenitore nelle configurazioni di kubernetes. In altre parole, abbiamo bisogno di una definizione di pod e deployment che faccia riferimento alla nostra immagine del contenitore su dockerhub. 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 al nostro K8S di creare una configurazione di deployment che deve contenere la specifica del pod per la nostra immagine del contenitore. Questo comando applicher\u00e0 anche questa configurazione al nostro cluster minikube, e creer\u00e0 un deployment che scaricher\u00e0 la nostra immagine del contenitore e avvier\u00e0 un pod nel cluster.<\/p>\n<h4>Passaggio 5 \u2013 apriamo l'accesso al nostro servizio<\/h4>\n<p>\nOra che abbiamo l'immagine del contenitore distribuita, \u00e8 tempo di pensare a come configurare l'accesso esterno a questo servizio Restful, che \u00e8 effettivamente 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 e endpoints. Infatti, questo \u00e8 esattamente ci\u00f2 che faremo eseguendo il comando expose per il nostro oggetto di 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, dobbiamo assicurarci, tra le altre cose, che dall'esterno sia possibile connettersi al servizio hello-quarkus, che si trova all'interno della nostra rete programmaticamente definita. E il parametro <b>type<\/b> ci consente di creare e collegare elementi come bilanciatori di carico, per instradare il traffico in questa rete.<\/p>\n<p>Ad esempio, specificando <b>type=LoadBalancer<\/b>, iniziamo automaticamente un bilanciatore di carico nel cloud pubblico, per connetterci al nostro cluster Kubernetes. Questo, ovviamente, \u00e8 fantastico, ma bisogna capire che questa configurazione sar\u00e0 fortemente legata a un cloud pubblico specifico e sar\u00e0 pi\u00f9 difficile trasferirla tra gli istanze Kubernetes in ambienti diversi.<\/p>\n<p>Nel nostro esempio <b>type=NodePort<\/b>, cio\u00e8 il riferimento 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 una serie di passaggi aggiuntivi. Innanzitutto, \u00e8 necessario un proprio bilanciatore di carico, quindi implementeremo nel nostro cluster il bilanciatore di carico NGINX.<\/p>\n<h4>Passo 6 \u2013 installiamo il bilanciatore di carico<\/h4>\n<p>\nMinikube ha una serie di funzionalit\u00e0 di piattaforma che semplificano la creazione dei componenti necessari per l'accesso esterno, come i controller ingress. Minikube viene fornito con il controller ingress Nginx, e non ci resta che abilitarlo e configurarlo.<\/p>\n<pre><code class=\"plaintext\">minikube addons enable ingress\n<\/code><\/pre>\n<p>\nOra, con un solo comando, creer\u00f2 il controller ingress Nginx, che funzioner\u00e0 all'interno del nostro cluster minikube:<\/p>\n<pre><code class=\"plaintext\">ingress-nginx-controller-69ccf5d9d8-j5gs9 1\/1 In esecuzione 1 33m\n<\/code><\/pre>\n<p><\/p>\n<h4>Passo 7 \u2013 Configuriamo l'ingress<\/h4>\n<p>\nOra dobbiamo configurare il controller ingress Nginx affinch\u00e9 elabori le richieste 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 bilanciatore di carico NGINX.<\/p>\n<pre><code class=\"plaintext\">192.168.99.100 hello-quarkus.info\n<\/code><\/pre>\n<p>\nOra, il nostro servizio minikube \u00e8 accessibile dall'esterno tramite il controller ingress 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 non tanto?<\/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>Avvio 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 cluster OpenShift a nodo singolo sotto forma di Code Ready Containers (CRC). In precedenza era chiamato minishift e si basava sul progetto OpenShift Origin, ora \u00e8 CRC ed \u00e8 costruito sulla piattaforma OpenShift Container di Red Hat.<\/p>\n<p>Qui, scusate, non possiamo esprimerci senza dire: \u00abOpenShift \u00e8 fantastico!\u00bb<\/p>\n<p>Inizialmente pensavamo di scrivere che lo sviluppo su OpenShift non differisce dallo sviluppo su Kubernetes. E in effetti \u00e8 cos\u00ec. Ma mentre scrivevamo questo post, ci siamo ricordati di quanti ulteriori passaggi si devono compiere quando non si utilizza OpenShift, e per questo, ripetiamo, \u00e8 fantastico. Ci piace quando tutto \u00e8 fatto facilmente, e il modo in cui il nostro esempio si distribuisce e si avvia su OpenShift, rispetto a minikube, ci ha spinto a scrivere questo post.<\/p>\n<p>Facciamo un rapido riepilogo del processo e vediamo cosa sar\u00e0 necessario fare.<\/p>\n<p>Quindi, nell'esempio con minikube, abbiamo iniziato con Docker... Aspetta, non abbiamo pi\u00f9 bisogno che Docker sia installato sulla macchina.<\/p>\n<p><b>E non abbiamo bisogno di git locale.<br \/>\nE nemmeno di Maven.<br \/>\nE non \u00e8 necessario creare manualmente un'immagine del contenitore.<br \/>\nE non \u00e8 necessario cercare un repository di immagini dei contenitori.<br \/>\nE non \u00e8 necessario installare un ingress-controller.<br \/>\nE non \u00e8 necessario configurare l'ingress.<\/b><\/p>\n<p>Hai capito, giusto? Per distribuire e avviare la nostra applicazione su OpenShift, non \u00e8 necessario nulla di quanto elencato sopra. E il processo avviene 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 essenzialmente lo stesso di Minikube, ma con un cluster OpenShift a nodi singoli completamente funzionale.<\/p>\n<pre><code class=\"plaintext\">crc start\n<\/code><\/pre>\n<p><\/p>\n<h4>Passo 2 \u2013 Costruiamo e distribuiamo l'applicazione nel cluster OpenShift<\/h4>\n<p>\n\u00c8 proprio in questo passo 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 molte opzioni per avviare un'applicazione nel cluster. E, come nel caso di KUK, scegliamo deliberatamente il modo pi\u00f9 semplice.<\/p>\n<p>OpenShift \u00e8 sempre stato progettato come una piattaforma per creare ed eseguire applicazioni contenitore. La creazione di contenitori \u00e8 sempre stata una parte integrante di questa piattaforma, quindi ci sono molti risorse Kubernetes aggiuntive per i compiti correlati.<\/p>\n<p>Utilizzeremo il processo Source 2 Image (S2I) di OpenShift, che presenta diversi modi per prendere la nostra sorgente (codice o file binari) e trasformarla in un'immagine del contenitore, eseguibile nel cluster OpenShift.<\/p>\n<p>A tal fine, avremo bisogno di due cose:<\/p>\n<ul>\n<li>Il nostro codice sorgente nel repository git<\/li>\n<li>Un'immagine builder, sulla base della quale verr\u00e0 eseguita la creazione.<\/li>\n<\/ul>\n<p>\nEsistono molte di queste immagini, supportate sia da Red Hat sia a livello di comunit\u00e0, e utilizzeremo l'immagine OpenJDK, poich\u00e9 sto creando un'applicazione Java.<\/p>\n<p>Possiamo avviare la costruzione S2I sia dalla console grafica di OpenShift Developer sia dalla riga di comando. Utilizzeremo il comando new-app, specificando 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>\nTutto, la nostra applicazione \u00e8 stata creata. Durante questo processo, S2I ha eseguito le seguenti operazioni:<\/p>\n<ul>\n<li>Ha creato un pod di build per varie operazioni legate alla creazione dell'applicazione.<\/li>\n<li>Ha creato la configurazione OpenShift Build.<\/li>\n<li>Ha scaricato l'immagine builder nel registro docker interno di OpenShift.<\/li>\n<li>Ha clonato \"Hello World\" nel repository locale.<\/li>\n<li>Ho visto che c'era un maven pom, quindi ho compilato l'applicazione usando maven.<\/li>\n<li>Ho creato una nuova immagine del container contenente l'applicazione Java compilata e ho posizionato quest'immagine nel registro dei container interno.<\/li>\n<li>Ho creato un Deployment Kubernetes con specifiche per il pod, il servizio, ecc.<\/li>\n<li>Ho avviato il deploy dell'immagine del container.<\/li>\n<li>Ho eliminato il build-pod di servizio.<\/li>\n<\/ul>\n<p>\nIn questo elenco ci sono molte cose, ma la cosa principale \u00e8 che tutta la 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 avvia nel cluster.<\/p>\n<p>Se si tiene traccia visivamente dell'avvio di S2I nella console, si pu\u00f2 vedere come, durante la compilazione, si avvia il build pod.<\/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 builder pod: innanzitutto, si pu\u00f2 vedere come maven svolge il suo lavoro e scarica le dipendenze per costruire la 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 compilazione maven \u00e8 terminata, viene avviata la costruzione dell'immagine del container e poi quest'immagine costruita viene inviata nel 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>Tutto, il processo di costruzione \u00e8 completato. Ora assicuriamoci che i pod e i servizi della nostra applicazione siano stati 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. Solo un comando. Non ci resta che esporre questo servizio per l'accesso esterno.<\/p>\n<h4>Passaggio 3 \u2013 esponiamo il servizio per l'accesso esterno<\/h4>\n<p>\nCome nel caso di KUK, sulla piattaforma OpenShift anche il nostro 'Hello World' ha bisogno di un router per indirizzare il traffico esterno verso il servizio all'interno del cluster. In OpenShift \u00e8 molto semplice. In primo luogo, nel cluster \u00e8 installato per impostazione predefinita un componente di instradamento HAProxy (pu\u00f2 essere sostituito dallo stesso NGINX). In secondo luogo, ci sono risorse speciali e altamente configurabili chiamate Routes che somigliano agli oggetti Ingress nel vecchio e caro Kubernetes (in realt\u00e0, le Routes di OpenShift hanno avuto un forte impatto sul design degli oggetti Ingress, che ora possono essere utilizzati anche in OpenShift), ma per il nostro 'Hello World', e infatti nella maggior parte dei casi, ci baster\u00e0 la Route standard senza configurazioni aggiuntive.<\/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 un 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 si guarda la Route appena creata, si pu\u00f2 trovare l'FQDN e altre informazioni di 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>E adesso \u00e8 stato davvero facile!<\/h3>\n<p>\nAmiamo Kubernetes e tutto ci\u00f2 che questa tecnologia permette di fare, cos\u00ec come amiamo la semplicit\u00e0 e la leggerezza. Kubernetes \u00e8 stato creato per semplificare enormemente l'operativit\u00e0 di container distribuiti e scalabili, ma per il deploy delle applicazioni, oggi la sua semplicit\u00e0 non \u00e8 pi\u00f9 sufficiente. Ed \u00e8 qui che entra in gioco OpenShift, che tiene il passo con i tempi e offre un Kubernetes progettato principalmente per gli sviluppatori. \u00c8 stato dedicato un enorme sforzo per adattare la piattaforma OpenShift agli sviluppatori, compresa la creazione di strumenti come S2I, ODI, Developer Portal, OpenShift Operator Framework, integrazione con IDE, Developer Catalogues, integrazione con Helm, monitoraggio e molti altri.<\/p>\n<p>Speriamo che questo articolo sia stato interessante e utile per voi. Ulteriori risorse, materiali e altre cose utili per lo sviluppo sulla piattaforma OpenShift possono essere trovate sul 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.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\/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.1.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\udd47Scusaci, OpenShift, non ti abbiamo apprezzato abbastanza e ti abbiamo dato per scontato | ProHoster","description":"Questo post \u00e8 scritto perch\u00e9 i nostri collaboratori hanno avuto molte conversazioni con i clienti sullo sviluppo di applicazioni su Kubernetes e sulle specificit\u00e0 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}]}}