<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Kubernetes archivos - Geko Cloud</title>
	<atom:link href="https://geko.cloud/es/etiqueta/kubernetes/feed/" rel="self" type="application/rss+xml" />
	<link></link>
	<description>Servicios de consultoría cloud y devops</description>
	<lastBuildDate>Thu, 20 Mar 2025 10:05:36 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.5.7</generator>

<image>
	<url>https://geko.cloud/wp-content/uploads/2021/08/cropped-geko-fav-150x150.png</url>
	<title>Kubernetes archivos - Geko Cloud</title>
	<link></link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>¿Qué es Kubernetes y cuándo usarlo?</title>
		<link>https://geko.cloud/es/que-es-kubernetes-cuando-usarlo/</link>
					<comments>https://geko.cloud/es/que-es-kubernetes-cuando-usarlo/#respond</comments>
		
		<dc:creator><![CDATA[Xènia Adan]]></dc:creator>
		<pubDate>Wed, 26 Feb 2025 10:00:04 +0000</pubDate>
				<category><![CDATA[Destacado]]></category>
		<category><![CDATA[DevOps]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<guid isPermaLink="false">https://geko2.factoryfy.com/es/?p=3521</guid>

					<description><![CDATA[<p>En un mundo donde la escalabilidad, la disponibilidad y la eficiencia son esenciales para el desarrollo de aplicaciones, Kubernetes se ha convertido en el estándar de facto para la orquestación de contenedores. Desarrollado originalmente por Google y ahora mantenido por la Cloud Native Computing Foundation (CNCF), Kubernetes permite gestionar, escalar y automatizar la ejecución de [&#8230;]</p>
<p>La entrada <a href="https://geko.cloud/es/que-es-kubernetes-cuando-usarlo/">¿Qué es Kubernetes y cuándo usarlo?</a> se publicó primero en <a href="https://geko.cloud/es/">Geko Cloud</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><span style="font-weight: 400;">En un mundo donde la escalabilidad, la disponibilidad y la eficiencia son esenciales para el desarrollo de aplicaciones, </span><b>Kubernetes</b><span style="font-weight: 400;"> se ha convertido en el estándar de facto para la </span><b>orquestación de contenedores</b><span style="font-weight: 400;">. Desarrollado originalmente por Google y ahora mantenido por la </span><b>Cloud Native Computing Foundation (CNCF)</b><span style="font-weight: 400;">, Kubernetes permite gestionar, escalar y automatizar la ejecución de aplicaciones en contenedores de manera eficiente.</span></p>
<p><span style="font-weight: 400;">En este artículo, exploraremos </span><b>qué es Kubernetes</b><span style="font-weight: 400;">, sus </span><b>beneficios y componentes clave</b><span style="font-weight: 400;">, y en </span><b>qué casos es recomendable adoptarlo</b><span style="font-weight: 400;">.</span></p>
<p>&nbsp;</p>
<h2><b>¿Qué es la orquestación de contenedores?</b></h2>
<p><span style="font-weight: 400;">Antes de adentrarnos en Kubernetes primero dedebes saber qué es la orquestación de contenedores. Las tecnologías de contenedores han cambiado de forma radical el panorama de sistemas y la forma de empaquetar y desplegar el software. Algunos de los beneficios que aportan los contenedores son la portabilidad, la agilidad, la velocidad, la inmutabilidad y el aislamiento de fallos.</span></p>
<p><span style="font-weight: 400;">Un orquestador de contenedores (en inglés </span><i><span style="font-weight: 400;">container orchestration</span></i><span style="font-weight: 400;">) es un </span><b>software encargado de gestionar y coordinar contenedores de forma automatizada</b><span style="font-weight: 400;">. Existen varias herramientas de orquestación de contenedores como Docker Swarm, Google Container Engine, Amazon ECS, y otras. Sin embargo, en este post nos centraremos en Kubernetes, donde explicaremos el concepto, componentes más destacables de la herramienta y beneficios que Kubernetes puede ofrecer, entre otros puntos.</span></p>
<h2><b><br />
</b><b>¿Qué es Kubernetes?</b></h2>
<p><span style="font-weight: 400;">Kubernetes es una </span><b>plataforma de orquestación de contenedores</b><span style="font-weight: 400;"> de código abierto que permite </span><b>automatizar el despliegue, la gestión y el escalado</b><span style="font-weight: 400;"> de aplicaciones en contenedores. Su arquitectura distribuida facilita la administración de clústeres en distintos entornos, ya sea en </span><b>nube pública, privada o híbrida</b><span style="font-weight: 400;">.</span></p>
<p><span style="font-weight: 400;">Originalmente desarrollado por Google, Kubernetes se basa en la experiencia de la compañía con Borg, su sistema interno de gestión de contenedores. Desde su lanzamiento como proyecto de código abierto en 2014, ha evolucionado hasta convertirse en la plataforma estándar para la </span><b>infraestructura cloud-native</b><span style="font-weight: 400;">.</span></p>
<p>&nbsp;</p>
<p><img fetchpriority="high" decoding="async" class="aligncenter wp-image-10076 size-medium" src="https://geko.cloud/wp-content/uploads/2021/02/logo-kubernetes-300x200.png" alt="" width="300" height="200" srcset="https://geko.cloud/wp-content/uploads/2021/02/logo-kubernetes-300x200.png 300w, https://geko.cloud/wp-content/uploads/2021/02/logo-kubernetes-1024x683.png 1024w, https://geko.cloud/wp-content/uploads/2021/02/logo-kubernetes-768x512.png 768w, https://geko.cloud/wp-content/uploads/2021/02/logo-kubernetes-1536x1024.png 1536w, https://geko.cloud/wp-content/uploads/2021/02/logo-kubernetes-2048x1365.png 2048w" sizes="(max-width: 300px) 100vw, 300px" /></p>
<p>&nbsp;</p>
<h2><b>Beneficios de Kubernetes</b></h2>
<p><span style="font-weight: 400;">Implementar Kubernetes en un entorno de producción ofrece numerosas ventajas:</span></p>
<p>&nbsp;</p>
<h3><b>Escalabilidad y eficiencia</b></h3>
<p><span style="font-weight: 400;">Permite escalar aplicaciones de forma </span><b>horizontal y vertical</b><span style="font-weight: 400;"> en función de la demanda, optimizando el uso de los recursos.</span></p>
<h3><b>Automatización del despliegue y la gestión</b></h3>
<p><span style="font-weight: 400;">Facilita la </span><b>implementación continua (CI/CD)</b><span style="font-weight: 400;"> y la </span><b>actualización sin tiempos de inactividad</b><span style="font-weight: 400;">, permitiendo la entrega ágil de nuevas versiones de software.</span></p>
<h3><b>Recuperación ante fallos</b></h3>
<p><span style="font-weight: 400;">Los </span><b>Pods y nodos defectuosos se reprograman automáticamente</b><span style="font-weight: 400;">, asegurando alta disponibilidad y continuidad del negocio.</span></p>
<h3><b>Portabilidad y compatibilidad</b></h3>
<p><span style="font-weight: 400;">Es compatible con múltiples </span><b>proveedores cloud</b><span style="font-weight: 400;"> y entornos </span><b>on-premise</b><span style="font-weight: 400;">, permitiendo la portabilidad sin bloqueos de proveedor (</span><i><span style="font-weight: 400;">vendor lock-in</span></i><span style="font-weight: 400;">).</span></p>
<h3><b>Aislamiento y seguridad</b></h3>
<p><span style="font-weight: 400;">Gracias a su sistema de </span><b>namespaces</b><span style="font-weight: 400;">, permite aislar cargas de trabajo, mejorar la seguridad y optimizar el uso de recursos.</span></p>
<p>&nbsp;</p>
<h2><b>Componentes clave de Kubernetes</b></h2>
<p><span style="font-weight: 400;">Para comprender cómo funciona Kubernetes, es importante conocer sus principales componentes:</span></p>
<h3><b>Pods</b></h3>
<p><span style="font-weight: 400;">Los </span><b>Pods</b><span style="font-weight: 400;"> son la </span><b>unidad mínima de ejecución</b><span style="font-weight: 400;"> en Kubernetes. Cada Pod puede contener uno o más contenedores que comparten almacenamiento y red.</span></p>
<h3><b>Nodos</b></h3>
<p><span style="font-weight: 400;">Los </span><b>Nodos</b><span style="font-weight: 400;"> son las máquinas físicas o virtuales donde se ejecutan los Pods. Un clúster de Kubernetes está compuesto por múltiples nodos.</span></p>
<h3><b>Control Plane (Plano de Control)</b></h3>
<p><span style="font-weight: 400;">El </span><b>Control Plane</b><span style="font-weight: 400;"> administra el clúster y gestiona la comunicación entre los componentes de Kubernetes. Incluye el </span><b>kube-apiserver</b><span style="font-weight: 400;">, </span><b>kube-controller-manager</b><span style="font-weight: 400;"> y </span><b>kube-scheduler</b><span style="font-weight: 400;">.</span></p>
<h3><b>Clúster</b></h3>
<p><span style="font-weight: 400;">Un </span><b>clúster de Kubernetes</b><span style="font-weight: 400;"> es un conjunto de nodos gestionados como una sola unidad. Asegura la alta disponibilidad y distribución de la carga de trabajo.</span></p>
<p>&nbsp;</p>
<h2><b>¿Cuándo usar Kubernetes?</b></h2>
<p><span style="font-weight: 400;">No todas las aplicaciones requieren Kubernetes. Su adopción es ideal en los siguientes escenarios:</span></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><b>Arquitecturas de microservicios</b><span style="font-weight: 400;">: Si tu aplicación está basada en </span><b>microservicios</b><span style="font-weight: 400;">, Kubernetes facilita la gestión de contenedores de manera independiente y escalable.</span></li>
<li style="font-weight: 400;" aria-level="1"><b>Aplicaciones que requieren alta disponibilidad</b><span style="font-weight: 400;">: Kubernetes distribuye cargas de trabajo para garantizar </span><b>redundancia y recuperación automática</b><span style="font-weight: 400;"> en caso de fallos.</span></li>
<li style="font-weight: 400;" aria-level="1"><b>Entornos híbridos o multi-cloud</b><span style="font-weight: 400;">: Permite ejecutar aplicaciones en </span><b>múltiples nubes</b><span style="font-weight: 400;"> o entornos </span><b>on-premise</b><span style="font-weight: 400;"> sin modificar su configuración.</span></li>
<li style="font-weight: 400;" aria-level="1"><b>Cargas de trabajo con picos de demanda</b><span style="font-weight: 400;">: Kubernetes permite escalar horizontalmente de manera dinámica según la demanda.</span></li>
<li style="font-weight: 400;" aria-level="1"><b>Empresas que buscan automatización en DevOps</b><span style="font-weight: 400;">: Kubernetes se integra con herramientas como </span><b>CI/CD</b><span style="font-weight: 400;">, </span><b>monitorización</b><span style="font-weight: 400;"> y </span><b>logging</b><span style="font-weight: 400;">, automatizando los flujos de trabajo.</span></li>
</ul>
<p>&nbsp;</p>
<p><span style="font-weight: 400;">En este webinar puedes saber más sobre qué es Kubernetes y por qué aplicarlo en tu negocio:</span></p>
<p><iframe title="¿Qué es Kubernetes? ¿Por qué aplicarlo en tu negocio?" width="800" height="450" src="https://www.youtube.com/embed/RpUNIZoCl7g?feature=oembed&#038;enablejsapi=1&#038;origin=https://geko.cloud" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></p>
<p>&nbsp;</p>
<h2><b>Consideraciones antes de adoptar Kubernetes</b></h2>
<p><span style="font-weight: 400;">A pesar de sus múltiples ventajas, Kubernetes no siempre es la mejor opción. Antes de implementarlo, ten en cuenta que requiere conocimientos avanzados para su correcta administración. No es recomendable para proyectos pequeños con recursos limitados, ya que su gestión consume infraestructura y requiere equipo técnico especializado.</span></p>
<p><span style="font-weight: 400;">Kubernetes se ha convertido en el estándar para la </span><b>gestión de contenedores</b><span style="font-weight: 400;">, permitiendo el </span><b>despliegue escalable, automatizado y seguro de aplicaciones</b><span style="font-weight: 400;"> en entornos cloud y on-premise. Sin embargo, su implementación requiere una </span><b>evaluación estratégica</b><span style="font-weight: 400;"> para determinar si es la solución adecuada para cada negocio.</span></p>
<p><span style="font-weight: 400;">Si estás considerando </span><b>migrar tus aplicaciones a Kubernetes</b><span style="font-weight: 400;"> y necesitas asesoramiento, en</span><a href="https://geko.cloud/"> <b>Geko Cloud</b></a><span style="font-weight: 400;"> podemos ayudarte a optimizar tu infraestructura con Kubernetes. </span></p>
<p>&nbsp;</p>
<p><a href="https://geko.cloud/es/contacto/"><img decoding="async" class="aligncenter wp-image-3265" src="https://geko2.factoryfy.com/wp-content/uploads/geko-1-150x150.png" alt="" width="81" height="81" /></a></p>
<p>La entrada <a href="https://geko.cloud/es/que-es-kubernetes-cuando-usarlo/">¿Qué es Kubernetes y cuándo usarlo?</a> se publicó primero en <a href="https://geko.cloud/es/">Geko Cloud</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://geko.cloud/es/que-es-kubernetes-cuando-usarlo/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Kubernetes v1.32, Penelope: novedades y mejoras</title>
		<link>https://geko.cloud/es/kubernetes-penelope/</link>
					<comments>https://geko.cloud/es/kubernetes-penelope/#respond</comments>
		
		<dc:creator><![CDATA[Geko Cloud]]></dc:creator>
		<pubDate>Thu, 20 Feb 2025 08:54:00 +0000</pubDate>
				<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[penelope]]></category>
		<guid isPermaLink="false">https://geko.cloud/?p=10065</guid>

					<description><![CDATA[<p>El lanzamiento de Kubernetes v1.32, conocido como «Penelope», introduce mejoras significativas en estabilidad, seguridad y eficiencia.  Esta versión no solo optimiza el rendimiento general del sistema, sino que también incorpora nuevas capacidades que facilitan la administración de clusters y la asignación de recursos.  &#160; &#160; A continuación, detallamos aspectos clave de esta actualización y su [&#8230;]</p>
<p>La entrada <a href="https://geko.cloud/es/kubernetes-penelope/">Kubernetes v1.32, Penelope: novedades y mejoras</a> se publicó primero en <a href="https://geko.cloud/es/">Geko Cloud</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><span style="font-weight: 400;">El lanzamiento de Kubernetes v1.32, conocido como «Penelope», introduce mejoras significativas en</span><b> estabilidad, seguridad y eficiencia</b><span style="font-weight: 400;">. </span></p>
<p><span style="font-weight: 400;">Esta versión no solo optimiza el rendimiento general del sistema, sino que también incorpora </span><b>nuevas capacidades que facilitan la administración de clusters y la asignación de recursos</b><span style="font-weight: 400;">. </span></p>
<p>&nbsp;</p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-10066 aligncenter" src="https://geko.cloud/wp-content/uploads/2025/02/kubernetes-penelope-300x300.png" alt="" width="300" height="300" srcset="https://geko.cloud/wp-content/uploads/2025/02/kubernetes-penelope-300x300.png 300w, https://geko.cloud/wp-content/uploads/2025/02/kubernetes-penelope-150x150.png 150w, https://geko.cloud/wp-content/uploads/2025/02/kubernetes-penelope-768x768.png 768w, https://geko.cloud/wp-content/uploads/2025/02/kubernetes-penelope.png 808w" sizes="(max-width: 300px) 100vw, 300px" /></p>
<p>&nbsp;</p>
<p><span style="font-weight: 400;">A continuación, detallamos aspectos clave de esta actualización y su impacto en la administración de Kubernetes:</span></p>
<p>&nbsp;</p>
<h2><span style="font-weight: 400;">Principales novedades de Kubernetes v1.32</span></h2>
<p>&nbsp;</p>
<ul>
<li aria-level="1"><b>Mejoras en la Asignación Dinámica de Recursos (DRA)</b></li>
</ul>
<ol>
<li style="list-style-type: none;">
<ul>
<li style="font-weight: 400;" aria-level="2"><span style="font-weight: 400;">Se ha optimizado la gestión de hardware especializado como GPUs, FPGAs y adaptadores de red, lo que permite una asignación más eficiente de los recursos en entornos de alto rendimiento.</span></li>
<li style="font-weight: 400;" aria-level="2"><span style="font-weight: 400;">El soporte para parámetros estructurados, ahora en fase beta, mejora la planificación y distribución de los recursos sin necesidad de validaciones externas.</span></li>
<li style="font-weight: 400;" aria-level="2"><span style="font-weight: 400;">Esta actualización beneficia especialmente a áreas como la inteligencia artificial y el cálculo de alto rendimiento.</span></li>
</ul>
</li>
</ol>
<p>&nbsp;</p>
<ul>
<li aria-level="1"><b>Actualizaciones en la gestión de nodos y contenedores sidecar</b></li>
</ul>
<ol>
<li style="list-style-type: none;">
<ul>
<li style="font-weight: 400;" aria-level="2"><span style="font-weight: 400;">Se ha implementado el systemd watchdog para reiniciar automáticamente el kubelet en caso de fallos, garantizando una mayor estabilidad y reduciendo el tiempo de inactividad.</span></li>
<li style="font-weight: 400;" aria-level="2"><span style="font-weight: 400;">Las mejoras en los mensajes de error de ImagePullBackOff permiten identificar más fácilmente problemas relacionados con la descarga de imágenes de contenedores.</span></li>
<li style="font-weight: 400;" aria-level="2"><span style="font-weight: 400;">La funcionalidad de los contenedores sidecar se acerca a la fase Stable para la versión v1.33, facilitando su integración en arquitecturas complejas y mejorando la eficiencia operativa.</span></li>
</ul>
</li>
</ol>
<p>&nbsp;</p>
<ul>
<li aria-level="1"><b>Mejoras en fase </b><b><i>stable</i></b><b> (listas para producción)</b></li>
</ul>
<ol>
<li style="list-style-type: none;">
<ul>
<li style="font-weight: 400;" aria-level="2"><span style="font-weight: 400;">Selectores de campo para recursos personalizados: mejora en la filtración de datos en la API, lo que permite a los desarrolladores realizar consultas más precisas y eficientes.</span></li>
<li style="font-weight: 400;" aria-level="2"><span style="font-weight: 400;">Soporte para volúmenes en memoria con tamaño ajustable: posibilita el ajuste dinámico del almacenamiento basado en las necesidades del Pod, optimizando la utilización de recursos.</span></li>
<li style="font-weight: 400;" aria-level="2"><span style="font-weight: 400;">Mejoras en la seguridad de los tokens de cuenta de servicio: ahora se incluye el nombre del nodo en los tokens, reduciendo los riesgos de escalamiento de privilegios.</span></li>
<li style="font-weight: 400;" aria-level="2"><span style="font-weight: 400;">Eliminación automática de PVCs obsoletos: facilita la administración del almacenamiento, evitando residuos innecesarios en el sistema.</span></li>
</ul>
</li>
</ol>
<p>&nbsp;</p>
<ul>
<li aria-level="1"><b>Mejoras en fase </b><b><i>beta </i></b><b>(pueden cambiar en futuras versiones)</b></li>
</ul>
<ol>
<li style="list-style-type: none;">
<ul>
<li style="font-weight: 400;" aria-level="2"><span style="font-weight: 400;">Gestor de trabajos mejorado (Job API managed-by): permite a los controladores externos gestionar la sincronización de trabajos de forma más eficiente.</span></li>
<li style="font-weight: 400;" aria-level="2"><span style="font-weight: 400;">Autorización anónima configurada: los administradores pueden definir qué endpoints permiten acceso anónimo, reforzando la seguridad.</span></li>
<li style="font-weight: 400;" aria-level="2"><span style="font-weight: 400;">Mejoras en la reprogramación de Pods (kube-scheduler): optimiza la priorización de tareas y reduce el tiempo de espera en la asignación de recursos.</span></li>
</ul>
</li>
</ol>
<p>&nbsp;</p>
<ul>
<li aria-level="1"><b>Nuevas funciones en </b><b><i>alpha</i></b><b> (fase temprana de desarrollo)</b></li>
</ul>
<ul>
<li style="list-style-type: none;">
<ul>
<li style="font-weight: 400;" aria-level="2"><span style="font-weight: 400;">Preempción asíncrona en el planificador: mejora el rendimiento al manejar operaciones de preempción en paralelo, reduciendo latencias en la asignación de Pods.</span></li>
<li style="font-weight: 400;" aria-level="2"><span style="font-weight: 400;">Especificaciones de recursos a nivel de Pod: introduce la posibilidad de definir recursos compartidos entre los contenedores de un Pod, optimizando el consumo de CPU y memoria.</span></li>
<li style="font-weight: 400;" aria-level="2"><span style="font-weight: 400;">Soporte para apagados controlados en nodos Windows: permite la gestión eficiente, asegurando que los Pods sean reasignados adecuadamente.</span></li>
</ul>
</li>
</ul>
<p>&nbsp;</p>
<h2><span style="font-weight: 400;">Impacto en la administración de Kubernetes</span></h2>
<p><span style="font-weight: 400;">La versión v1.32 de Kubernetes aporta beneficios en varias áreas:</span></p>
<ul>
<li style="font-weight: 400;" aria-level="1"><b>Reducción de costes operativos</b><span style="font-weight: 400;">: la optimización en la asignación de recursos mejora la eficiencia y reduce el desperdicio de cómputo.</span></li>
<li style="font-weight: 400;" aria-level="1"><b>Mayor estabilidad</b><span style="font-weight: 400;">: con nuevas capacidades de autorecuperación, se minimizan las interrupciones en el servicio.</span></li>
<li style="font-weight: 400;" aria-level="1"><b>Mejoras en seguridad y cumplimiento</b><span style="font-weight: 400;">: las nuevas funcionalidades de autorización y gestión de tokens refuerzan la protección de los entornos Kubernetes.</span></li>
<li style="font-weight: 400;" aria-level="1"><b>Automatización mejorada</b><span style="font-weight: 400;">: Kubernetes sigue avanzando hacia una mayor autosuficiencia, lo que permite a los equipos centrarse en tareas de mayor valor.</span></li>
</ul>
<p>&nbsp;</p>
<p><span style="font-weight: 400;">Para más detalles sobre Kubernetes v1.32, visita el</span><a href="https://kubernetes.io/blog/2024/12/11/kubernetes-v1-32-release/"><span style="font-weight: 400;"> blog oficial</span></a><span style="font-weight: 400;"> o </span><a href="https://geko.cloud/es/contacto/"><span style="font-weight: 400;">contáctanos</span></a><span style="font-weight: 400;"> para aprovechar al máximo estas mejoras.</span></p>
<p>&nbsp;</p>
<p>La entrada <a href="https://geko.cloud/es/kubernetes-penelope/">Kubernetes v1.32, Penelope: novedades y mejoras</a> se publicó primero en <a href="https://geko.cloud/es/">Geko Cloud</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://geko.cloud/es/kubernetes-penelope/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Kubernetes vs Docker, conoce en qué se diferencian</title>
		<link>https://geko.cloud/es/docker-vs-kubernetes/</link>
					<comments>https://geko.cloud/es/docker-vs-kubernetes/#respond</comments>
		
		<dc:creator><![CDATA[Xènia Adan]]></dc:creator>
		<pubDate>Wed, 08 Dec 2021 14:54:55 +0000</pubDate>
				<category><![CDATA[Marketing]]></category>
		<category><![CDATA[Docker]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<guid isPermaLink="false">https://geko.cloud/?p=6538</guid>

					<description><![CDATA[<p>Para los ingenieros de DevOps, mantenerse al día con todas las herramientas que rodean a las nuevas tecnologías es más importante que nunca. Dos herramientas esenciales hoy en día son Kubernetes y Docker, ambas tecnologías pueden parecer lo mismo a primera vista, ambas permiten hacer cosas similares como el permitir ejecutar contenedores, sin embargo ambos [&#8230;]</p>
<p>La entrada <a href="https://geko.cloud/es/docker-vs-kubernetes/">Kubernetes vs Docker, conoce en qué se diferencian</a> se publicó primero en <a href="https://geko.cloud/es/">Geko Cloud</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><span style="font-weight: 2000;">Para los ingenieros de DevOps, mantenerse al día con todas las herramientas que rodean a las nuevas tecnologías es más importante que nunca. Dos herramientas esenciales hoy en día son <strong>Kubernetes</strong> y <strong>Docker</strong>, ambas tecnologías pueden parecer lo mismo a primera vista, ambas permiten hacer cosas similares como el permitir ejecutar contenedores, sin embargo ambos trabajan en capas diferentes de la infraestructura cloud. En esta entrada del blog, intentaremos aclarar ambos términos.</span></p>
<h2><b>¿Qué es un contenedor?</b></h2>
<p><span style="font-weight: 2000;">Empecemos con una breve definición de qué es exactamente un contenedor. Los contenedores son una forma de virtualización del sistema operativo. Un solo contenedor puede utilizarse para ejecutar cualquier cosa, desde un pequeño microservicio o proceso de software hasta una aplicación más grande.</span></p>
<p><span style="font-weight: 2000;">Un contenedor es como una caja compacta que contiene todas las dependencias de una aplicación en un solo lugar. Esto no sólo permite que una aplicación se ejecute rápidamente en un sistema, sino que también la hace portátil, fácil de transferir de un entorno a otro.</span></p>
<p><span style="font-weight: 2000;">A diferencia de las máquinas virtuales, los contenedores sólo virtualizan el sistema operativo y las dependencias necesarias, lo cual los hace más ligeros y portátiles, con una carga de sistema significativamente menor. Se pueden transferir fácilmente de un entorno a otro y funcionan de manera uniforme en todo momento gracias a contener todo lo necesario para que la aplicación funcione.</span></p>
<h2><b>¿Qué es Docker?</b></h2>
<p><span style="font-weight: 2000;"><strong>Docker</strong> es una plataforma de contenerización de código abierto lanzada por la empresa Docker Inc. en 2013, es decir, <strong>Docker</strong> es una tecnología que se utiliza para crear y ejecutar contenedores de software. En esencia <strong>Docker</strong> es un sistema que permite construir, transferir, desplegar y ejecutar los contenedores con las aplicaciones dentro de una manera muy sencilla y confiable, garantizando un despliegue escalable de forma eficiente sin importar el sistema operativo anfitrión.</span></p>
<p><span style="font-weight: 2000;"><strong>Docker</strong> agiliza la creación de contenedores con herramientas como los dockerfiles, y agiliza la definición como código de aplicaciones en contenedores a través de docker-compose. Estas herramientas se utilizan para crear un ciclo de vida de desarrollo, desde definir qué va a haber dentro de un contenedor, hasta establecer su entorno y acceso a recursos. </span><span style="font-weight: 2000;">También ayuda a los desarrolladores a trasladar las cargas de trabajo desde su entorno local, a las pruebas hasta la producción, eliminando las incoherencias y dependencias entre entornos. Como el contenedor que se despliega será el mismo en el que se desarrollaba, el entorno tendrá el mismo resultado predecible.</span></p>
<p><img loading="lazy" decoding="async" class="wp-image-6718 aligncenter" src="https://geko.cloud/wp-content/uploads/2021/12/Docker-infraestructura.png" alt="Docker infraestructura" width="546" height="329" srcset="https://geko.cloud/wp-content/uploads/2021/12/Docker-infraestructura.png 827w, https://geko.cloud/wp-content/uploads/2021/12/Docker-infraestructura-300x181.png 300w, https://geko.cloud/wp-content/uploads/2021/12/Docker-infraestructura-768x462.png 768w" sizes="(max-width: 546px) 100vw, 546px" /></p>
<h2><b>¿Qué es Kubernetes?</b></h2>
<p><span style="font-weight: 2000;"><strong>Kubernetes</strong> (también conocido como <strong>k8s</strong>) es un orquestador de plataformas de contenedores, como <strong>Docker</strong>. Para ser más exactos, <strong>Kubernetes</strong> es un conjunto de herramientas de código abierto para construir una plataforma escalable y tolerante a fallos diseñada para automatizar y gestionar de forma centralizada las aplicaciones en contenedores. Conoce más en detalle sobre esta herramiento en nuestro post <a href="https://geko.cloud/es/que-es-kubernetes/">¿Qué es Kubernetes?</a> <img src="https://s.w.org/images/core/emoji/15.0.3/72x72/1f448.png" alt="👈" class="wp-smiley" style="height: 1em; max-height: 1em;" /></span></p>
<h2><b>Entonces ¿en qué se parecen o diferencian Docker y Kubernetes?</b></h2>
<p><span style="font-weight: 2000;">Como podemos deducir de lo anterior, <strong>Docker</strong> y <strong>Kubernetes</strong> son tecnologías relacionadas, pero no tienen nada que ver. En realidad, las dos herramientas se complementan entre sí y ayudan a construir arquitecturas nativas en el cloud o de microservicios. Dicho de otra manera, <strong>Kubernetes</strong> construye sobre <strong>Docker</strong>, utilizándolo como motor para ejecutar contenedores, pero éste se ocupa de cómo se ejecutan estos contenedores exactamente: configuración, réplicas, acceso a recursos del sistema, o comunicación de red. Se encarga de generar estas configuraciones y de comunicarlas a <strong>Docker</strong> para que las aplique.</span></p>
<p><span style="font-weight: 2000;">¿Cuál es la diferencia entre <strong>Docker</strong> y <strong>Kubernetes</strong>? Kubernetes está pensado para ejecutarse en un clúster, mientras que <strong>Docker</strong> se ejecuta en un único nodo por defecto, sin gestión de replicación o mantenimiento de salud de los contenedores, sólo se ocupa de ejecutar un contenedor tal y como se ha declarado. Por lo tanto, la diferencia fundamental entre <strong>Docker</strong> y <strong>Kubernetes</strong> es que <strong>Docker</strong> es una plataforma de contenerización, lo que significa que se encarga de la creación de contenedores, mientras que <strong>Kubernetes</strong> es una plataforma de orquestación de contenedores.</span></p>
<p><span style="font-weight: 2000;">Por lo tanto, la comparación entre <strong>Kubernetes</strong> y <strong>Docker</strong> no es tan sencilla como crear una lista de pros y contras o de características por características. Sin embargo, existe una tecnología de orquestación similar a <strong>Kubernetes</strong> desarrollada por Docker Inc. llamada<strong> Docker Swarm</strong>, que nos proporciona elementos parecidos a <strong>Kubernetes</strong> como la gestión de replicación o el balanceo de carga entre contenedores.</span></p>
<h2><b>Conclusión</b></h2>
<p><span style="font-weight: 2000;">En resumen, <strong>Docker</strong> proporciona un estándar abierto para empaquetar y distribuir aplicaciones en contenedores y es suficiente para abordar casos de uso sencillos y <a href="https://kubernetes.io/es/docs/concepts/overview/what-is-kubernetes/" target="_blank" rel="noopener"><strong>Kubernetes</strong></a> aprovecha un amplio ecosistema de herramientas junto con la integración continua/despliegue continuo (CI/CD) y otras prácticas de DevOps para orquestar grandes conjuntos de contenedores, desde los entornos de desarrollo hasta los de producción.</span></p>
<p>En Geko Cloud estamos a tu disposición si estás buscando un partner para implementar <a href="https://geko.cloud/es/servicios-cloud/kubernetes/">Kubernetes</a>, <a href="https://geko.cloud/es/servicios-cloud/migracion-cloud/">migrar al cloud</a>, cambiar a un modelo de <a href="https://geko.cloud/es/servicios-cloud/arquitectura-de-microservicios-y-docker/">microservicios</a> o gestionar tu plataforma en el <a href="https://geko.cloud/es/servicios-cloud/gestion-cloud/">cloud</a>. <a href="https://geko.cloud/es/contacto/">Contacta con nosotros</a> para conocer <a href="https://geko.cloud/es/servicios-cloud/">nuestros servicios</a>.</p>
<p>La entrada <a href="https://geko.cloud/es/docker-vs-kubernetes/">Kubernetes vs Docker, conoce en qué se diferencian</a> se publicó primero en <a href="https://geko.cloud/es/">Geko Cloud</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://geko.cloud/es/docker-vs-kubernetes/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Harbor: Instalar un registry privado en Kubernetes</title>
		<link>https://geko.cloud/es/harbor-instalar-un-registry-privado-en-kubernetes/</link>
					<comments>https://geko.cloud/es/harbor-instalar-un-registry-privado-en-kubernetes/#respond</comments>
		
		<dc:creator><![CDATA[Xavi Miranda]]></dc:creator>
		<pubDate>Tue, 18 May 2021 06:53:57 +0000</pubDate>
				<category><![CDATA[Labs]]></category>
		<category><![CDATA[Docker]]></category>
		<category><![CDATA[Harbor]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<guid isPermaLink="false">https://geko2.factoryfy.com/?p=2631</guid>

					<description><![CDATA[<p>Kubernetes es un orquestador de contenedores y por lo tanto necesitarás algún lugar para almacenar tus imágenes docker de forma que Kubernetes pueda descargarlas y usarlas. Hay una gran variedad de soluciones para elegir: cloud registry, dockerhub, un registry privado en una vm&#8230; o un registry privado en Kubernetes. Hoy vamos a hablar sobre esta [&#8230;]</p>
<p>La entrada <a href="https://geko.cloud/es/harbor-instalar-un-registry-privado-en-kubernetes/">Harbor: Instalar un registry privado en Kubernetes</a> se publicó primero en <a href="https://geko.cloud/es/">Geko Cloud</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><a href="https://geko.cloud/es/que-es-kubernetes/">Kubernetes</a> es un <strong>orquestador de contenedores</strong> y por lo tanto necesitarás algún lugar para <strong>almacenar tus imágenes docker</strong> de forma que Kubernetes pueda descargarlas y usarlas. Hay una gran variedad de soluciones para elegir: cloud registry, dockerhub, un registry privado en una vm&#8230; o un registry privado en <a href="https://geko.cloud/es/que-es-kubernetes/">Kubernetes</a>.</p>
<p>Hoy vamos a hablar sobre esta última opción; una solución para desplegar un registry <strong>dentro del propio Kubernetes: Harbor</strong>.</p>
<h3>¿Pero qué es Harbor?</h3>
<p><strong>Harbor</strong> es open-source y es parte de la <a href="https://cncf.io/">Cloud Native Computing Foundation</a>. Implementa funcionalidades básicas como por ejemplo autenticación basada en roles (con <strong><a href="https://geko.cloud/es/como-instalar-grafana-con-ldap-en-kubernetes-usando-helm/">soporte para LDAP</a></strong>) y también ofrece otras características más avanzadas como la habilidad para subir y gestionar <strong>charts de helm</strong>, realizar escaneo de vulnerabilidades sobre las imágenes subidas, y mucho más.</p>
<h3>Suficiente charla, ¡quiero un hands-on!</h3>
<p>Vamos a ver cómo poner en marcha <strong>Harbor</strong> en nuestro clúster. Asumiremos que cuentas con los siguientes requisitos:</p>
<ul>
<li>Tienes un <strong>clúster de k8s</strong> con un ingress-controller. Minikube es aceptable.</li>
<li>Tienes <b>helm</b> instalado (lee sobre <b><a href="https://geko.cloud/es/como-instalar-grafana-con-ldap-en-kubernetes-usando-helm/">cómo instalar helm</a></b>)</li>
<li>Tienes el cliente de <strong>docker</strong> instalado localmente</li>
<li>Te sobran 10 minutos <img src="https://s.w.org/images/core/emoji/15.0.3/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></li>
</ul>
<p><strong>IMPORTANTE</strong>: Deberías tener cert-manager instalado en el clúster ya que Harbor requiere tener un certificado HTTPS válido para permitir el login desde la terminal.</p>
<h3>Instalando Harbor</h3>
<p>Vamos a usar el chart de helm oficial para esta parte. Para hacerlo, primero necesitarás añadir el repo de harbor:</p>
<div class="wp-block-codemirror-blocks code-block ">
<pre class="CodeMirror" data-setting="{">helm repo add harbor https://helm.goharbor.io</pre>
</div>
<p>Para personalizar tu despliegue puedes crear un nuevo fichero values.yaml, reemplaza el contenido con los valores más adecuados para ti:</p>
<div class="wp-block-codemirror-blocks code-block ">
<pre class="CodeMirror" data-setting="{">expose:
  type: ingress
  tls: 
    commonName: "TU_CN"
  ingress:
    hosts:
      core: "harbor.TU_DOMINIO"
persistence:
  enabled: true
externalURL: "https://harbor.TU_DOMINIO"
harborAdminPassword: admin</pre>
</div>
<p>Ahroa crearemos un nuevo namespace y desplegaremos el chart. Los valores a usar dependerán de tus necesidades:</p>
<div class="wp-block-codemirror-blocks code-block ">
<pre class="CodeMirror" data-setting="{">kubectl create harbor-system
helm install --wait harbor --namespace harbor-system harbor/harbor -f values.yaml</pre>
</div>
<p>En cuanto termine la instalación (puede tomar hasta 5 minutes) ya puedes ir al dominio usando tu navegador web y hacer login con el usuario admin y el password que definiste en el values.yaml. Tras el login deberías ver algo muy parecido a ésto:</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-4578" src="https://geko2.factoryfy.com/wp-content/uploads/harbor_main.png" alt="Harbor main screen" width="602" height="413" /></p>
<h3>Subiendo tu primera imagen</h3>
<p>Primero, debes hacer login desde el terminal usando el comando docker login y proporcionando tus credenciales:</p>
<div class="wp-block-codemirror-blocks code-block ">
<pre class="CodeMirror" data-setting="{">docker login https://harbor.YOUR_DOMAIN</pre>
</div>
<p><em>*Ten en cuenta de que para poder acceder a harbor a través de este dominio deberás crear una <strong>entrada de DNS</strong> en tu gestor de DNS y es imprescindible contar con un <strong>certificado HTTPS válido</strong></em></p>
<p>Haz click sobre «NEW PROJECT» y rellena los inputs:</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-4579" src="https://geko2.factoryfy.com/wp-content/uploads/harbor_new_project.png" alt="Harbor create new project" width="473" height="266" /></p>
<p>Tras hacer click en OK ya deberías poder ver tu nuevo proyecto en la página principal.</p>
<p>Ahora, vamos a probar a subir una nueva imagen a este proyecto. Haremos pull de la imagen oficial de nginx, pondremos un tag con la dirección de tu harbor/proyecto y haremos el push:</p>
<div class="wp-block-codemirror-blocks code-block ">
<pre class="CodeMirror" data-setting="{">docker pull nginx
docker tag nginx harbor.YOUR_DOMAIN/myproject/nginx:latest
docker push harbor.YOUR_DOMAIN/myproject/nginx:latest</pre>
</div>
<p>Si todo ha ido bien, deberías poder ver la imagen de nginx dentro del proyecto que creaste en harbor:</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-4580" src="https://geko2.factoryfy.com/wp-content/uploads/harbor_new_image.png" alt="Harbor new nginx image" width="805" height="125" /></p>
<h3>Y ahora, ¿qué?</h3>
<p>Has desplegado un nuevo Harbor registry privado y ya has subido tu primera imagen.</p>
<p>En la próxima entrada de esta serie veremos cómo crear las credenciales necesarias para que tus pods sean capaces de hacer pull de las imágenes que subas en tu Harbor privado y veremos cómo indicar a <a href="https://geko.cloud/es/que-es-kubernetes/">Kubernetes</a> cuando y cómo puede usar esas credenciales.</p>
<hr />
<p>Espero que hayas disfrutado de este post y te animo a que <a href="https://geko.cloud/es/blog/labs/">revises nuestro blog para leer otrosposts</a> que puedan ser de tu interés. <a href="https://geko.cloud/es/contacto/">No dudes en contactarnos</a> si deseas que te ayudemos en tus proyectos.</p>
<p>¡Nos vemos en la próxima entrada!</p>
<p>La entrada <a href="https://geko.cloud/es/harbor-instalar-un-registry-privado-en-kubernetes/">Harbor: Instalar un registry privado en Kubernetes</a> se publicó primero en <a href="https://geko.cloud/es/">Geko Cloud</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://geko.cloud/es/harbor-instalar-un-registry-privado-en-kubernetes/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Renueva tus certificados expirados en Kubernetes</title>
		<link>https://geko.cloud/es/certificado-expirado-kubernetes/</link>
					<comments>https://geko.cloud/es/certificado-expirado-kubernetes/#respond</comments>
		
		<dc:creator><![CDATA[Jose Luis Sánchez]]></dc:creator>
		<pubDate>Mon, 15 Feb 2021 13:05:32 +0000</pubDate>
				<category><![CDATA[Labs]]></category>
		<category><![CDATA[Jenkins]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<guid isPermaLink="false">https://geko2.factoryfy.com/es/?p=3600</guid>

					<description><![CDATA[<p>Jenkins Kubernetes Pod Template El otro día nos encontramos con un problema no muy común con uno de nuestros clientes&#8230; Resulta que algunas de las pipelines de Jenkins dejaron de funcionar ya que los nodos destinados a la ejecución de ciertas tareas, usaban nodos Kubernetes como ejecutores y se quedaban esperando que los pods encargados [&#8230;]</p>
<p>La entrada <a href="https://geko.cloud/es/certificado-expirado-kubernetes/">Renueva tus certificados expirados en Kubernetes</a> se publicó primero en <a href="https://geko.cloud/es/">Geko Cloud</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div style="display: none;"></div>
<div style="display: none;"></div>
<div style="display: none;"></div>
<div style="display: none;"></div>
<div style="display: none;"></div>
<div style="display: none;"></div>
<div style="display: none;"></div>
<div style="display: none;"></div>
<div style="display: none;"></div>
<div style="display: none;"></div>
<div style="display: none;"></div>
<div style="display: none;"></div>
<div style="display: none;"></div>
<div style="display: none;"></div>
<div style="display: none;"></div>
<div style="display: none;"></div>
<div style="display: none;"></div>
<div style="display: none;"></div>
<div style="display: none;"></div>
<div style="display: none;"></div>
<h2>Jenkins Kubernetes Pod Template</h2>
<p>El otro día nos encontramos con un problema no muy común con uno de nuestros clientes&#8230;</p>
<p>Resulta que <strong>algunas de las pipelines de Jenkins dejaron de funcionar</strong> ya que los nodos destinados a la ejecución de ciertas tareas, usaban nodos <strong>Kubernetes</strong> como ejecutores y se quedaban esperando que los pods encargados arrancaran:</p>
<div class="wp-block-codemirror-blocks code-block ">
<pre class="CodeMirror" data-setting="{">[Pipeline] node
Still waiting to schedule task
All nodes of label ‘docker-build-xxxxxx’ are offline</pre>
</div>
<p><a href="https://plugins.jenkins.io/kubernetes/">Aquí</a> os dejo un enlace con el plugin y su configuración por si os interesa usar esta gran funcionalidad</p>
<h2 class="lang-yaml s-code-block hljs">El problema</h2>
<p>Decidimos entrar a inspeccionar los nodos de Kubernetes para revisar la ejecución de los pods del namespace destinado a estas tareas y la API de Kubernetes nos responde lo siguiente en todos los comandos que lanzamos desde nuestro kubectl:</p>
<div class="wp-block-codemirror-blocks code-block ">
<pre class="CodeMirror" data-setting="{">Unable to authenticate the request due to an error: [x509: certificate has expired or is not yet valid, x509: certificate has expired or is not yet valid]</pre>
</div>
<p>Bingo! resulta que <strong>el certificado de nuestro Kubernetes que se usa para el cliente kubectl y el etcd ha expirado</strong>. Esto representa un pequeño problema ya que para renovar un certificado en Kubernetes, utilizamos las conexiones a la API para hacerlo, pero estas llamadas requieren de tener un certificado válido.</p>
<h4>Entonces qué hacemos??</h4>
<h2>Geko al rescate</h2>
<p>Existe una solución que pasa por <strong>destruir los certificados a mano</strong> y con el comando kubeadm inicializarlos <strong>engañando al control plane para que crea que no existen certificados previos</strong>.</p>
<p>Nuestro consejo es mover todos los certificados a una carpeta temporal para luego forzar la inicialización de nuevos certificados y finalmente inicializar la config de todo el cluster de kubernetes</p>
<div class="wp-block-codemirror-blocks code-block ">
<pre class="CodeMirror" data-setting="{">$ cd /etc/kubernetes/pki/ 
$ mkdir -p /tmp/oldcerts/etcd
$ mv {apiserver.crt,apiserver-etcd-client.key,apiserver-kubelet-client.crt,front-proxy-ca.crt,front-proxy-client.crt,front-proxy-client.key,front-proxy-ca.key,apiserver-kubelet-client.key,apiserver.key,apiserver-etcd-client.crt} /tmp/oldcerts 
$ mv etcd/* /tmp/oldcerts/etcd
$ kubeadm init phase certs all --apiserver-advertise-address  
$ cd /etc/kubernetes/ 
$ mv {admin.conf,controller-manager.conf,kubelet.conf,scheduler.conf} /tmp/oldcerts 
$ kubeadm init phase kubeconfig all 
$ reboot</pre>
</div>
<p class="lang-yaml s-code-block hljs">Tras el reinicio, nuestro cluster habrá arrancado utilizando los nuevos certificados y ya podremos copiar las credenciales en nuestro directorio home o en nuestro sistema personal para poder hacer las llamadas a la API.</p>
<div class="wp-block-codemirror-blocks code-block ">
<pre class="CodeMirror" data-setting="{">$ cp -i /etc/kubernetes/admin.conf $HOME/.kube/config</pre>
</div>
<p>Una vez copiado el config , ya podemos utilizar el cliente kubectl para conectar a nuestro <strong>K8S</strong>.</p>
<p>En nuestro caso eliminamos todos los pods huérfanos generados con jenkins en el namespace llamado «cicd»:</p>
<p>&nbsp;</p>
<div class="wp-block-codemirror-blocks code-block ">
<pre class="CodeMirror" data-setting="{">for docker in `kubectl get pods -n cicd | awk {'print $1'}`;do kubectl delete pod $docker -ncicd;done</pre>
</div>
<p>&nbsp;</p>
<p class="lang-yaml s-code-block hljs">Esperamos que os sirva para rescatar vuestro <strong>Kubernetes</strong> con certificados expirados! y recordar dejarnos vuestros comentarios&#8230;</p>
<p>Si os podemos ayudar con la configuración, incidencias o mejoras de vuestra plataforma <strong>Kubernetes</strong>, no dudéis en <a href="https://geko.cloud/es/contacto/">contactarnos</a>.</p>
<p>La entrada <a href="https://geko.cloud/es/certificado-expirado-kubernetes/">Renueva tus certificados expirados en Kubernetes</a> se publicó primero en <a href="https://geko.cloud/es/">Geko Cloud</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://geko.cloud/es/certificado-expirado-kubernetes/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Kubectl Plugins en solo 3 pasos</title>
		<link>https://geko.cloud/es/kubectl-plugins/</link>
					<comments>https://geko.cloud/es/kubectl-plugins/#respond</comments>
		
		<dc:creator><![CDATA[Christian]]></dc:creator>
		<pubDate>Tue, 05 Jan 2021 11:42:20 +0000</pubDate>
				<category><![CDATA[Labs]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<guid isPermaLink="false">https://geko2.factoryfy.com/es/?p=3313</guid>

					<description><![CDATA[<p>Introducción Muchas veces para realizar nuestras tareas diarias nos vemos en la situación de tener que crear herramientas propias para resolver problemas o situaciones a medida. En esta entrada voy a mostrar lo fácil que es y cómo podemos crear un plugin para kubectl. Un plugin es simplemente un programa ejecutable que permite extender la [&#8230;]</p>
<p>La entrada <a href="https://geko.cloud/es/kubectl-plugins/">Kubectl Plugins en solo 3 pasos</a> se publicó primero en <a href="https://geko.cloud/es/">Geko Cloud</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div style="display: none;"></div>
<div style="display: none;"></div>
<div style="display: none;"></div>
<h2>Introducción</h2>
<p class="aLF-aPX-K0-aPE">Muchas veces para realizar nuestras tareas diarias nos vemos en la situación de tener que crear herramientas propias para resolver problemas o situaciones a medida. En esta entrada voy a mostrar lo fácil que es y cómo podemos crear un <a href="https://kubernetes.io/docs/tasks/extend-kubectl/kubectl-plugins/">plugin para kubectl</a>.</p>
<p class="aLF-aPX-K0-aPE">Un<strong> plugin</strong> es simplemente un programa ejecutable que permite extender la funcionalidad de <a href="https://kubernetes.io/docs/tasks/tools/install-kubectl/">kubectl</a>, permitiendonos implementar nuestros propios subcomandos. Es importante mencionar que podemos hacerlo en el lenguaje que más nos guste: Bash, Python, Go, etc&#8230;</p>
<h3>¿Qué necesitamos?</h3>
<p class="aLF-aPX-K0-aPE">Existen ciertas condiciones que debemos cumplir para que nuestro <strong>plugin</strong> funcione:</p>
<ol>
<li class="aLF-aPX-K0-aPE">El nombre del archivo debe comenzar con «kubectl-» y no debe contener extensión.</li>
<li class="aLF-aPX-K0-aPE">El archivo debe ser ejecutable.</li>
<li class="aLF-aPX-K0-aPE">Debe encontrarse ubicado en nuestro <strong>PATH</strong></li>
</ol>
<p>Y esta es toda la instalación que requerirá. Simple, ¿no?</p>
<p class="aLF-aPX-K0-aPE">Podemos ver qué<strong> plugins</strong> tenemos disponibles utilizando:</p>
<div class="wp-block-codemirror-blocks code-block ">
<pre class="CodeMirror" data-setting="{">kubectl plugin list</pre>
</div>
<p class="aLF-aPX-K0-aPE">Este comando buscará dentro de <strong>PATH</strong> todos los archivos ejecutables que cumplan con el nombre requerido.</p>
<h2>¡Manos a la obra!</h2>
<h3>Creamos un entorno  de pruebas</h3>
<p class="aLF-aPX-K0-aPE">Hagamos un simple <strong>plugin</strong>, más entretenido que el trivial «Hola Mundo!», que envíe los logs de todos pods corriendo a una salida única para poder visualizar dicha salida de manera conjunta. Para hacerlo más entretenido agregaremos el nombre del pod colorido por cada línea de log en el output. Y además podremos seleccionar con las teclas numéricas de 1 a N (donde N es el enésimo pod: 1 &lt; N &lt; 10 por simpleza), filtrar <em>on-the-fly</em> y ver solamente la salida de ese pod. ¡Y todo esto lo haremos en Bash!</p>
<p class="aLF-aPX-K0-aPE">Para esta demo vamos a usar una imagen de docker <a href="https://hub.docker.com/r/kscarlett/nginx-log-generator">nginx-log-generator</a> que genera fake-logs del <strong>Nginx</strong>. Primero crearemos un <a href="https://kubernetes.io/docs/concepts/workloads/controllers/deployment/">deployment de kubernetes</a> que contendra los pods. Creamos un nuevo archivo llamado fake-logs.yaml con el siguiente contenido:</p>
<div class="wp-block-codemirror-blocks code-block ">
<pre class="CodeMirror" data-setting="{">apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-fake-logger
spec:
  template:
    metadata:
      name: logger-1
      labels:
        app: logger
    spec:
      containers:
        - name: logger
          image: kscarlett/nginx-log-generator
  replicas: 3
  selector:
    matchLabels:
      app: logger</pre>
</div>
<p class="aLF-aPX-K0-aPE">Y aplicamos el deployment:</p>
<div class="wp-block-codemirror-blocks code-block ">
<pre class="CodeMirror" data-setting="{">kubectl create -f fake-logs.yaml
</pre>
</div>
<p>Podemos comprobar que nuestros nuestro <em>deploy</em> esta funcionando:</p>
<div class="wp-block-codemirror-blocks code-block ">
<pre class="CodeMirror" data-setting="{">$ kubectl get pods
NAME                              READY   STATUS    RESTARTS   AGE
my-fake-logger-66dcffbccd-6kx8b   1/1     Running   4          6d2h
my-fake-logger-66dcffbccd-7q4tm   1/1     Running   1          3d1h
my-fake-logger-66dcffbccd-cff4s   1/1     Running   1          3d1h

$ kubectl get deploy
NAME             READY   UP-TO-DATE   AVAILABLE   AGE
my-fake-logger   3/3     3            3           6d2h

</pre>
</div>
<h3 class="aLF-aPX-K0-aPE">Creamos el plugin:</h3>
<p><strong>Primero: </strong>Crearemos el archivo de nuestro<strong> plugin</strong> llamado <strong>kubectl-demo</strong> con el siguiente <em>script</em>.</p>
<p>&nbsp;</p>
<div class="wp-block-codemirror-blocks code-block ">
<pre class="CodeMirror" data-setting="{">#!/bin/bash
trap ctrl_c INT
function ctrl_c() {
  echo "**************************************** Bye Bye ****************************************"
  for pid in ${PIDS[@]}
  do
      kill -TERM $pid 
  done
  rm $NAMED_PIPE
  rm $sync
  exit 0
}

function colorize() {

  pod=$1
  counter=$2
  # colors from 31 to 39
  pre_colour="\033[3${counter}m"
  post_colour="\033[0m"
  if [ "$colorize_output" = true ]
  then
    colour_pod="${pre_colour}[${pod}]${post_colour}"
  else
    colour_pod="[${pod}]"
  fi
}

function show_logs() {
  local sync="$1"
  grep -E -f $sync $NAMED_PIPE &amp;
}

function banner() {
  echo ""
  echo "==================================================="
  echo "+ Showing logs for:"
  echo "+ $1"
  echo "==================================================="
  echo ""
}

function start_log() {
  show_logs $sync 
  shl_pid=$!
  disown $shl_pid
  PIDS+=$shl_pid" "  
}

function usage() {
  echo "~~~~~~~~~~~"
  echo " U S A G E"
  echo "~~~~~~~~~~~"
  echo "Usage: kubectl demo [option]"
  echo "  options:"
  echo "    --no-colorize: no colorize [default: colorize]"
  echo "    -h: Show this help"
  echo ""
  echo "When running you can use the numbers 1 to N to filter N-pod and only show it's output."
  echo "0 resets and shows all outputs again"
  echo ""
}

NAMED_PIPE="/tmp/my_named_pipe"
PODS=$(kubectl get pods --no-headers=true -o=custom-columns=NAME:.metadata.name)
TOTAL_PODS=$(echo $PODS | sed -s 's/ /n/g' | wc -l)
colorize_output=true

if [[ $@ ]]; then
  case "$@" in
    "--no-colorize")
      colorize_output=false
      ;;
    "-h")
      usage
      exit 1
      ;;
    *) echo "Invalid option"
      exit 1
      ;;
  esac
fi


# create named pipe
if [ ! -p $NAMED_PIPE ]
then
    mkfifo $NAMED_PIPE
    chmod a+rw $NAMED_PIPE
fi

PIDS=()
declare -A pods_index
counter=1
for pod in $(echo $PODS)
do
  colour_pod=""
  colorize $pod $counter
  kubectl logs -f $pod | awk -v pod_name=$colour_pod '{print pod_name" "$0}' &gt; $NAMED_PIPE &amp;
  PIDS+=$!" " # save all PIDs
  pods_index[$counter]=$pod
  counter=$((counter+1))
done

# Trick: Shared memory segment for inter process comunication. 
sync=/dev/shm/syntest-$$  # allocate a shared memory segment name for this pid
echo '' &gt; $sync           # init the shm

start_log
input="*"
re='^[0-9]+$' # we match only numbers

while true
do
  read -t 0.25 -N 1 input
  if  [[ $input =~ $re ]]  &amp;&amp; [ "$input" -ge "0" ] &amp;&amp; [ "$input" -le "$TOTAL_PODS" ]
  then
    if [ "$input" -eq "0" ]
    then
      banner "All Pods"
      echo $ &gt; $sync    # grep everything
    else
      banner ${pods_index[$input]}
      echo ${pods_index[$input]} &gt; $sync  # grep only pod name
    fi
    kill -SIGTERM $shl_pid
    PIDS=$(echo $PID | sed -e "s/$shl_pid//g" | tr -s " ")  # remove unused pid
    start_log
  fi
done
</pre>
</div>
<p>&nbsp;</p>
<p><strong>Segundo: </strong>Le daremos permisos de ejecución.</p>
<div class="wp-block-codemirror-blocks code-block ">
<pre class="CodeMirror" data-setting="{">chmod +x kubectl-demo
</pre>
</div>
<p><strong>Tercero: </strong>Y último paso, necesitamos que este accesible en nuestro <strong>PATH.</strong></p>
<div class="wp-block-codemirror-blocks code-block ">
<pre class="CodeMirror" data-setting="{">ln -s $PWD/kubectl-demo /usr/local/bin/kubectl-demo</pre>
</div>
<p>A partir de ahora, y sin nada más que hacer, podemos hacer uso de nuestro recién creado <strong>plugin</strong>.</p>
<p>Podemos comprobar que <strong>kubectl</strong> está listo para usarlo listando los <strong>plugins</strong> que encuentra:</p>
<div class="wp-block-codemirror-blocks code-block ">
<pre class="CodeMirror" data-setting="{">$ kubectl plugin list
The following compatible plugins are available:

/home/user/kubectl-demo</pre>
</div>
<h2> ¡Pongámoslo a prueba!</h2>
<p>Mostramos las opciones posibles:</p>
<div class="wp-block-codemirror-blocks code-block">
<pre class="CodeMirror" data-setting="{">$ kubectl demo -h
~~~~~~~~~~~
 U S A G E
~~~~~~~~~~~
Usage: kubectl demo [option]
  options:
    --no-colorize: no colorize [default: colorize]
    -h: Show this help

When running you can use the numbers 1 to N to filter N-pod and only show it's output.
0 resets and shows all outputs again</pre>
</div>
<p>A modo de ejemplo de cómo podemos pasar parámetros a nuestros sub-comandos, hemos agregado la opción para permitir no pintar el output.</p>
<h2>Outputs</h2>
<p>Default:</p>
<div class="wp-block-codemirror-blocks code-block ">
<pre class="CodeMirror" data-setting="{">[my-fake-logger-66dcffbccd-7q4tm] 214.216.236.37--[02/Jan/2021:10:17:17+0000] "GET/moderator/Reduced.cssHTTP/1.1"....
[my-fake-logger-66dcffbccd-6kx8b] 132.56.98.34--[02/Jan/2021:10:19:22+0000] "GET/standardization.svgHTTP/1.1"2001908 
[my-fake-logger-66dcffbccd-cff4s] 159.240.103.70--[02/Jan/2021:10:24:45+0000] "GET/Virtual.htmHTTP/1.1"2002288"-"....
</pre>
</div>
<p>Podemos elegir que pod mostrar con los números del 1 a 3 en este caso:</p>
<div class="wp-block-codemirror-blocks code-block ">
<pre class="CodeMirror" data-setting="{"># 1
===================================================
+ Showing logs for:
+ my-fake-logger-66dcffbccd-6kx8b
===================================================
[my-fake-logger-66dcffbccd-6kx8b]  16.211.208.91 - - [02/Jan/2021:10:34:33 +0000]  "GET /bottom-line%20Advanced/Upgradable/intermediate.svg HTTP/1.1" ....
</pre>
</div>
<p>Y podemos resetear esta vista con el número 0 y volver a tener todos los logs:</p>
<div class="wp-block-codemirror-blocks code-block ">
<pre class="CodeMirror" data-setting="{">===================================================
+ Showing logs for:
+ All Pods
===================================================
[my-fake-logger-66dcffbccd-7q4tm] 214.216.236.37--[02/Jan/2021:10:17:17+0000] "GET/moderator/Reduced.cssHTTP/1.1"30143"-"....
[my-fake-logger-66dcffbccd-6kx8b]  16.211.208.91 - - ....
</pre>
</div>
<p>Como vemos el script es simple y te invito a que pruebes todas sus opciones, modifiques a tu gusto y extiendas su funcionalidad.</p>
<h2>Conclusión:</h2>
<p>Hemos visto que es sumamente sencillo crear un plugin para <strong>kubectl</strong>, basta con programar lo que nuestra imaginación quiera y cumplir con el nombre y ubicación del ejecutable.</p>
<p>Por esta facilidad, no existe excusa para no hacer un plugin prácticamente por cada necesidad específica que necesitemos de <strong>kubectl</strong>.<br />
También es necesario comentar que existe una gran cantidad de <a href="https://github.com/ishantanu/awesome-kubectl-plugins">plugins provistos por la comunidad</a>.<br />
¡Vale la pena echar un vistazo!</p>
<p>Espero que este artículo te haya servido de ayuda para aprender algo nuevo y seguir ampliando tus conocimientos.</p>
<p>Te invito a que si necesitas información sobre el mundo <a href="https://geko.cloud/es/devops/"><strong>DevOps </strong></a>o<strong><a href="https://geko.cloud/es/que-es-kubernetes/"> Kubernetes</a>,</strong> <a href="https://geko.cloud/es/contacto/">nos contactes</a> y sigas revisando <a href="https://geko.cloud/es/blog/">nuestro blog </a>para encontrar otras publicaciones útiles. ¡Hasta la próxima!</p>
<p><a href="https://geko.cloud/es/contacto/"><img loading="lazy" decoding="async" class="aligncenter wp-image-3265" src="https://geko2.factoryfy.com/wp-content/uploads/geko-1-150x150.png" alt="" width="82" height="82" /></a></p>
<p>La entrada <a href="https://geko.cloud/es/kubectl-plugins/">Kubectl Plugins en solo 3 pasos</a> se publicó primero en <a href="https://geko.cloud/es/">Geko Cloud</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://geko.cloud/es/kubectl-plugins/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Kubernetes CronJobs &#8211; Una vista en profundidad</title>
		<link>https://geko.cloud/es/kubernetes-cronjobs/</link>
					<comments>https://geko.cloud/es/kubernetes-cronjobs/#respond</comments>
		
		<dc:creator><![CDATA[Geko Cloud]]></dc:creator>
		<pubDate>Mon, 23 Nov 2020 10:41:46 +0000</pubDate>
				<category><![CDATA[Labs]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<guid isPermaLink="false">https://geko2.factoryfy.com/?p=3079</guid>

					<description><![CDATA[<p>Introducción Hoy en día, y cada vez más, es común que las empresas migren algunas partes de su infraestructura (o incluso la compañía entera) al cloud. Hay dos principales enfoques: Permanecer lo mas cerca posible de la antigua arquitectura usando VMs, o apostar por flexibilidad/escalabilidad/disponibilidad y buscar una nueva perspectiva mediante el uso de un [&#8230;]</p>
<p>La entrada <a href="https://geko.cloud/es/kubernetes-cronjobs/">Kubernetes CronJobs &#8211; Una vista en profundidad</a> se publicó primero en <a href="https://geko.cloud/es/">Geko Cloud</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>Introducción</h2>
<p style="text-align: justify;">Hoy en día, y cada vez más, es común que las empresas migren algunas partes de su infraestructura (o incluso la compañía entera) al <a href="https://geko2.factoryfy.com/es/que-es-cloud/">cloud</a>. Hay dos principales enfoques: Permanecer lo mas cerca posible de la antigua arquitectura usando <a href="https://en.wikipedia.org/wiki/Virtual_machine">VMs</a>, o apostar por flexibilidad/escalabilidad/disponibilidad y buscar una nueva perspectiva mediante el uso de un orquestador de contenedores como <a href="https://geko.cloud/es/que-es-kubernetes/">Kubernetes</a>. Centrándose en esta última opción (<a href="https://geko.cloud/es/que-es-kubernetes/"><strong>Kubernetes</strong></a>), lo que anteriormente se ejecutaba directamente sobre un Sistema Operativo (y que por tanto tenía acceso a la mayoría de aplicaciones que provee dicho Sistema) ahora se ejecuta dentro de contenedores. Además, estos contenedores comúnmente no se ejecutan en un destino (máquina/nodo) específico, sino en un <a href="https://en.wikipedia.org/wiki/Computer_cluster">clúster</a>. Todo funciona bien y todo es fantástico, hasta que uno se da cuenta de que el entorno ya no es tan amigable y conocido como cabría esperar. Herramientas de Sistema Operativo, como las <em>tareas programadas</em> o <a href="https://en.wikipedia.org/wiki/Cron">Crones</a>, no encajan en las <a href="https://cloud.google.com/solutions/best-practices-for-building-containers">buenas prácticas de los contenedores</a>, ya que son trasversales al Sistema (lo que es lo opuesto a la filosofía que se predica para los contenedores, consistente en aislar cada aplicación). Incrustar esas herramientas (o sus comportamientos) en la aplicación, al mismo tiempo que se aísla la misma, puede llegar a convertirse en una ardua tarea plagada de parches temporales y prácticas no tan buenas.</p>
<p style="text-align: justify;">Como ecosistema <del>completo</del> grande, <a href="https://geko.cloud/es/que-es-kubernetes/"><strong>Kubernetes</strong></a> provee por su cuenta algunas de las funcionalidades anteriormente mencionadas, de modo que los requerimientos del día a día puedan ser atendidos y gestionados. Sin embargo, aparecen nuevas operativas y posibilidades cuando se habla de clústeres y contenedores. A lo largo de las siguientes líneas se describirá cómo <a href="https://geko.cloud/es/que-es-kubernetes/"><strong>Kubernetes</strong></a> ha solucionado la funcionalidad Cron, así como la mayoría de sus nuevas características y detalles ocultos.</p>
<h2>1. Cómo funcionan los CronJobs en Kubernetes realmente</h2>
<p><img loading="lazy" decoding="async" class=" wp-image-3091 alignright" src="https://geko2.factoryfy.com/wp-content/uploads/diagram1.png" alt="cronjob-job-pod" width="112" height="245" /></p>
<p style="text-align: justify;">Cuando se crea un recurso <strong>CronJob</strong>, lo que hace realmente <a href="https://geko.clou/es/que-es-kubernetes/"><strong>Kubernetes</strong></a> es registrar una programación en el tiempo. <a href="https://github.com/kubernetes/kubernetes/blob/392bf0adef478175b9cf0226b02820eb1820f797/pkg/controller/cronjob/cronjob_controller.go#L95-L96">Cada 10 segundos el Controlador de CronJobs comprueba si hay programaciones que coincidan y de las que deba ocuparse</a>. Cuando llega el momento señalado se crea un recurso Job, que deberá hacerse cargo de la tarea para esa ejecución específica. Finalmente cada Job crea un recurso Pod, que será el ejecutor final.</p>
<p style="text-align: justify;">Como probablemente se haya podido apreciar ya, esta aproximación difiere significativamente del enfoque que tiene un Sistema Operativo. Lo que se observa aquí es un desacoplamiento entre el sistema de programación en el tiempo (Cron) y la gestión de las ejecuciones (Jobs). Esto permite al clúster (y por tanto al usuario) gestionar tareas efímeras sin perder el control sobre ellas.</p>
<p style="text-align: justify;">Cabe además mencionar que los Jobs pueden crear uno o más Pods (permitiendo concurrencia/paralelismo) a la vez que se aseguran que las tareas se completan satisfactoriamente. <strong>Sin embargo, este último comportamiento podría crear complejidades adicionales ya que los contenedores ya incorporan su propia funcionalidad de gestión de fallos y reinicios.</strong> Este tema será abordado en la siguiente sección.</p>
<h2>2. Cómo configurar los detalles avanzados</h2>
<p style="text-align: justify;">Debe tenerse en cuenta que para configurar un <strong>CronJob</strong>, cada recurso subyacente debe configurarse también. Esto significa que la configuración de un <strong>CronJob</strong> agrega <a href="https://kubernetes.io/docs/tasks/job/automated-tasks-with-cron-jobs/#writing-a-cron-job-spec">sus propios parámetros</a> además de las <a href="https://kubernetes.io/docs/concepts/workloads/controllers/job/#writing-a-job-spec">propiedades del Job</a> y de las especificaciones del Pod/contenedor. Teniendo en cuenta que la mayoría de las operativas comunes se pueden entender y conseguir leyendo la documentación, el propósito de esta sección es mostrar cómo obtener ciertas funcionalidades avanzadas mediante la configuración.</p>
<h3>Gestionar los errores</h3>
<p style="text-align: justify;">Cuando un contenedor detiene su ejecución (ya sea por un fallo o después de una ejecución satisfactoria) existen una serie de acciones que se pueden tomar justo después, las cuales son definidas (como de costumbre) por las directivas del propio recurso. Las acciones típicas son reiniciar el contenedor (siempre o sólo cuando ha sucedido algún error) o bien no hacer nada. Pero, además, los Jobs añaden una capa de complejidad adicional que se encarga de que la tarea se termine adecuadamente. Esto quiere decir que la política de reinicios se garantiza desde dos capas diferentes, que a su vez deben gestionarse desde dos partes diferentes.</p>
<p style="text-align: justify;">Desde el lado de los contenedores, la directiva se llama <a href="https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy">restartPolicy</a>. En el lado de los Jobs, la política se gestiona mediante la directiva <a href="https://kubernetes.io/docs/concepts/workloads/controllers/job/#pod-backoff-failure-policy">backoffLimit</a>, la cual  especifica el <strong>número</strong> de fallos permitidos antes dejar de reiniciar la tarea. Teniendo ambas en cuenta, obtener la configuración para un <strong>CronJob</strong> que pueda fallar sin reinicios se aproxima a lo siguiente.</p>
<div class="wp-block-codemirror-blocks code-block ">
<pre class="CodeMirror" data-setting="{">apiVersion: batch/v1beta1
kind: CronJob
...
spec:
  ...
  jobTemplate:
    spec:
      <strong>backoffLimit: 0</strong>
      template:
        spec:
          containers:
            ...
          <strong>restartPolicy: Never</strong></pre>
</div>
<h3>Ejecuciones Solapadas vs. Secuenciales</h3>
<p style="text-align: justify;">Cuando se habla de un <strong>CronJob</strong> en específico, podrían coexistir varias ejecuciones. Dependiendo del tipo de operativa que caracterice a la tarea, la concurrencia podría ser una forma de proceder para acelerar el procesamiento. Existen tres vías disponibles para gestionar cómo se ejecutan los Jobs, las cuales son controladas mediante la directiva <a href="https://kubernetes.io/docs/tasks/job/automated-tasks-with-cron-jobs/#concurrency-policy">concurrencyPolicy</a>.</p>
<ol>
<li><strong>Allow</strong>: Permite ejecuciones solapadas.</li>
<li><strong>Replace</strong>: Las nuevas ejecuciones fuerzan, antes de comenzar, que se terminen las ejecuciones previas.</li>
<li><strong>Forbid</strong>: Las nuevas ejecuciones se descartan si una ejecución previa todavía está en ejecución.</li>
</ol>
<p style="text-align: justify;">Mientras que la primera permite la concurrencia, las dos últimas apuestan por ejecuciones secuenciales. Una vez más, para seguir el estilo de los crones de la vieja escuela, la opción que más se aproxima es <strong>Allow</strong>. Por otra parte, las ejecuciones concurrentes pueden desembocar en efectos no deseados si no se tratan adecuadamente, y es algo que se debe tener en cuenta y tratarse con cautela.</p>
<h3>Tiempo mínimo de ejecución</h3>
<p style="text-align: justify;">Como ya se ha visto anteriormente, las nuevas ejecuciones de tareas pueden llegar a interferir con las anteriores, dependiendo de cómo se establezcan las directivas de concurrencia. Existe una propiedad en la especificación de los contenedores (<a href="https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#hook-handler-execution">terminationGracePeriodSeconds</a>) que se puede emplear para sobrellevar las consecuencias de interrumpir ejecuciones. Mediante su uso se puede definir un tiempo mínimo de ejecución, de modo que aunque una nueva tarea fuerce la terminación de una previa, se garantiza una terminación grácil.</p>
<h2>3. Operar con los CronJobs como un Maestro</h2>
<p style="text-align: justify;">Una vez la configuración pone de manifiesto lo que se pretende que haga el CronJob, <a href="https://kubernetes.io/docs/tasks/job/automated-tasks-with-cron-jobs">los comandos básicos pueden ser utilizados para recuperar su estado</a> (información acerca de la programación, el estado de ejecución, logs, &#8230;). Al igual que en la sección anterior, las siguientes operativas cubren cómo obtener algunas funcionalidades menos comunes.</p>
<h3>Habilitar/Deshabilitar los CronJobs</h3>
<p style="text-align: justify;">La especificación de los <strong>CronJobs</strong> contiene una propiedad llamada <a href="https://kubernetes.io/docs/tasks/job/automated-tasks-with-cron-jobs/#suspend">suspend</a> que permite deshabilitarlos. Ya sea de manera temporal o permanente, los <strong>CronJobs</strong> se pueden definir sin que ello implique que vayan a ser ejecutados (a pesar de lo que indiquen sus programaciones en el tiempo).</p>
<div class="wp-block-codemirror-blocks code-block ">
<pre class="CodeMirror" data-setting="{"># Deshabilitar un CronJob
NOMBRE_CRONJOB=mi-cronjob-1
kubectl patch cronjobs $NOMBRE_CRONJOB -p '{"spec" : {"suspend" : true }}'

# Deshabilitar TODOS los CronJobs
kubectl get cronjobs | grep False | cut -d' ' -f 1 | xargs kubectl patch cronjobs -p '{"spec" : {"suspend" : true }}'</pre>
</div>
<p><strong>Echa un vistazo a la siguiente sección para descubrir más detalles sobre los efectos colaterales que esto podría causar.</strong></p>
<h3>Ejecutar CronJobs manualmente</h3>
<p style="text-align: justify;">Es ampliamente reconocido que las pruebas (comunmente llamados tests, del Inglés) son útiles para detectar efectos no deseados. Los <strong>CronJobs</strong> se pueden ejecutar manualmente incluso cuando están desactivados, por lo que mantenerlos en ese estado y poder ejecutarlos bajo circunstancias que sirvan para probarlos puede ayudar a validar que todo está correctamente configurado.</p>
<div class="wp-block-codemirror-blocks code-block ">
<pre class="CodeMirror" data-setting="{">NOMBRE_CRONJOB=mi-cronjob-1
kubectl create job --from=cronjobs/$NOMBRE_CRONJOB $NOMBRE_CRONJOB-ejec-manual-01</pre>
</div>
<h2>4. Sacando a la luz los casos poco frecuentes</h2>
<p style="text-align: justify;">Después de todo, no existiría la variedad si todo funcionase igual. Cada situación tiene sus propias particularidades y características especiales, por lo que cuando se trata de los <strong>CronJobs</strong> la cosa no es diferente. A lo largo de las siguientes líneas se presentarán y tratarán algunos casos poco frecuentes, de modo que las soluciones aportadas puedan ser reutilizadas (o, al menos, tenidas en consideración).</p>
<h3>Tiempo máximo de ejecución</h3>
<p style="text-align: justify;">En secciones anteriores se trató el tema del tiempo de ejecución, de modo que se garantizase un tiempo mínimo antes de forzar la terminación. Pero, ¡eh! ¿Qué sucede con las ejecuciones que se alarguen en el tiempo más allá de lo previsto? La motivación (desde un punto de vista agnóstico) de los contenedores (y también la de <a href="https://geko.clou/es/que-es-kubernetes/"><strong>Kubernetes</strong></a>) es la de ejecutar las tareas hasta el infinito y más allá. Los contenedores pueden fluir o pueden <em>crashear</em> (fallar), pero no se deben terminar como una práctica habitual. Siguiendo este principio, no existe ninguna forma de gestionar la expiración del tiempo previsto desde la especificación de los CronJobs/Jobs/Contenedores. ¿Entonces, es imposible implantar un tiempo máximo de ejecución? — ¡No, no lo es! En este punto es donde el abanico de herramientas de Linux aparece al rescate. Existe un comando llamado <a href="https://linux.die.net/man/1/timeout">timeout</a> que puede ser usado para ejecutar otro comando durante una cantidad específica de tiempo.</p>
<p style="text-align: justify;">Aunque la utilidad anterior puede limitar el tiempo, el código de salida de la ejecución cuando lo hace, no es un código exitoso; por lo que el contenedor entrará en un estado de fallo (que puede escalar en un reinicio si así está especificado). Por otra parte, el estado del comando que se quiere ejecutar se puede preservar, pero entonces no se puede saber si fue terminado o no. Entonces, ¿cómo tratar ambas situaciones? En el siguiente extracto de código se puede hallar una propuesta que consigue terminar siempre de manera satisfactorio, a la vez que se devuelve retroalimentación acerca de lo ocurrido en realidad.</p>
<div class="wp-block-codemirror-blocks code-block ">
<pre class="CodeMirror" data-setting="{">containers:
  - name: "mi-container-limitado-a-10s"
    ...
    command: ["bash", "-c"]
    args:
      - /usr/bin/timeout 10 bash -c 'bash -c "com arg1" &amp;&amp; echo OK || echo KO-COM' || echo KO-TMP</pre>
</div>
<h3>CronJobs que no se ejecutan después de haber sido desactivados y activados de nuevo</h3>
<p style="text-align: justify;">Se produce un efecto colateral cuando se desactiva un <strong>CronJob</strong>, que consiste en que después de haberse perdido 100 programaciones en el tiempo, el <strong>CronJob</strong> no se volverá a ejecutar. Esta información ya se señala en la documentación, pero se menciona de pasada y se trata como algo poco relevante. La solución en este caso es volver a crear el recurso.</p>
<h3>CronJobs que se ejecutan fuera de su programación después de haber sido reactivados</h3>
<p style="text-align: justify;">Se puede encontrar otro efecto no esperado cuando se trata con <strong>CronJobs</strong>, que consiste en que al reactivar uno de ellos (y a pesar del hecho de que el momento en el que se haga no coincida con el que tiene programado) se ejecuta inmediatamente. Esto sucede porque la ejecución no es simplemente un evento aislado, sino una ventana de tiempo con una fecha límite. Esto implica que cada ejecución que se pierde (por la política de concurrencia, o por estar el <strong>CronJob</strong> deshabilitado) incrementa un contador (hasta cierta cantidad, lo que probablemente está relacionado con el caso poco frecuente anterior). Entonces, llegado el momento, cuando el <strong>CronJob</strong> se vuelve a activar y se permite de nuevo su ejecución, el controlador tiene en cuenta que existen programaciones pendientes. Si la ventana de tiempo no se ha cerrado aún, el <strong>CronJob</strong> comienza a ejecutarse.</p>
<p style="text-align: justify;">Este comportamiento puede gestionarse estableciendo la directiva <a href="https://medium.com/@hengfeng/what-does-kubernetes-cronjobs-startingdeadlineseconds-exactly-mean-cc2117f9795f">startingDeadlineSeconds</a> en un valor pequeño, de modo que la ventana de ejecución no coincida con el momento de la reactivación.</p>
<h3>CronJobs que no se ejecutan</h3>
<p style="text-align: justify;">Cabe tener en cuenta que la anterior directiva <strong><em>startingDeadlineSeconds</em> se puede establecer en cualquier valor, pero no todos ellos van a causar el efecto deseado</strong>. Como ya se ha mencionado anteriormente el controlador de CronJobs se ejecuta cada 10 segundos, por lo que <strong>todo valor por debajo de diez segundos hará que los CronJobs nunca se ejecuten</strong>. Se ha enviado una <a href="https://github.com/kubernetes/website/issues/23622">incidencia</a> al proyecto de website de <a href="https://geko.clou/es/que-es-kubernetes/"><strong>Kubernetes</strong></a>, avisándoles de este caso. Seguramente en siguientes versiones se podrá encontrar que ya se ha documentado, aunque no sea así por el momento.</p>
<p><strong>Así que no se debe olvidar establecer <em>startingDeadlineSeconds</em> en un valor mayor que 10.</strong></p>
<h2>Conclusión</h2>
<p style="text-align: justify;">Como habrás podido comprobar, la diferencia entre los crones de Sistema Operativo y los de <a href="https://geko.clou/es/que-es-kubernetes/"><strong>Kubernetes</strong></a> es mayor de la esperable desde un primer momento. Existen diferentes escenarios en un clúster y numerosas situaciones gestionar, y por eso se tratan. En algunos casos estaremos buscando un comportamiento similar al que podemos obtener en un Sistema Operativo, y en otros casos no, pero probablemente todos ellos pueden ser abordados. Por otra parte, que algo se incline mucho al multi-propósito también puede derivar (como los <strong>CronJobs</strong>) en una experiencia de configuración con una mayor dificultad.</p>
<p style="text-align: justify;">Afortunadamente siempre puedes contar con el equipo de <a href="https://geko2.factoryfy.com/">Geko</a> (un equipo de ingenieros altamente cualificados), quienes profundizarán en el tema hasta conseguir hacerlo sencillo para ti. ¡No olvides volver por el <a href="https://geko.cloud/es/blog/labs/">blog de Geko</a> para comprobar qué hay nuevo por aquí! El equipo de <a href="https://geko2.factoryfy.com/">Geko</a> siempre estará más que contento de verte por aquí, y por supuesto <a href="https://geko.cloud/es/contacto/" target="_blank" rel="noopener noreferrer">¡Ponte en contacto con nosotros para más información!</a></p>
<h2>Lectura adicional</h2>
<p><a href="https://kubernetes.io/docs/tasks/job/automated-tasks-with-cron-jobs/">https://kubernetes.io/docs/tasks/job/automated-tasks-with-cron-jobs/</a><br />
<a href="https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/">https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/</a><br />
<a href="https://kubernetes.io/docs/concepts/workloads/controllers/job/">https://kubernetes.io/docs/concepts/workloads/controllers/job/</a><br />
<a href="https://www.magalix.com/blog/kubernetes-patterns-the-cron-job-pattern">https://www.magalix.com/blog/kubernetes-patterns-the-cron-job-pattern</a><br />
<a href="https://medium.com/@bambash/kubernetes-docker-and-cron-8e92e3b5640f">https://medium.com/@bambash/kubernetes-docker-and-cron-8e92e3b5640f</a><br />
<a href="https://medium.com/cloud-native-the-gathering/how-to-write-and-use-kubernetes-cronjobs-3fbb891f88b8">https://medium.com/cloud-native-the-gathering/how-to-write-and-use-kubernetes-cronjobs-3fbb891f88b8</a><br />
<a href="https://medium.com/@hengfeng/what-does-kubernetes-cronjobs-startingdeadlineseconds-exactly-mean-cc2117f9795f">https://medium.com/@hengfeng/what-does-kubernetes-cronjobs-startingdeadlineseconds-exactly-mean-cc2117f9795f</a></p>
<p>La entrada <a href="https://geko.cloud/es/kubernetes-cronjobs/">Kubernetes CronJobs &#8211; Una vista en profundidad</a> se publicó primero en <a href="https://geko.cloud/es/">Geko Cloud</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://geko.cloud/es/kubernetes-cronjobs/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Kubernetes gestionados «alternativos»</title>
		<link>https://geko.cloud/es/kubernetes-gestionados-alternativos/</link>
					<comments>https://geko.cloud/es/kubernetes-gestionados-alternativos/#respond</comments>
		
		<dc:creator><![CDATA[David Pujadas]]></dc:creator>
		<pubDate>Tue, 03 Nov 2020 08:16:01 +0000</pubDate>
				<category><![CDATA[Labs]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<guid isPermaLink="false">https://geko2.factoryfy.com/es/?p=2822</guid>

					<description><![CDATA[<p>Introducción Todos conocemos la oferta de Kubernetes gestionados del «big three»: EKS, GKE y AKS. Pero a día de hoy, aparte de los anteriores y de algunos más que quieren jugar en la misma liga (Oracle o IBM, por ejemplo), existen otros proveedores menos conocidos que, no pudiendo competir en catálogo de servicios, intentan hacerse [&#8230;]</p>
<p>La entrada <a href="https://geko.cloud/es/kubernetes-gestionados-alternativos/">Kubernetes gestionados «alternativos»</a> se publicó primero en <a href="https://geko.cloud/es/">Geko Cloud</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h3>Introducción</h3>
<p>Todos conocemos la oferta de <strong><a href="https://geko.cloud/es/que-es-kubernetes/">Kubernetes</a> gestionados</strong> del «big three»: EKS, GKE y AKS.</p>
<p>Pero a día de hoy, aparte de los anteriores y de algunos más que quieren jugar en la misma liga (Oracle o IBM, por ejemplo), existen otros proveedores menos conocidos que, no pudiendo competir en catálogo de servicios, intentan hacerse un hueco ofreciendo sencillez y precios más bajos. Una de las bondades que ha traído la «explosión» de <a href="https://geko.cloud/es/que-es-kubernetes/"><strong>Kubernetes</strong></a> es que con él y poco más (un load balancer, algo de almacenamiento y una base de datos gestionada) se puede llegar muy lejos antes de necesitar lo que ofrecen los grandes.</p>
<p>Así que, cuando hablamos de <a href="https://geko.clou/es/que-es-kubernetes/"><strong>Kubernetes</strong></a> «sencillo y barato», la fórmula consiste en ofrecer el servicio de «<strong>Kubernetes gestionado</strong>» (los nodos master son alojados y gestionados por el proveedor) sin cobrar por ello. Y esto es justamente lo que proporcionan proveedores como Scaleway, Linode, OVH o <strong>DigitalOcean</strong>.</p>
<h3>Probando un clúster gestionado</h3>
<p>En <a href="https://geko.cloud/es/"><strong>Geko Cloud</strong></a> estamos desarrollando un producto basado en <a href="https://geko.cloud/es/que-es-kubernetes/"><strong>Kubernetes</strong></a> del que muy pronto tendréis más noticias, así que decidimos usarlo para probar uno de los servicios de la lista (en este caso, <strong>Digital Ocean Kubernetes Service</strong>).</p>
<p><strong>Crear un cluster</strong> es muy sencillo: basta con seleccionar la versión, la región, el tipo de nodo para el pool y darle un nombre:</p>
<p>&nbsp;</p>
<figure id="attachment_5398" aria-describedby="caption-attachment-5398" style="width: 686px" class="wp-caption alignnone"><img loading="lazy" decoding="async" class="size-large wp-image-5398" src="https://geko.cloud/wp-content/uploads/2020/11/control-panel-digitalocean-1-686x1024.png" alt="Control Panel DigitalOcean" width="686" height="1024" srcset="https://geko.cloud/wp-content/uploads/2020/11/control-panel-digitalocean-1-686x1024.png 686w, https://geko.cloud/wp-content/uploads/2020/11/control-panel-digitalocean-1-201x300.png 201w, https://geko.cloud/wp-content/uploads/2020/11/control-panel-digitalocean-1-768x1146.png 768w, https://geko.cloud/wp-content/uploads/2020/11/control-panel-digitalocean-1-1029x1536.png 1029w, https://geko.cloud/wp-content/uploads/2020/11/control-panel-digitalocean-1.png 1200w" sizes="(max-width: 686px) 100vw, 686px" /><figcaption id="caption-attachment-5398" class="wp-caption-text">Creación cluster k8s DO</figcaption></figure>
<p>En nuestro caso, al tratarse de una prueba, elegimos crear <strong>droplets básicos</strong> y confiar en el <em>cluster autoscaler</em> en caso que la aplicación fuera a necesitar más recursos.</p>
<p>Cuando el clúster estuvo listo (el proceso puede tardar unos 10-15 minutos), solo tuvimos que descargar el fichero <em>kubeconfig</em> y lanzar el proceso de instalación de la aplicación. Y ahí empezaron los problemas.</p>
<h3>Problemas observados</h3>
<p>Al poco rato, <strong>el <em>API server</em> empezó a comportarse de forma un tanto errática,</strong> <strong>respondiendo muy lentamente o devolviendo diversos errores</strong>. Síntomas:</p>
<ul>
<li>Tiempos de respuesta altísimos, en ocasiones incluso superiores al minuto
<div class="wp-block-codemirror-blocks code-block ">
<pre class="CodeMirror" data-setting="{">bash-5.0# time kubectl get pods -A 
NAMESPACE                      NAME                                                 READY   STATUS              RESTARTS   AGE
istio-system                   istio-init-crd-10-1.4.8-86xf9                        1/1     Running             1          7m1s
…
real    1m14.507s
user    0m0.174s
sys     0m0.028s
</pre>
</div>
</li>
</ul>
<ul>
<li>Errores de conexión
<div class="wp-block-codemirror-blocks code-block ">
<pre class="CodeMirror" data-setting="{">bash-5.0# kubectl get pods -A
Unable to connect to the server: unexpected EOF</pre>
</div>
</li>
<li>Timeouts en la negociación TLS
<div class="wp-block-codemirror-blocks code-block ">
<pre class="CodeMirror" data-setting="{">bash-5.0# kubectl get pods -A
Unable to connect to the server: net/http: TLS handshake timeout</pre>
</div>
</li>
</ul>
<p>El problema tenía que estar relacionado con la instalación ya que antes de eso todo funcionaba perfectamente.</p>
<p><strong>DigitalOcean</strong>, al igual que el resto de proveedores, no ofrece ningún tipo de información acerca de los recursos dedicados a los nodos master (número de nodos, tamaño de los mismos&#8230;) ni acceso a <strong>los logs o a la monitorización</strong> del <em>control plane</em>, así que no había forma de saber qué estaba pasando.</p>
<p>Una búsqueda rápida nos hizo darnos cuenta que no éramos los únicos con este tipo de problemas, aunque también vimos que muchos otros eran usuarios felices del servicio.</p>
<h3>Solución</h3>
<p>Esto nos hizo sospechar que <strong>no todos los nodos master eran creados por igual</strong>, y que el único parámetro del proceso de creación que podía crear la diferencia era el node pool configurado.</p>
<p>Para verificar nuestra teoría, primero probamos a <strong>crear un clúster con un node pool con más nodos</strong> (de 3 pasamos a 6), con idéntico resultado.</p>
<p>Así que probamos a<strong> crear un node pool con nodos no-básicos</strong> (<strong>CPU-Optimized</strong> en este caso). Y ahí sí dimos en el clavo: el proceso de instalación terminó sin problemas y el <strong><em>API server</em></strong> estuvo respondiendo adecuadamente todo el tiempo.</p>
<h3>Conclusión</h3>
<p>Está claro que nadie regala nada y que no puedes esperar tener un nodo master dedicado con 16 cores y 64 Gb de RAM pagando 20€ al mes por un <em>droplet</em> básico. De todos modos no estaría de más que fueran un poco más transparentes e informaran de las capacidades y limitaciones del servicio que están ofreciendo (aunque sea gratuito). De esta forma, más de uno se ahorraría dolores de cabeza y frustraciones.</p>
<p>Así que si tienes planteado usar este servicio para alojar una aplicación que vaya a hacer un uso más o menos intensivo del <strong><em>API server</em></strong>, será mejor que te decantes por <em>droplets</em> no-básicos si no quieres tener problemas de rendimiento.</p>
<p>Y recuerda que si necesitas cualquier cosa <a href="https://geko.cloud/es/contacto/">estaremos encantados de escucharte</a>. ¡También puedes revisar nuestro blog <a href="https://geko.cloud/es/blog/labs/">para encontrar otras publicaciones útiles</a> como ésta!</p>
<p>La entrada <a href="https://geko.cloud/es/kubernetes-gestionados-alternativos/">Kubernetes gestionados «alternativos»</a> se publicó primero en <a href="https://geko.cloud/es/">Geko Cloud</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://geko.cloud/es/kubernetes-gestionados-alternativos/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Cómo instalar cert-manager con validación HTTP en Kubernetes</title>
		<link>https://geko.cloud/es/como-instalar-cert-manager-con-validacion-http-en-kubernetes/</link>
					<comments>https://geko.cloud/es/como-instalar-cert-manager-con-validacion-http-en-kubernetes/#respond</comments>
		
		<dc:creator><![CDATA[Xavi Miranda]]></dc:creator>
		<pubDate>Fri, 30 Oct 2020 08:48:03 +0000</pubDate>
				<category><![CDATA[Labs]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[Ngnix]]></category>
		<guid isPermaLink="false">https://geko2.factoryfy.com/es/?p=2779</guid>

					<description><![CDATA[<p>Gestionar certificados SSL puede ser un dolor de cabeza, pero por suerte en Kubernetes podemos usar cert-manager y dejar que éste se encargue de todo para crear de forma fácil cualquier certificado que necesitemos. En este how-to vamos a cubrir desde la instalación de cert-manager a cómo configurarlo para realizar la validación por HTTP. También [&#8230;]</p>
<p>La entrada <a href="https://geko.cloud/es/como-instalar-cert-manager-con-validacion-http-en-kubernetes/">Cómo instalar cert-manager con validación HTTP en Kubernetes</a> se publicó primero en <a href="https://geko.cloud/es/">Geko Cloud</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Gestionar certificados SSL puede ser un dolor de cabeza, pero por suerte en <a href="https://geko.cloud/es/que-es-kubernetes/"><b>Kubernetes</b></a> podemos usar <b>cert-manager</b> y dejar que éste se encargue de todo para crear de forma fácil cualquier certificado que necesitemos.</p>
<p>En este how-to vamos a cubrir desde la instalación de <b>cert-manager</b> a cómo configurarlo para realizar la <b>validación por HTTP</b>. También aprenderemos a <b>crear un nuevo certificado</b> para nuestro host simplemente <b>añadiendo una annotation</b> a nuestro ingress.</p>
<h3>¡Suena bien! ¿Qué necesito?</h3>
<p>Deberías cumplir con estos requisitos:</p>
<ul>
<li>Tener un <b>clúster</b> <b>k8s</b> funcional con nginx como ingress-controller</li>
<li>Tener <b>helm</b> instalado (lee aquí <b><a href="https://geko.cloud/es/como-instalar-grafana-con-ldap-en-kubernetes-usando-helm/">cómo instalar helm</a></b>)</li>
<li>Tener un dominio en tu posesión que apunte hacia el clúster</li>
<li>Ganas de aprender algo nuevo <img src="https://s.w.org/images/core/emoji/15.0.3/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></li>
</ul>
<h3>¡Empecemos!</h3>
<p>Primero necesitamos añadir el repositorio de helm para cert-manager:</p>
<div class="wp-block-codemirror-blocks code-block ">
<pre class="CodeMirror" data-setting="{">helm repo add jetstack https://charts.jetstack.io</pre>
</div>
<p>Ahora procederemos a crear el nuevo namespace y hacer el deploy de cert-manager:</p>
<div class="wp-block-codemirror-blocks code-block ">
<pre class="CodeMirror" data-setting="{">kubectl create ns cert-manager
helm upgrade --install cert-manager 
  --namespace cert-manager 
  --version v1.0.3 
  jetstack/cert-manager 
  --set installCRDs=true</pre>
</div>
<p>Dale unos segundos de margen para que termine y deberías ver un mensaje de finalización con éxito.</p>
<h3>Creando un ClusterIssuer</h3>
<p>Podemos usar tanto un <b>Issuer</b> como un <b>ClusterIssuer</b> (namespace vs cluster-scoped). Es exactamente lo mismo, solo cambia el scope. El Issuer/ClusterIssuer representa la CA de la que queremos obtener el nuevo certificado, en este caso usaremos <b>LetsEncrypt</b>.</p>
<p>Fíjate a continuación que el objeto ClusterIssuer realmente es muy simple. Tanto el nombre como el nombre del secret pueden ser lo que tú quieras:</p>
<div class="wp-block-codemirror-blocks code-block ">
<pre class="CodeMirror" data-setting="{">apiVersion: cert-manager.io/v1alpha3
kind: ClusterIssuer
metadata:
  name: my-cluster-issuer
spec:
  acme:
    email: {{ tu email }}
    privateKeySecretRef:
      name: my-cluster-issuer
    server: https://acme-v02.api.letsencrypt.org/directory
    solvers:
      - http01:
         ingress:
           class: nginx</pre>
</div>
<h3>Expidiendo un nuevo certificado</h3>
<p>Vamos a hacer un deploy muy simple con un nginx, lo expondremos como servicio y después crearemos un ingress. Así pues, vamos allá:</p>
<div class="wp-block-codemirror-blocks code-block ">
<pre class="CodeMirror" data-setting="{">kubectl create deployment nginx --image nginx:alpine --namespace test
kubectl expose deployment nginx --port 80 --target-port 80 --namespace test</pre>
</div>
<p>Ahora crearemos un nuevo objeto ingress para hacer accesible el servicio a través del ingress controller. Recuerda reemplazar a continuación las ocurrencias del host con tu propio dominio:</p>
<div class="wp-block-codemirror-blocks code-block ">
<pre class="CodeMirror" data-setting="{">apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
  labels:
    app: nginx
  name: nginx
  namespace: test
spec:
  rules:
  - host: nginx.{{ tu dominio }}
    http:
      paths:
      - backend:
          serviceName: nginx
          servicePort: 80
        path: /
  tls:
  - hosts:
    - nginx.{{ tu dominio }}
    secretName: nginx-certificate</pre>
</div>
<p>Aplicamos el nuevo manifest:</p>
<div class="wp-block-codemirror-blocks code-block ">
<pre class="CodeMirror" data-setting="{">kubectl apply -f ingress.yaml</pre>
</div>
<p>Si ahora intentas acceder al host que has definido en el ingress verás un mensaje de error conforme tu certificado no es válido («Your connection is not private»). Para solucionarlo, <b>vamos a expedir un nuevo certificado</b>. Edita el ingress que has creado y añade la siguiente anotación, reemplazando el valor por el nombre que hayas puesto en tu ClusterIssuer:</p>
<div class="wp-block-codemirror-blocks code-block ">
<pre class="CodeMirror" data-setting="{">cert-manager.io/cluster-issuer: my-cluster-issuer</pre>
</div>
<p>Aplica el ingress de nuevo (o guarda los cambios si estás haciendo un edit) y revisa el estado del objeto «cert». Deberías ver algo así:</p>
<div class="wp-block-codemirror-blocks code-block ">
<pre class="CodeMirror" data-setting="{">kubectl get cert -n test

NAME                READY   SECRET              AGE
nginx-certificate   False   nginx-certificate   21s
</pre>
</div>
<p>Ahora espera 1 o 2 minutos y cuando lo revises de nuevo&#8230;</p>
<div class="wp-block-codemirror-blocks code-block ">
<pre class="CodeMirror" data-setting="{">kubectl get cert -n test

NAME                READY   SECRET              AGE
nginx-certificate   <b>True</b>    nginx-certificate   93s</pre>
</div>
<p>&#8230; ¡hemos conseguido el certificado! Haz un test refrescando la página o abriendo una nueva pestaña y deberías ver el mensaje de bienvenida de Nginx. Si inspeccionas el certificado, verás que efectivamente éste ha sido expedido por LetsEncrypt:</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-2793" src="https://geko2.factoryfy.com/wp-content/uploads/nginx_valid_cert-1.png" alt="Nginx letsencrypt certificate by cert-manager" width="1000" height="164" /></p>
<h3>Resumiendo</h3>
<p>Lo que hemos visto aquí es:</p>
<ul>
<li>Como instalar cert-manager</li>
<li>Como configurar un nuevo ClusterIssuer</li>
<li>Como expedir de forma sencilla un certificado</li>
</ul>
<p>En líneas generales ha sido un proceso simple, ¿verdad? Es más, cuando sabes cómo funciona es muy fácil replicar este setup en cualquier clúster en cuestión de unos pocos minutos.</p>
<p>Cert-manager se encargará de la <b>renovación de tus certificados</b>. También puedes crear otros Issuers o ClusterIssuers que soporten otros CA o usar otros métodos de validación (DNS), pero eso es un tema algo más avanzado que dejaremos para más adelante.</p>
<p>Espero que hayas disfrutado con este how-to y que haya resultado útil. Recuerda que si necesitas cualquier cosa <a href="https://geko.cloud/es/contacto/">estaremos encantados de escucharte</a>. ¡También puedes revisar nuestro blog <a href="https://geko.cloud/es/blog/labs/">para encontrar otras publicaciones útiles</a> como ésta!</p>
<p>La entrada <a href="https://geko.cloud/es/como-instalar-cert-manager-con-validacion-http-en-kubernetes/">Cómo instalar cert-manager con validación HTTP en Kubernetes</a> se publicó primero en <a href="https://geko.cloud/es/">Geko Cloud</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://geko.cloud/es/como-instalar-cert-manager-con-validacion-http-en-kubernetes/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Cómo habilitar la compresión Brotli en un ingress-nginx</title>
		<link>https://geko.cloud/es/como-habilitar-la-compresion-brotli-en-un-ingress-nginx/</link>
					<comments>https://geko.cloud/es/como-habilitar-la-compresion-brotli-en-un-ingress-nginx/#respond</comments>
		
		<dc:creator><![CDATA[Geko Cloud]]></dc:creator>
		<pubDate>Tue, 13 Oct 2020 09:19:13 +0000</pubDate>
				<category><![CDATA[Labs]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[Ngnix]]></category>
		<guid isPermaLink="false">https://geko2.factoryfy.com/es/?p=2713</guid>

					<description><![CDATA[<p>Introducción Brotli es un método de compresión desarrollado por Google y lanzado en 2015. En función del escenario, brotli es capaz de conseguir una mejora en la tasa de compresión de entre un 20 y un 30% sobre gzip, que es el método de compresión por defecto. Configuración del ingress-nginx Para crear el ingress-nginx en [&#8230;]</p>
<p>La entrada <a href="https://geko.cloud/es/como-habilitar-la-compresion-brotli-en-un-ingress-nginx/">Cómo habilitar la compresión Brotli en un ingress-nginx</a> se publicó primero en <a href="https://geko.cloud/es/">Geko Cloud</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h3>Introducción</h3>
<p><em>Brotli</em> es un método de compresión desarrollado por <em>Google</em> y lanzado en 2015. En función del escenario,<strong> <em>brotli</em></strong> es capaz de conseguir una mejora en la tasa de compresión de entre un 20 y un 30% sobre <em>gzip</em>, que es el método de compresión por defecto.</p>
<h3>Configuración del <em>ingress-nginx</em></h3>
<p>Para crear el <em>ingress-nginx</em> en función de nuestro proveedor, podemos seguir la documentación del siguiente enlace:</p>
<p><a href="https://kubernetes.github.io/ingress-nginx/deploy/">https://kubernetes.github.io/ingress-nginx/deploy/</a></p>
<p>La configuración del<strong> <em>ingress-nginx</em> </strong>puede hacerse a través de los <em>Annotations</em>, con un<strong> <em>ConfigMap</em></strong> o con una plantilla personalizada.<br />
En el siguiente enlace podemos comprobar qué parámetros pueden modificarse con cada una de las formas:</p>
<p><a href="https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/">https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/</a></p>
<p>En este caso, para modificar el método de compresión, tendremos que emplear el <strong><em>ConfigMap</em></strong>.<br />
El método de compresión por defecto es <em>gzip</em>, con un nivel de compresión de 1. Para habilitar y configurar la compresión <em>brotli</em>, disponemos de tres parámetros: <em>enable-brotli</em>, <em>brotli-level</em> y <em>brotli-types</em>.</p>
<ul>
<li><em>enable-brotli</em>: <em>true</em> o <em>false</em>. Permite habilitar la compresión <strong><em>brotli</em></strong>.</li>
<li><em>brotli-level</em>: nivel de compresión. Puede tomar valores entre 1 y 11, por defecto es 4. A mayor nivel de compresión, más agresivos serán los algoritmos para comprimir los ficheros, consiguiendo menores tamaños, pero a cambio será más costoso computacionalmente.</li>
<li><em>brotli-types</em>: tipos <em>MIME</em> que serán comprimidos al vuelo por <strong><em>brotli</em></strong>.</li>
</ul>
<h3>Aplicando los cambios</h3>
<p>Ejecutando el siguiente comando, listaremos los <strong><em>ConfigMap</em></strong> del <strong><em>ingress-nginx</em></strong>:</p>
<div class="wp-block-codemirror-blocks code-block ">
<pre class="CodeMirror" data-setting="{">kubectl get cm -l app.kubernetes.io/name=ingress-nginx -A</pre>
</div>
<p>El parámetro &#8216;-A&#8217; nos lista los recursos de todos los <em>namespaces</em>, dado que en función del proveedor que estemos usando, el <em>namespace</em> puede variar. La salida del comando sería algo así:</p>
<div class="wp-block-codemirror-blocks code-block ">
<pre class="CodeMirror" data-setting="{">NAMESPACE     NAME                          DATA   AGE
my-namespace  ingress-nginx-configuration   0      14d
my-namespace  ingress-nginx-tcp-services    0      14d
my-namespace  ingress-nginx-udp-services    0      14d
</pre>
</div>
<p>El <strong><em>ConfigMap</em></strong> que debemos modificar es <em>ingress-nginx-configuration</em>.<br />
Para ver el contenido actual del <strong><em>ConfigMap</em></strong>, ejecutaremos el siguiente comando:</p>
<div class="wp-block-codemirror-blocks code-block ">
<pre class="CodeMirror" data-setting="{">kubectl get cm ingress-nginx-configuration -n my-namespace -o yaml</pre>
</div>
<p>En este caso deberemos especificar el <em>namespace</em> donde está desplegado el <em>ingress-nginx</em>.</p>
<p>Podemos editar este <strong><em>ConfigMap</em></strong> de forma directa, pero en este caso crearemos un fichero <em>yaml</em> para luego aplicarlo.</p>
<p><em>configmap.yaml</em>:</p>
<div class="wp-block-codemirror-blocks code-block ">
<pre class="CodeMirror" data-setting="{">apiVersion: v1
kind: ConfigMap
metadata:
  name: ingress-nginx-configuration
data:
  enable-brotli: "true"
  brotli-level: "6"
  brotli-types: "text/xml image/svg+xml application/x-font-ttf image/vnd.microsoft.icon application/x-font-opentype application/json font/eot application/vnd.ms-fontobject application/javascript font/otf application/xml application/xhtml+xml text/javascript application/x-javascript text/plain application/x-font-truetype application/xml+rss image/x-icon font/opentype text/css image/x-win-bitmap"</pre>
</div>
<p>Nota importante: todos los parámetros del <em>ConfigMap</em> deben ser cadenas de texto y, por lo tanto, deben estar entrecomillados.</p>
<p>Una vez tengamos el fichero <em>configmap.yaml</em> creado, con los valores deseados de los parámetros, lo aplicaremos ejecutaremos el siguiente comando:</p>
<div class="wp-block-codemirror-blocks code-block ">
<pre class="CodeMirror" data-setting="{">kubectl apply -f configmap.yaml -n my-namespace</pre>
</div>
<p>Tenemos que asegurarnos de aplicar el <strong><em>ConfigMap</em></strong> en el mismo <em>namespace</em> donde tengamos desplegado el <strong><em>ingress-nginx</em></strong>.</p>
<h3>Comprobación</h3>
<p>Finalmente comprobaremos que hemos aplicado correctamente los cambios, mostrando de nuevo el contenido del <strong><em>ConfigMap</em></strong> de configuración del <strong><em>ingress-nginx</em></strong>:</p>
<div class="wp-block-codemirror-blocks code-block ">
<pre class="CodeMirror" data-setting="{">kubectl get cm ingress-nginx-configuration -n kube-system -o yaml
apiVersion: v1
data:
  brotli-level: "6"
  brotli-types: text/xml image/svg+xml application/x-font-ttf image/vnd.microsoft.icon
    application/x-font-opentype application/json font/eot application/vnd.ms-fontobject
    application/javascript font/otf application/xml application/xhtml+xml text/javascript  application/x-javascript
    text/plain application/x-font-truetype application/xml+rss image/x-icon font/opentype
    text/css image/x-win-bitmap
  enable-brotli: "true"
kind: ConfigMap
metadata:
  annotations:
    ...</pre>
</div>
<p>Con la compresión <strong><em>brotli</em> </strong>activada, al realizar una petición a alguna <em>web</em> expuesta a través del <em><strong>ingress-nginx</strong>,</em> en la cabeceras de respuesta recibiremos algo como lo siguiente:</p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-2712 aligncenter" src="https://geko2.factoryfy.com/wp-content/uploads/br-encoding-248x300.jpg" alt="" width="248" height="300" /></p>
<p>¡Y listo!</p>
<p>Esperamos que te haya sido útil este post, no olvides que el equipo <a href="https://geko.cloud/es/devops/">DevOps</a> de <a href="https://geko.cloud/es/">Geko</a> está a tu disposición. <a href="https://geko.cloud/es/contacto/">Contáctanos</a> si tienes cualquier duda.</p>
<p>La entrada <a href="https://geko.cloud/es/como-habilitar-la-compresion-brotli-en-un-ingress-nginx/">Cómo habilitar la compresión Brotli en un ingress-nginx</a> se publicó primero en <a href="https://geko.cloud/es/">Geko Cloud</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://geko.cloud/es/como-habilitar-la-compresion-brotli-en-un-ingress-nginx/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
