{"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\/es\/blog\/administrirovanie\/prosti-openshift-my-nedostatochno-czenili-tebya-i-prinimali-kak-dolzhnoe","title":{"rendered":"Lo siento, OpenShift, no te valoramos lo suficiente y te dimos por hecho","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Esta publicaci\u00f3n se escribe porque nuestros empleados han tenido muchas conversaciones con clientes sobre el desarrollo de aplicaciones en Kubernetes y las particularidades de dicho desarrollo en OpenShift.<\/p>\n<p><img decoding=\"async\" alt=\"Lo siento, OpenShift, no te valoramos lo suficiente y te dimos por hecho\" src=\"\/wp-content\/uploads\/2020\/10\/ad447aeb80d3ae56ea4598cd959456de.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNormalmente comenzamos con la tesis de que Kubernetes es simplemente Kubernetes, mientras que OpenShift es ya una plataforma Kubernetes, como Microsoft AKS o Amazon EKS. Cada una de estas plataformas tiene sus ventajas, orientadas a un p\u00fablico objetivo espec\u00edfico. Despu\u00e9s de esto, la conversaci\u00f3n fluye hacia la comparaci\u00f3n de las fortalezas y debilidades de plataformas concretas.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nEn general, pensamos en escribir esta publicaci\u00f3n con una conclusi\u00f3n como: 'Escuchen, realmente da igual d\u00f3nde ejecutar el c\u00f3digo, en OpenShift, AKS, EKS, en alg\u00fan Kubernetes personalizado, s\u00ed, en cualquier Kubernetes' <i>(para abreviar, llam\u00e9moslo KUK)<\/i> \u2013 es realmente f\u00e1cil, en ambos casos.<\/p>\n<p>Luego planeamos tomar un sencillo 'Hola Mundo' y, a trav\u00e9s de su ejemplo, mostrar qu\u00e9 tienen en com\u00fan y en qu\u00e9 se diferencian KUK y Red Hat OpenShift Container Platform (en adelante, OCP o simplemente OpenShift).<\/p>\n<p>Sin embargo, a medida que escrib\u00edamos esta publicaci\u00f3n, nos dimos cuenta de que nos hemos acostumbrado tanto a usar OpenShift que simplemente no nos damos cuenta de c\u00f3mo ha crecido y se ha convertido en una plataforma impresionante, que es mucho m\u00e1s que un simple distribuidor de Kubernetes. Hemos llegado a considerar la madurez y simplicidad de OpenShift como un hecho, pasando por alto su grandeza.<\/p>\n<p>En general, ha llegado el momento de un arrepentimiento activo, y ahora compararemos paso a paso la implementaci\u00f3n de nuestro 'Hola Mundo' en KUK y en OpenShift, y lo haremos de la manera m\u00e1s objetiva posible (bueno, tal vez alguna vez manifestando nuestra opini\u00f3n personal sobre el tema). Si te interesa una opini\u00f3n puramente subjetiva al respecto, puedes leerla <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/swlh\/im-so-sorry-openshift-i-ve-taken-you-for-granted-f36fb47ea4d9\">aqu\u00ed (EN)<\/a><\/noindex>. En esta publicaci\u00f3n nos ce\u00f1iremos a los hechos y solo a los hechos.<\/p>\n<h3>Cl\u00fasteres<\/h3>\n<p>\nAs\u00ed que, para nuestro 'Hola Mundo' necesitamos cl\u00fasteres. Desde un principio diremos que 'no' a nubes p\u00fablicas, para no tener que pagar por servidores, registros, redes, transferencia de datos, etc. Por lo tanto, optamos por un sencillo cl\u00faster de un solo nodo en <noindex><a rel=\"nofollow\" href=\"https:\/\/minikube.sigs.k8s.io\/docs\/start\/\">Minikube<\/a><\/noindex> (para KUK) y <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/products\/codeready-containers\/overview\">Code Ready Containers<\/a><\/noindex> (para el cl\u00faster OpenShift). Ambas opciones son realmente f\u00e1ciles de instalar, pero requerir\u00e1n bastantes recursos en tu port\u00e1til.<\/p>\n<p><img decoding=\"async\" alt=\"Lo siento, OpenShift, no te valoramos lo suficiente y te dimos por hecho\" src=\"\/wp-content\/uploads\/2020\/10\/01c748365253fc9e11e817876629ae7e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Construcci\u00f3n en KUK<\/h3>\n<p>\nAs\u00ed que, \u00a1empecemos!<\/p>\n<h4>Paso 1 \u2013 construimos nuestra imagen de contenedor<\/h4>\n<p>\nComenzar\u00e9 desplegando nuestro 'Hola Mundo' en minikube. Para esto necesitaremos:<\/p>\n<ol>\n<li>1. Docker instalado.<\/li>\n<li>2. Git instalado.<\/li>\n<li>3. Maven instalado (en este proyecto se utiliza el binario mvnw, por lo que no es necesario).<\/li>\n<li>4. En realidad, el c\u00f3digo fuente, es decir, un clon del repositorio <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>\nPrimero, hay que crear un proyecto Quarkus. No se asusten si nunca han trabajado con el sitio Quarkus.io: es f\u00e1cil. Simplemente eligen los componentes que desean usar en el proyecto (RestEasy, Hibernate, Amazon SQS, Camel, etc.), y luego Quarkus se encarga de configurar autom\u00e1ticamente el arquetipo de Maven y subir todo a GitHub. Es decir, literalmente, un solo clic del mouse y est\u00e1 listo. Por eso amamos Quarkus.<\/p>\n<p><img decoding=\"async\" alt=\"Lo siento, OpenShift, no te valoramos lo suficiente y te dimos por hecho\" src=\"\/wp-content\/uploads\/2020\/10\/39a62058d91f8443e77466d374d02d34.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>La forma m\u00e1s simple de construir nuestro 'Hello World' en una imagen de contenedor es usar la extensi\u00f3n quarkus-maven para Docker, que hace todo el trabajo necesario. Con la llegada de Quarkus, esto se ha vuelto muy f\u00e1cil y sencillo: solo a\u00f1aden la extensi\u00f3n container-image-docker y pueden crear im\u00e1genes con comandos de Maven.<\/p>\n<pre><code class=\"plaintext\">.\/mvnw quarkus:add-extension -Dextensions=\"container-image-docker\"\n<\/code><\/pre>\n<p>\nY, finalmente, construimos nuestra imagen usando Maven. Como resultado, nuestro c\u00f3digo fuente se convierte en una imagen de contenedor lista para ser ejecutada en un entorno de contenedores.<\/p>\n<p><img decoding=\"async\" alt=\"Lo siento, OpenShift, no te valoramos lo suficiente y te dimos por hecho\" 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>\nEso es todo, ahora se puede ejecutar el contenedor con el comando docker run, mapeando nuestro servicio al puerto 8080 para poder acceder a \u00e9l.<\/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=\"Lo siento, OpenShift, no te valoramos lo suficiente y te dimos por hecho\" src=\"\/wp-content\/uploads\/2020\/10\/4f46e13423d5027d85ebae2c98c926b8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Despu\u00e9s de que la instancia del contenedor se haya iniciado, solo queda verificar con el comando curl que nuestro servicio est\u00e9 funcionando:<\/p>\n<p><img decoding=\"async\" alt=\"Lo siento, OpenShift, no te valoramos lo suficiente y te dimos por hecho\" src=\"\/wp-content\/uploads\/2020\/10\/1c1462f52d6a487863c21f8f72a09d1f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>As\u00ed que, todo funciona, y realmente fue f\u00e1cil y sencillo.<\/p>\n<h4>Paso 2 \u2013 enviamos nuestro contenedor al repositorio de im\u00e1genes de contenedores<\/h4>\n<p>\nHasta ahora, la imagen que hemos creado se almacena localmente, en nuestro almacenamiento local de contenedores. Si queremos usar esta imagen en nuestro entorno de Kubernetes, debemos subirla a otro repositorio. Kubernetes no tiene estas funciones, por eso utilizaremos Docker Hub. Porque, en primer lugar, es gratuito, y en segundo lugar, (casi) todos lo hacen.<\/p>\n<p>Esto tambi\u00e9n es muy simple, y solo se necesita tener una cuenta en Docker Hub.<\/p>\n<p>As\u00ed que, subimos a Docker Hub y enviamos nuestra imagen all\u00ed.<\/p>\n<p><img decoding=\"async\" alt=\"Lo siento, OpenShift, no te valoramos lo suficiente y te dimos por hecho\" src=\"\/wp-content\/uploads\/2020\/10\/fb5d81ee15ca7594277c5a05da298fbd.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h4>Paso 3 \u2013 iniciamos Kubernetes<\/h4>\n<p>\nHay muchas formas de construir la configuraci\u00f3n de Kubernetes para ejecutar nuestro 'Hello World', pero usaremos la m\u00e1s simple, ya que as\u00ed somos.<\/p>\n<p>Primero, iniciamos el cl\u00faster minikube:<\/p>\n<pre><code class=\"plaintext\">minikube start\n<\/code><\/pre>\n<p><\/p>\n<h4>Paso 4 \u2013 desplegamos nuestra imagen de contenedor<\/h4>\n<p>\nAhora necesitamos convertir nuestro c\u00f3digo y la imagen del contenedor en configuraciones de Kubernetes. En otras palabras, necesitamos una definici\u00f3n de pod y deployment que apunte a nuestra imagen en Docker Hub. Una de las formas m\u00e1s sencillas de hacerlo es ejecutar el comando create deployment, especificando nuestra imagen:<\/p>\n<p><img decoding=\"async\" alt=\"Lo siento, OpenShift, no te valoramos lo suficiente y te dimos por hecho\" 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 este comando le hemos dicho a Kubernetes que cree una configuraci\u00f3n de deployment, que debe contener la especificaci\u00f3n del pod para nuestra imagen de contenedor. Este comando tambi\u00e9n aplicar\u00e1 esta configuraci\u00f3n a nuestro cl\u00faster minikube y crear\u00e1 un deployment que descargar\u00e1 nuestra imagen de contenedor y ejecutar\u00e1 el pod en el cl\u00faster.<\/p>\n<h4>Paso 5 \u2013 abrimos el acceso a nuestro servicio<\/h4>\n<p>\nAhora que tenemos nuestro contenedor desplegado, es hora de pensar c\u00f3mo configurar el acceso externo a este servicio RESTful, que en realidad est\u00e1 programado en nuestro c\u00f3digo.<\/p>\n<p>Hay muchas maneras de hacerlo. Por ejemplo, podemos usar el comando expose para crear autom\u00e1ticamente los componentes de Kubernetes correspondientes, como services y endpoints. De hecho, as\u00ed lo haremos, ejecutando el comando expose para nuestro objeto de deployment:<\/p>\n<pre><code class=\"plaintext\">kubectl expose deployment hello-quarkus --type=NodePort --port=8080\n<\/code><\/pre>\n<p>\nDeteng\u00e1monos un momento en la opci\u00f3n ' --type' del comando expose.<\/p>\n<p>Cuando hacemos un expose y creamos los componentes necesarios para ejecutar nuestro servicio, entre otras cosas, necesitamos que se pueda conectar externamente al servicio hello-quarkus, que est\u00e1 dentro de nuestra red definida por software. Y el par\u00e1metro <b>tipo<\/b> nos permite crear y conectar elementos como balanceadores de carga para enrutar el tr\u00e1fico a esta red.<\/p>\n<p>Por ejemplo, al especificar <b>type=LoadBalancer<\/b>, autom\u00e1ticamente inicializamos un balanceador de carga en la nube p\u00fablica para conectarnos a nuestro cl\u00faster de Kubernetes. Esto, por supuesto, es fant\u00e1stico, pero hay que entender que tal configuraci\u00f3n estar\u00e1 estrechamente vinculada a una nube p\u00fablica espec\u00edfica y ser\u00e1 m\u00e1s dif\u00edcil de trasladar entre instancias de Kubernetes en diferentes entornos.<\/p>\n<p>En nuestro ejemplo <b>type=NodePort<\/b>, es decir, la conexi\u00f3n a nuestro servicio se realiza a trav\u00e9s de la direcci\u00f3n IP del nodo y el n\u00famero del puerto. Esta opci\u00f3n permite no utilizar ninguna nube p\u00fablica, pero requiere una serie de pasos adicionales. Primero, necesitamos nuestro propio equilibrador de carga, por lo que desplegaremos un equilibrador de carga NGINX en nuestro cl\u00faster.<\/p>\n<h4>Paso 6 \u2013 Instalamos el equilibrador de carga<\/h4>\n<p>\nMinikube tiene una serie de funciones de plataforma que facilitan la creaci\u00f3n de los componentes necesarios para el acceso externo, como los controladores de ingreso. Minikube viene con un controlador de ingreso Nginx, y solo necesitamos activarlo y configurarlo.<\/p>\n<pre><code class=\"plaintext\">minikube addons enable ingress\n<\/code><\/pre>\n<p>\nAhora, con un solo comando, crear\u00e9 el controlador de ingreso Nginx, que funcionar\u00e1 dentro de nuestro cl\u00faster minikube:<\/p>\n<pre><code class=\"plaintext\">ingress-nginx-controller-69ccf5d9d8-j5gs9 1\/1 En ejecuci\u00f3n 1 33m\n<\/code><\/pre>\n<p><\/p>\n<h4>Paso 7 \u2013 Configuramos el ingreso<\/h4>\n<p>\nAhora necesitamos configurar el controlador de ingreso Nginx para que reconozca las solicitudes hello-quarkus.<\/p>\n<p><img decoding=\"async\" alt=\"Lo siento, OpenShift, no te valoramos lo suficiente y te dimos por hecho\" src=\"\/wp-content\/uploads\/2020\/10\/18183cb985436447cf15c501e4c6c3a3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><img decoding=\"async\" alt=\"Lo siento, OpenShift, no te valoramos lo suficiente y te dimos por hecho\" src=\"\/wp-content\/uploads\/2020\/10\/577f1e6218094b5ee23052d49869e838.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Y, por \u00faltimo, necesitamos aplicar esta configuraci\u00f3n.<\/p>\n<p><img decoding=\"async\" alt=\"Lo siento, OpenShift, no te valoramos lo suficiente y te dimos por hecho\" 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=\"Lo siento, OpenShift, no te valoramos lo suficiente y te dimos por hecho\" src=\"\/wp-content\/uploads\/2020\/10\/68fba4ef3d2762a97dc5be5de9e6b864.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Dado que estamos haciendo todo esto en nuestra computadora, simplemente a\u00f1adimos la direcci\u00f3n IP de nuestro nodo al archivo \/etc\/hosts para dirigir las solicitudes http a nuestro minikube en el equilibrador de carga NGINX.<\/p>\n<pre><code class=\"plaintext\">192.168.99.100 hello-quarkus.info\n<\/code><\/pre>\n<p>\nListo, ahora nuestro servicio minikube est\u00e1 disponible externamente a trav\u00e9s del controlador de ingreso Nginx.<\/p>\n<p><img decoding=\"async\" alt=\"Lo siento, OpenShift, no te valoramos lo suficiente y te dimos por hecho\" src=\"\/wp-content\/uploads\/2020\/10\/a456f34d168d43e9236e4769722b7f5d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Bueno, eso fue f\u00e1cil, \u00bfverdad? \u00bfO no tanto?<\/h3>\n<p><img decoding=\"async\" alt=\"Lo siento, OpenShift, no te valoramos lo suficiente y te dimos por hecho\" src=\"\/wp-content\/uploads\/2020\/10\/237015dc06bb9d12eb4cd2944dc6df58.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Ejecutando en OpenShift (Code Ready Containers)<\/h3>\n<p>\nAhora veamos c\u00f3mo se hace todo esto en la Red Hat OpenShift Container Platform (OCP).<\/p>\n<p>Al igual que con minikube, elegimos la opci\u00f3n de cl\u00faster de un solo nodo en OpenShift en forma de Code Ready Containers (CRC). Anteriormente se conoc\u00eda como minishift y se basaba en el proyecto OpenShift Origin, y ahora es CRC y est\u00e1 construido sobre la Red Hat OpenShift Container Platform.<\/p>\n<p>Aqu\u00ed, disculpen, no podemos evitar decir: \u201c\u00a1OpenShift es maravilloso!\u201d<\/p>\n<p>Inicialmente pensamos en escribir que el desarrollo en OpenShift no es diferente del desarrollo en Kubernetes. Y en esencia, as\u00ed es. Pero al escribir este post, recordamos cu\u00e1ntos pasos adicionales hay que dar cuando no tienes OpenShift, y por eso, lo repito, es maravilloso. Nos encanta cuando todo es f\u00e1cil, y la forma en que nuestro ejemplo se despliega y se ejecuta en OpenShift, en comparaci\u00f3n con minikube, es lo que nos motiv\u00f3 a escribir este post.<\/p>\n<p>Vamos a recorrer el proceso y ver qu\u00e9 necesitamos hacer.<\/p>\n<p>As\u00ed que, en el ejemplo de minikube comenzamos con Docker\u2026 Espera, ya no necesitamos que Docker est\u00e9 instalado en la m\u00e1quina.<\/p>\n<p><b>Y no necesitamos git local.<br \/>\nTampoco necesitamos Maven.<br \/>\nY no hay necesidad de crear manualmente la imagen del contenedor.<br \/>\nY no hay necesidad de buscar alg\u00fan repositorio de im\u00e1genes de contenedores.<br \/>\nY tampoco hay que instalar un controlador de ingreso.<br \/>\nY tampoco hay que configurar el ingreso.<\/b><\/p>\n<p>\u00bfLo entienden, verdad? Para desplegar y ejecutar nuestra aplicaci\u00f3n en OpenShift, no es necesario nada de lo mencionado anteriormente. Y el proceso es el siguiente.<\/p>\n<h4>Paso 1 \u2013 Iniciamos nuestro cl\u00faster OpenShift<\/h4>\n<p>\nUtilizamos Code Ready Containers de Red Hat, que es esencialmente lo mismo que Minikube, pero con un cl\u00faster OpenShift de un solo nodo completo.<\/p>\n<pre><code class=\"plaintext\">crc start\n<\/code><\/pre>\n<p><\/p>\n<h4>Paso 2 \u2013 Realizamos la construcci\u00f3n y despliegue de la aplicaci\u00f3n en el cl\u00faster OpenShift<\/h4>\n<p>\nEn este paso, la simplicidad y comodidad de OpenShift se manifiestan en todo su esplendor. Al igual que en todas las distribuciones de Kubernetes, tenemos muchas formas de iniciar una aplicaci\u00f3n en el cl\u00faster. Y, como en el caso de KUK, elegimos deliberadamente la opci\u00f3n m\u00e1s simple.<\/p>\n<p>OpenShift siempre se ha construido como una plataforma para crear y ejecutar aplicaciones en contenedores. La construcci\u00f3n de contenedores siempre ha sido una parte integral de esta plataforma, por lo que aqu\u00ed hay un mont\u00f3n de recursos adicionales de Kubernetes para las tareas correspondientes.<\/p>\n<p>Utilizaremos el proceso Source 2 Image (S2I) de OpenShift, que tiene varias maneras de tomar nuestro c\u00f3digo fuente (ya sea c\u00f3digo o archivos binarios) y convertirlo en una imagen de contenedor que se ejecute en el cl\u00faster de OpenShift.<\/p>\n<p>Para esto, necesitaremos dos cosas:<\/p>\n<ul>\n<li>Nuestro c\u00f3digo fuente en un repositorio git<\/li>\n<li>Una imagen Builder, a partir de la cual se llevar\u00e1 a cabo la construcci\u00f3n.<\/li>\n<\/ul>\n<p>\nExisten muchas de estas im\u00e1genes, respaldadas tanto por Red Hat como a nivel comunitario, y utilizaremos la imagen de OpenJDK, ya que estoy construyendo una aplicaci\u00f3n Java.<\/p>\n<p>Se puede iniciar la construcci\u00f3n S2I tanto desde la consola gr\u00e1fica del OpenShift Developer como desde la l\u00ednea de comandos. Usaremos el comando new-app, especific\u00e1ndole de d\u00f3nde obtener la imagen builder y nuestro c\u00f3digo fuente.<\/p>\n<p><img decoding=\"async\" alt=\"Lo siento, OpenShift, no te valoramos lo suficiente y te dimos por hecho\" 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>\nListo, nuestra aplicaci\u00f3n ha sido creada. Durante este proceso, S2I realiz\u00f3 las siguientes acciones:<\/p>\n<ul>\n<li>Cre\u00f3 un pod de construcci\u00f3n auxiliar para todas las cosas relacionadas con la construcci\u00f3n de la aplicaci\u00f3n.<\/li>\n<li>Cre\u00f3 una configuraci\u00f3n de OpenShift Build.<\/li>\n<li>Descarg\u00f3 la imagen builder en el registro docker interno de OpenShift.<\/li>\n<li>Clon\u00f3 'Hello World' en el repositorio local.<\/li>\n<li>Vi una maven pom all\u00ed, por lo que compil\u00e9 la aplicaci\u00f3n utilizando maven.<\/li>\n<li>Cre\u00e9 una nueva imagen de contenedor que contiene la aplicaci\u00f3n Java compilada y la coloqu\u00e9 en el registro interno de contenedores.<\/li>\n<li>Cre\u00e9 un Deployment de Kubernetes con las especificaciones del pod, del servicio, etc.<\/li>\n<li>Lanc\u00e9 el despliegue de la imagen del contenedor.<\/li>\n<li>Elimin\u00e9 el pod de build temporal.<\/li>\n<\/ul>\n<p>\nHay muchas cosas en esta lista, pero lo principal es que toda la construcci\u00f3n ocurre exclusivamente dentro de OpenShift, el registro de Docker interno est\u00e1 dentro de OpenShift, y el proceso de construcci\u00f3n crea todos los componentes de Kubernetes y los ejecuta en el cl\u00faster.<\/p>\n<p>Si se sigue visualmente el lanzamiento de S2I en la consola, se puede ver c\u00f3mo al realizar la construcci\u00f3n se inicia el pod de build.<\/p>\n<p><img decoding=\"async\" alt=\"Lo siento, OpenShift, no te valoramos lo suficiente y te dimos por hecho\" src=\"\/wp-content\/uploads\/2020\/10\/bd69c6e27813b1211a11e522f28f45b7.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Ahora echemos un vistazo a los registros del pod de builder: en primer lugar, se puede ver c\u00f3mo maven realiza su trabajo y descarga las dependencias para construir nuestra aplicaci\u00f3n java.<\/p>\n<p><img decoding=\"async\" alt=\"Lo siento, OpenShift, no te valoramos lo suficiente y te dimos por hecho\" src=\"\/wp-content\/uploads\/2020\/10\/326192f9f9373e451d601b77052d67d1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Despu\u00e9s de que se complete la construcci\u00f3n con maven, se inicia la construcci\u00f3n de la imagen del contenedor, y luego esta imagen construida se env\u00eda al repositorio interno.<\/p>\n<p><img decoding=\"async\" alt=\"Lo siento, OpenShift, no te valoramos lo suficiente y te dimos por hecho\" src=\"\/wp-content\/uploads\/2020\/10\/c97da4c17a8e275d39104126d0f87048.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Todo, el proceso de construcci\u00f3n ha terminado. Ahora asegur\u00e9monos de que los pods y servicios de nuestra aplicaci\u00f3n est\u00e1n en funcionamiento en el cl\u00faster.<\/p>\n<pre><code class=\"plaintext\">oc get service\n<\/code><\/pre>\n<p><img decoding=\"async\" alt=\"Lo siento, OpenShift, no te valoramos lo suficiente y te dimos por hecho\" src=\"\/wp-content\/uploads\/2020\/10\/f16a098a096128073f305e0444061417.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Eso es todo. Y solo un comando. Solo nos queda exponer este servicio para acceso externo.<\/p>\n<h4>Paso 3 - exponer el servicio para acceso externo<\/h4>\n<p>\nAl igual que en el caso de KUK, en la plataforma OpenShift, nuestra \u00abHello World\u00bb tambi\u00e9n necesita un enrutador para dirigir el tr\u00e1fico externo hacia el servicio dentro del cl\u00faster. En OpenShift, esto es muy sencillo. Primero, el componente de enrutamiento HAProxy est\u00e1 instalado de forma predeterminada en el cl\u00faster (puede ser cambiado por el mismo NGINX). En segundo lugar, hay recursos especiales y altamente configurables que se llaman Routes y recuerdan a los objetos Ingress en el viejo Kubernetes (de hecho, las Routes de OpenShift influyeron en el dise\u00f1o de los objetos Ingress, que ahora tambi\u00e9n se pueden usar en OpenShift), pero para nuestro \u00abHello World\u00bb, y en casi todos los dem\u00e1s casos, nos ser\u00e1 suficiente con el Route est\u00e1ndar sin configuraci\u00f3n adicional.<\/p>\n<p>Para crear un FQDN enrutado para \u00abHello World\u00bb (s\u00ed, en OpenShift hay su propio DNS para enrutamiento por nombres de servicio), simplemente ejecutaremos el expose para nuestro servicio:<\/p>\n<p><img decoding=\"async\" alt=\"Lo siento, OpenShift, no te valoramos lo suficiente y te dimos por hecho\" 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>\nSi miramos el Route reci\u00e9n creado, podemos encontrar el FQDN y otra informaci\u00f3n sobre el enrutamiento:<\/p>\n<pre><code class=\"plaintext\">oc get route\n<\/code><\/pre>\n<p><img decoding=\"async\" alt=\"Lo siento, OpenShift, no te valoramos lo suficiente y te dimos por hecho\" src=\"\/wp-content\/uploads\/2020\/10\/dc59c36166605ef0a5a24b2b7ffa65b6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Y finalmente, accedemos a nuestro servicio desde el navegador:<\/p>\n<p><img decoding=\"async\" alt=\"Lo siento, OpenShift, no te valoramos lo suficiente y te dimos por hecho\" src=\"\/wp-content\/uploads\/2020\/10\/fccf6cae1746fa59df2ff8ffb6973666.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>\u00a1Ahora s\u00ed, esto fue realmente f\u00e1cil!<\/h3>\n<p>\nAmamos Kubernetes y todo lo que esta tecnolog\u00eda permite hacer, as\u00ed como apreciamos la simplicidad y la facilidad. Kubernetes fue dise\u00f1ado para simplificar incre\u00edblemente la operaci\u00f3n de contenedores distribuidos y escalables, pero hoy en d\u00eda su simplicidad ya no es suficiente para implementar aplicaciones. Aqu\u00ed es donde entra en juego OpenShift, que se mantiene al d\u00eda y ofrece un Kubernetes orientado principalmente al desarrollador. Se han realizado enormes esfuerzos para adaptar la plataforma OpenShift precisamente para los desarrolladores, incluyendo la creaci\u00f3n de herramientas como S2I, ODI, Developer Portal, OpenShift Operator Framework, integraci\u00f3n con IDE, cat\u00e1logos para desarrolladores, integraci\u00f3n con Helm, monitoreo y muchas otras.<\/p>\n<p>Esperamos que este art\u00edculo haya sido interesante y \u00fatil para usted. Puede encontrar recursos adicionales, materiales y otros elementos \u00fatiles para el desarrollo en la plataforma OpenShift en el portal <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/\">Red Hat Developers<\/a><\/noindex>.<br \/>\n<br \/>Fuente: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/redhatrussia\/blog\/523568\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u042d\u0442\u043e\u0442 \u043f\u043e\u0441\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0443 \u043d\u0430\u0448\u0438\u0445 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432 \u0431\u044b\u043b\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440\u043e\u0432 \u0441 \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c\u0438 \u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 Kubernetes \u0438 \u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0435 \u0442\u0430\u043a\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0430 OpenShift. \u041d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u043c\u044b \u043e\u0431\u044b\u0447\u043d\u043e \u0441 \u0442\u0435\u0437\u0438\u0441\u0430, \u0447\u0442\u043e Kubernetes \u2013 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e Kubernetes, \u0430 OpenShift \u2013 \u044d\u0442\u043e \u0443\u0436\u0435 Kubernetes-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430, \u043a\u0430\u043a Microsoft AKS \u0438\u043b\u0438 Amazon EKS. \u0423 \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0437 \u044d\u0442\u0438\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0438 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":97255,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-97254","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u042d\u0442\u043e\u0442 \u043f\u043e\u0441\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0443 \u043d\u0430\u0448\u0438\u0445 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432 \u0431\u044b\u043b\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440\u043e\u0432 \u0441 \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c\u0438 \u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 Kubernetes \u0438 \u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0435 \u0442\u0430\u043a\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0430 OpenShift.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/prosti-openshift-my-nedostatochno-czenili-tebya-i-prinimali-kak-dolzhnoe\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\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\/es\/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\udd47Lo siento, OpenShift, no te valoramos lo suficiente y te dimos por sentado | ProHoster","description":"Esta publicaci\u00f3n se escribe porque nuestros empleados han tenido muchas conversaciones con clientes sobre el desarrollo de aplicaciones en Kubernetes y las particularidades de dicho desarrollo en OpenShift.","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/prosti-openshift-my-nedostatochno-czenili-tebya-i-prinimali-kak-dolzhnoe","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"es_ES","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\/es\/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\/es\/wp-json\/wp\/v2\/posts\/97254","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=97254"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/97254\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/97255"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=97254"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=97254"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=97254"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}