{"id":70954,"date":"2020-02-23T00:58:17","date_gmt":"2020-02-22T21:58:17","guid":{"rendered":"https:\/\/prohoster.info\/blog\/ustrojstvo-helm-i-ego-podvodnye-kamni"},"modified":"2020-03-03T16:14:40","modified_gmt":"2020-03-03T13:14:40","slug":"ustrojstvo-helm-i-ego-podvodnye-kamni","status":"publish","type":"post","link":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/ustrojstvo-helm-i-ego-podvodnye-kamni","title":{"rendered":"El dispositivo Helm y sus complicaciones","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"El dispositivo Helm y sus complicaciones\" src=\"\/wp-content\/uploads\/2020\/02\/b825bfb312b883f5f9c1535036f0c6e8.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/www.artstation.com\/artwork\/YaabJq\">Concepto de transportista de carga Typhon, Anton Swanepoel<\/a><\/noindex><\/p>\n<p>Me llamo Dmitry Sugrobov, soy desarrollador en 'Leroy Merlin'. En este art\u00edculo explicar\u00e9 por qu\u00e9 necesitamos Helm, c\u00f3mo simplifica el trabajo con Kubernetes, qu\u00e9 ha cambiado en la tercera versi\u00f3n y c\u00f3mo actualizar aplicaciones en producci\u00f3n sin tiempo de inactividad.<\/p>\n<p>Este es un resumen basado en una presentaci\u00f3n en la conferencia <noindex><a rel=\"nofollow\" href=\"https:\/\/corp.mail.ru\/ru\/press\/events\/at-kubernetes-conference\/\">@Kubernetes Conference<\/a><\/noindex> by <noindex><a rel=\"nofollow\" href=\"https:\/\/mcs.mail.ru\">Soluciones en la Nube de Mail.ru<\/a><\/noindex> \u2014 si no quieres leer, mira el video.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\n<center><div class=\"youtube-placeholder\" data-id=\"w1PhTe9gnOI\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/w1PhTe9gnOI\/hqdefault.jpg\" alt=\"Reproducir video\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><\/p>\n<h2>Por qu\u00e9 usamos Kubernetes en producci\u00f3n<\/h2>\n<p>\n'Leroy Merlin' es l\u00edder en el mercado minorista de bricolaje en Rusia y Europa. En nuestra empresa hay m\u00e1s de cien desarrolladores, 33,000 empleados internos y una enorme cantidad de personas que visitan nuestros hipermercados y sitio web. Para hacerlos felices, decidimos seguir enfoques est\u00e1ndar en la industria. Desarrollamos nuevas aplicaciones utilizando arquitectura de microservicios; para la aislamiento de entornos y entrega adecuada usamos contenedores; y para la orquestaci\u00f3n utilizamos Kubernetes. El costo de usar orquestadores est\u00e1 disminuyendo r\u00e1pidamente: hay cada vez m\u00e1s ingenieros en el mercado que dominan la tecnolog\u00eda y surgen proveedores que ofrecen Kubernetes como servicio.<\/p>\n<p>Todo lo que hace Kubernetes, por supuesto, se puede hacer de otras maneras, por ejemplo, con scripts en alg\u00fan Jenkins y docker-compose, pero \u00bfpor qu\u00e9 complicar la vida si hay una soluci\u00f3n lista y confiable? Por eso llegamos a Kubernetes y ya lo estamos utilizando en producci\u00f3n desde hace un a\u00f1o. Actualmente tenemos veinticuatro cl\u00fasteres de Kubernetes, el m\u00e1s antiguo tiene m\u00e1s de un a\u00f1o, y contiene alrededor de doscientos pods.<\/p>\n<h2>La maldici\u00f3n de la gran cantidad de archivos YAML en Kubernetes<\/h2>\n<p>\nPara ejecutar un microservicio en Kubernetes crearemos al menos cinco archivos YAML: para Deployment, Service, Ingress, ConfigMap, Secrets, y los enviaremos al cl\u00faster. Para la siguiente aplicaci\u00f3n escribiremos el mismo paquete de YAMLs, y para la tercera, otro m\u00e1s, y as\u00ed sucesivamente. Multiplicamos el n\u00famero de documentos por la cantidad de entornos, y ya tenemos cientos de archivos, sin contar los entornos din\u00e1micos.<\/p>\n<p><img decoding=\"async\" alt=\"El dispositivo Helm y sus complicaciones\" src=\"\/wp-content\/uploads\/2020\/02\/c46c3f5ae49cbefa4851cbb388bfd051.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAdam Reese, mantenedor principal de Helm, introdujo el concepto de \u201c<noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/cZ1S2Gp47ng?t=323\">Ciclo de desarrollo en Kubernetes<\/a><\/noindex>\u201d, que se ve as\u00ed:<\/p>\n<ol>\n<li>Copiar YAML \u2014 copiar el archivo YAML.<\/li>\n<li>Pegar YAML \u2014 pegarlo.<\/li>\n<li>Arreglar sangr\u00edas \u2014 corregir las sangr\u00edas.<\/li>\n<li>Repetir \u2014 repetir nuevamente.<\/li>\n<\/ol>\n<p>\nEs una opci\u00f3n v\u00e1lida, pero hay que copiar los archivos YAML muchas veces. Para cambiar este ciclo, se invent\u00f3 Helm.<\/p>\n<h3>Qu\u00e9 es Helm<\/h3>\n<p>\nPrimero, Helm es<strong> gestor de paquetes<\/strong>, que ayuda a encontrar e instalar los programas necesarios. Para instalar, por ejemplo, MongoDB, no es necesario ir al sitio oficial y descargar los binarios, solo se debe ejecutar el comando <code>helm install stable\/mongodb<\/code>.<\/p>\n<p>En segundo lugar, Helm \u2014 <strong>un motor de plantillas<\/strong>, ayuda a parametrizar archivos. Regresando a la situaci\u00f3n con los archivos YAML en Kubernetes. Es m\u00e1s f\u00e1cil escribir el mismo archivo YAML, agregarle algunos marcadores de posici\u00f3n, donde Helm insertar\u00e1 valores. Es decir, en lugar de un gran conjunto de archivos YAML, habr\u00e1 un conjunto de plantillas, en las que en el momento adecuado se insertar\u00e1n los valores necesarios.<\/p>\n<p>En tercer lugar, Helm \u2014 <strong>un maestro de despliegue<\/strong>. Con su ayuda, se pueden instalar, revertir y actualizar aplicaciones. Veamos c\u00f3mo hacerlo.<\/p>\n<p><img decoding=\"async\" alt=\"El dispositivo Helm y sus complicaciones\" src=\"\/wp-content\/uploads\/2020\/02\/8b517dbcf503ced229569fe3726418c8.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>C\u00f3mo usar Helm para desplegar sus propias aplicaciones<\/h3>\n<p>\nInstalaremos el cliente Helm en la computadora, siguiendo el oficial <noindex><a rel=\"nofollow\" href=\"https:\/\/helm.sh\/docs\/intro\/install\/\">la gu\u00eda<\/a><\/noindex>. Luego crearemos un conjunto de archivos YAML. En lugar de especificar valores concretos, dejaremos marcadores de posici\u00f3n que Helm llenar\u00e1 con informaci\u00f3n en el futuro. Este conjunto de archivos se llama chart de Helm. Se puede enviar al cliente de consola de Helm de tres maneras:<\/p>\n<ul>\n<li>especificar la carpeta con las plantillas;<\/li>\n<li>empaquetar en un archivo .tar y referenciarlo;<\/li>\n<li>colocar la plantilla en un repositorio remoto y agregar un enlace al repositorio en el cliente de Helm.<\/li>\n<\/ul>\n<p>\nTambi\u00e9n se necesita un archivo de valores \u2014 values.yaml. Los datos de all\u00ed se insertar\u00e1n en la plantilla. Vamos a crearlo.<\/p>\n<p><img decoding=\"async\" alt=\"El dispositivo Helm y sus complicaciones\" src=\"\/wp-content\/uploads\/2020\/02\/c0fe24cc8186640147f95ce201794d96.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nEn la segunda versi\u00f3n de Helm hay una aplicaci\u00f3n de servidor adicional \u2014 Tiller. Esta se ejecuta fuera de Kubernetes y espera solicitudes del cliente de Helm, y al ser invocada, inserta los valores necesarios en la plantilla y los env\u00eda a Kubernetes.<\/p>\n<p><img decoding=\"async\" alt=\"El dispositivo Helm y sus complicaciones\" src=\"\/wp-content\/uploads\/2020\/02\/6b821a0bb4680829d5ce9982d2bb4c55.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nHelm 3 es m\u00e1s simple: en lugar de procesar las plantillas en el servidor, la informaci\u00f3n ahora se procesa completamente del lado del cliente de Helm y se env\u00eda directamente a la API de Kubernetes. Esta simplificaci\u00f3n aumenta la seguridad del cl\u00faster y facilita el proceso de despliegue.<\/p>\n<p><strong>C\u00f3mo funciona todo esto<\/strong><\/p>\n<p>Ejecutamos el comando <code>helm install<\/code>. Especificaremos el nombre de la liberaci\u00f3n de la aplicaci\u00f3n, daremos la ruta a values.yaml. Al final, indicaremos el repositorio donde se encuentra el chart y el nombre del chart. En el ejemplo, esto es \u00ablmru\u00bb y \u00abbestchart\u00bb respectivamente.<\/p>\n<pre><code class=\"plaintext\">helm install --name bestapp --values values.yaml lmru\/bestchart\n<\/code><\/pre>\n<p>\nLa ejecuci\u00f3n del comando solo es posible una vez, al ejecutarlo de nuevo en lugar de <code>install<\/code> deber\u00eda utilizarse <code>upgrade<\/code>. Por simplicidad, en lugar de dos comandos, se puede ejecutar el comando <code>upgrade<\/code> con una clave adicional <code>--install<\/code>. Al ejecutar Helm por primera vez, enviar\u00e1 un comando para instalar la versi\u00f3n, y luego la actualizar\u00e1.<\/p>\n<pre><code class=\"plaintext\">helm upgrade --install bestapp --values values.yaml lmru\/bestchart\n<\/code><\/pre>\n<p><\/p>\n<h2>Desaf\u00edos al desplegar nuevas versiones de la aplicaci\u00f3n con Helm<\/h2>\n<p>\n<i>En este punto de la historia, estoy jugando con la audiencia en '\u00bfQui\u00e9n quiere ser millonario?', y estamos tratando de averiguar c\u00f3mo hacer que Helm actualice la versi\u00f3n de la aplicaci\u00f3n. <\/i><noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/w1PhTe9gnOI?list=PLQzTaxmOHjnv0tP_HDxsIvcuac2kkIJTQ&amp;t=778\"><i>Ver video<\/i><\/a><\/noindex>.<\/p>\n<p>Cuando estuve estudiando el funcionamiento de Helm, me sorprendi\u00f3 el comportamiento extra\u00f1o al intentar actualizar versiones de aplicaciones en ejecuci\u00f3n. El c\u00f3digo de la aplicaci\u00f3n se actualiz\u00f3, se subi\u00f3 una nueva imagen al registro de Docker, envi\u00e9 el comando para el despliegue \u2013 y no ocurri\u00f3 nada. A continuaci\u00f3n, algunos m\u00e9todos no muy exitosos para actualizar aplicaciones. Al explorar cada uno de ellos m\u00e1s en detalle, comienzas a comprender la estructura interna de la herramienta y las razones de su comportamiento poco evidente.<\/p>\n<p><strong>M\u00e9todo 1. No cambiar la informaci\u00f3n desde el \u00faltimo lanzamiento<\/strong><\/p>\n<p>Como dice <noindex><a rel=\"nofollow\" href=\"https:\/\/helm.sh\/docs\/intro\/using_helm\/#helm-upgrade-and-helm-rollback-upgrading-a-release-and-recovering-on-failure\">el sitio web oficial<\/a><\/noindex> Helm, 'Los charts de Kubernetes pueden ser grandes y complejos, por lo que Helm intenta no tocar nada innecesariamente'. Por lo tanto, si actualizas la versi\u00f3n latest de la imagen de la aplicaci\u00f3n en el registro de Docker y ejecutas el comando <code>helm upgrade<\/code>, no suceder\u00e1 nada. Helm pensar\u00e1 que no ha habido cambios y no enviar\u00e1 el comando para actualizar la aplicaci\u00f3n a Kubernetes.<\/p>\n<blockquote><p>Aqu\u00ed y m\u00e1s adelante, la etiqueta latest se muestra \u00fanicamente como un ejemplo. Al especificar esta etiqueta, Kubernetes descargar\u00e1 la imagen del registro de Docker cada vez, independientemente del par\u00e1metro imagePullPolicy. Usar latest en producci\u00f3n es indeseable y puede causar efectos secundarios.<\/p><\/blockquote>\n<p>\n<strong>M\u00e9todo 2. Actualizar LABEL en la imagen<\/strong><\/p>\n<p>Como se indica en el mismo <noindex><a rel=\"nofollow\" href=\"https:\/\/helm.sh\/docs\/intro\/using_helm\/#helm-upgrade-and-helm-rollback-upgrading-a-release-and-recovering-on-failure\">la documentaci\u00f3n<\/a><\/noindex>, 'Helm actualizar\u00e1 la aplicaci\u00f3n solo si ha cambiado desde el \u00faltimo lanzamiento'. Una opci\u00f3n l\u00f3gica para esto parecer\u00eda ser actualizar la etiqueta LABEL en la propia imagen de Docker. Sin embargo, Helm no inspecciona las im\u00e1genes de las aplicaciones y no tiene conocimiento de ning\u00fan cambio en ellas. Por lo tanto, al actualizar las etiquetas en la imagen, Helm no se enterar\u00e1, y no se enviar\u00e1 el comando para actualizar la aplicaci\u00f3n en Kubernetes.<\/p>\n<p><strong>M\u00e9todo 3. Usar la opci\u00f3n <code>--force<\/code><\/strong><\/p>\n<p><img decoding=\"async\" alt=\"El dispositivo Helm y sus complicaciones\" src=\"\/wp-content\/uploads\/2020\/02\/4888cddfb7698b7044ab31b6f6070063.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nConsultemos los manuales y busquemos la opci\u00f3n que necesitamos. La que m\u00e1s se ajusta al significado es la opci\u00f3n <code>--force<\/code>. A pesar del nombre que tiene, el comportamiento es diferente de lo que se esperaba. En lugar de forzar la actualizaci\u00f3n de la aplicaci\u00f3n, su verdadero prop\u00f3sito es restaurar una versi\u00f3n de estado FALLIDO. Si no se utiliza esta clave, es necesario ejecutar los comandos secuencialmente. <code>helm delete &amp;&amp; helm install --replace<\/code>. En su lugar, se propone usar la clave <code>--force<\/code>, que automatiza la ejecuci\u00f3n secuencial de estos comandos. M\u00e1s informaci\u00f3n en este <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/helm\/helm\/pull\/3597\">pull request.<\/a><\/noindex>. Para decirle a Helm que actualice la versi\u00f3n de la aplicaci\u00f3n, desafortunadamente, esta clave no servir\u00e1.<\/p>\n<p><strong>M\u00e9todo 4. Cambiar directamente las etiquetas en Kubernetes.<\/strong><\/p>\n<p><img decoding=\"async\" alt=\"El dispositivo Helm y sus complicaciones\" src=\"\/wp-content\/uploads\/2020\/02\/0a35e7aaa7479685f07dd5b935c95eb1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nActualizar la etiqueta directamente en el cl\u00faster usando el comando <code>kubectl edit<\/code> \u2014 es una mala idea. Esta acci\u00f3n llevar\u00e1 a una inconsistencia entre la informaci\u00f3n de la aplicaci\u00f3n en funcionamiento y lo que originalmente se envi\u00f3 para el despliegue. El comportamiento de Helm al desplegar en este caso difiere de su versi\u00f3n: Helm 2 no har\u00e1 nada, mientras que Helm 3 desplegar\u00e1 una nueva versi\u00f3n de la aplicaci\u00f3n. Para entender la raz\u00f3n, es necesario comprender c\u00f3mo funciona Helm.<\/p>\n<h3>C\u00f3mo funciona Helm.<\/h3>\n<p>\nPara determinar si la aplicaci\u00f3n ha cambiado desde la \u00faltima versi\u00f3n, Helm puede aprovechar:<\/p>\n<ul>\n<li>la aplicaci\u00f3n en ejecuci\u00f3n en Kubernetes;<\/li>\n<li>un nuevo values.yaml y el chart actual;<\/li>\n<li>informaci\u00f3n interna de Helm sobre las versiones.<\/li>\n<\/ul>\n<p><b class=\"spoiler_title\">Para los m\u00e1s curiosos: \u00bfd\u00f3nde guarda Helm la informaci\u00f3n interna sobre las versiones?<\/b>Al ejecutar el comando <code>helm history<\/code>, obtendremos toda la informaci\u00f3n sobre las versiones instaladas usando Helm.<\/p>\n<p><img decoding=\"async\" alt=\"El dispositivo Helm y sus complicaciones\" src=\"\/wp-content\/uploads\/2020\/02\/0bf3afeb9c4947220474af648a1fa1ad.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nTambi\u00e9n hay informaci\u00f3n detallada sobre las plantillas y valores enviados. Podemos solicitarla:<\/p>\n<p><img decoding=\"async\" alt=\"El dispositivo Helm y sus complicaciones\" src=\"\/wp-content\/uploads\/2020\/02\/858560c0f4adf7375060cec339df7574.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nEn la segunda versi\u00f3n de Helm, esta informaci\u00f3n se encuentra en el mismo namespace donde se ejecuta Tiller (por defecto, kube-system), en un ConfigMap marcado con la etiqueta \"OWNER=TILLER\":<\/p>\n<p><img decoding=\"async\" alt=\"El dispositivo Helm y sus complicaciones\" src=\"\/wp-content\/uploads\/2020\/02\/ba665a079ccddeb4ca7049822c42a498.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nCon la aparici\u00f3n de la tercera versi\u00f3n de Helm, la informaci\u00f3n se traslad\u00f3 a los secretos, en el mismo namespace donde se ejecuta la aplicaci\u00f3n. Gracias a esto, se volvi\u00f3 posible ejecutar varias aplicaciones simult\u00e1neamente en diferentes namespaces con el mismo nombre de versi\u00f3n. En la segunda versi\u00f3n, esto era un gran dolor de cabeza, ya que los namespaces est\u00e1n aislados, pero pueden influenciarse entre s\u00ed.<\/p>\n<p><img decoding=\"async\" alt=\"El dispositivo Helm y sus complicaciones\" src=\"\/wp-content\/uploads\/2020\/02\/b9b82b7c86320a0e3642e4265a1f0241.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\nEl segundo Helm, al intentar entender si necesita una actualizaci\u00f3n, utiliza \u00fanicamente dos fuentes de informaci\u00f3n: lo que se le proporcion\u00f3 en ese momento y la informaci\u00f3n interna sobre las versiones, que reside en el ConfigMap.<\/p>\n<p><img decoding=\"async\" alt=\"El dispositivo Helm y sus complicaciones\" src=\"\/wp-content\/uploads\/2020\/02\/0550ba5f6ce7be1e7f666dfc65e639ad.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nEl tercer Helm utiliza una estrategia de fusi\u00f3n en tres pasos: adem\u00e1s de la informaci\u00f3n existente, considera tambi\u00e9n la aplicaci\u00f3n que est\u00e1 funcionando en Kubernetes en este momento.<\/p>\n<p><img decoding=\"async\" alt=\"El dispositivo Helm y sus complicaciones\" src=\"\/wp-content\/uploads\/2020\/02\/252085adb83e097e01b4a0655706ede5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nPor esta raz\u00f3n, la versi\u00f3n anterior de Helm no har\u00e1 nada, ya que no tiene en cuenta la informaci\u00f3n de la aplicaci\u00f3n en el cl\u00faster, mientras que Helm 3 recibir\u00e1 los cambios y desplegar\u00e1 la nueva aplicaci\u00f3n.<\/p>\n<p><strong>M\u00e9todo 5. Usar la clave &#8212;recreate-pods<\/strong><\/p>\n<p>Con la clave <code>--recreate-pods<\/code> se puede lograr lo que se pretend\u00eda alcanzar inicialmente con la clave <code>--force<\/code>. Los contenedores se reiniciar\u00e1n y, de acuerdo con la pol\u00edtica imagePullPolicy: Always para la etiqueta latest (de esto se habl\u00f3 en la nota anterior), Kubernetes descargar\u00e1 y ejecutar\u00e1 una nueva versi\u00f3n de la imagen. Esto no se llevar\u00e1 a cabo de la mejor manera: ignorando el StrategyType del despliegue, apagar\u00e1 repentinamente todas las instancias antiguas de la aplicaci\u00f3n y comenzar\u00e1 a lanzar nuevas. Durante el reinicio, el sistema no funcionar\u00e1 y los usuarios sufrir\u00e1n.<\/p>\n<p>La misma problem\u00e1tica en Kubernetes tambi\u00e9n existi\u00f3 durante un largo periodo. Y as\u00ed, despu\u00e9s de 4 a\u00f1os desde la apertura de <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kubernetes\/kubernetes\/issues\/13488\">Issue<\/a><\/noindex>, el problema fue solucionado, y a partir de la versi\u00f3n 1.15 de Kubernetes se introdujo la posibilidad de reinicio continuo de pods.<\/p>\n<p>Helm simplemente apaga todas las aplicaciones y lanza nuevos contenedores al lado. Esto no se puede hacer en producci\u00f3n para no provocar un tiempo de inactividad en la aplicaci\u00f3n. Esto solo debe hacerse para prop\u00f3sitos de desarrollo, y se puede realizar solo en entornos de staging.<\/p>\n<h2>\u00bfC\u00f3mo actualizar la versi\u00f3n de la aplicaci\u00f3n utilizando Helm?<\/h2>\n<p>\nVamos a cambiar los valores enviados a Helm. Por lo general, son los valores que se insertan en lugar de la etiqueta de la imagen. En el caso de latest, que se usa a menudo para entornos no productivos, la informaci\u00f3n modificable es una anotaci\u00f3n que, para Kubernetes, es in\u00fatil, pero para Helm indicar\u00e1 la necesidad de actualizar la aplicaci\u00f3n. Las opciones para completar el valor de la anotaci\u00f3n son:<\/p>\n<ol>\n<li><strong>Valor aleatorio<\/strong> usando la funci\u00f3n est\u00e1ndar \u2014 <code>{{ randAlphaNum 6 }}<\/code>. <br \/>\nHay un matiz: despu\u00e9s de cada despliegue utilizando un chart con esta variable, el valor de la anotaci\u00f3n ser\u00e1 \u00fanico, y Helm asumir\u00e1 que hay cambios. Por lo tanto, siempre estaremos reiniciando la aplicaci\u00f3n, incluso si no hemos cambiado su versi\u00f3n. Esto no es cr\u00edtico, ya que no habr\u00e1 tiempo de inactividad, pero sigue siendo desagradable.<\/li>\n<li>Insertar la <strong>fecha y hora actuales<\/strong> \u2014 <code>{{ .Release.Date }}<\/code>. <br \/>\nEsta opci\u00f3n es similar al valor aleatorio, pero con una variable siempre \u00fanica.<\/li>\n<li>Una forma m\u00e1s correcta es utilizar <strong>sumas de verificaci\u00f3n<\/strong>. Es el SHA de la imagen o el SHA del \u00faltimo commit en git \u2014 <code>{{ .Values.sha }}<\/code>. <br \/>\nDeben ser calculadas y enviadas al cliente de Helm en el lado que llama, por ejemplo, en Jenkins. Si la aplicaci\u00f3n cambia, la suma de verificaci\u00f3n tambi\u00e9n cambiar\u00e1. Por lo tanto, Helm actualizar\u00e1 la aplicaci\u00f3n solo cuando sea necesario.<\/li>\n<\/ol>\n<p><\/p>\n<h2>Resumamos nuestros intentos<\/h2>\n<p><\/p>\n<ul>\n<li>Helm realiza cambios de la manera menos invasiva, por lo que cualquier cambio a nivel de imagen de la aplicaci\u00f3n en Docker Registry no resultar\u00e1 en una actualizaci\u00f3n: despu\u00e9s de ejecutar el comando, no suceder\u00e1 nada.<\/li>\n<li>Clave <code>--force<\/code> se utiliza para restaurar lanzamientos problem\u00e1ticos y no est\u00e1 relacionado con una actualizaci\u00f3n forzada.<\/li>\n<li>Clave <code>--recreate-pods<\/code> actualizar\u00e1 forzosamente las aplicaciones, pero lo har\u00e1 de manera perjudicial: apagar\u00e1 abruptamente todos los contenedores. Los usuarios se ver\u00e1n afectados, no se debe hacer esto en producci\u00f3n.<\/li>\n<li>No se deben realizar cambios directamente en el cl\u00faster de Kubernetes con el comando <code>kubectl edit<\/code> : romperemos la consistencia y el comportamiento variar\u00e1 seg\u00fan la versi\u00f3n de Helm.<\/li>\n<li>Con el lanzamiento de una nueva versi\u00f3n de Helm han surgido muchos matices. Los temas en el repositorio de Helm est\u00e1n descritos en un lenguaje comprensible, ayudar\u00e1n a entender los detalles.<\/li>\n<li>Agregar una anotaci\u00f3n modificable al chart lo har\u00e1 m\u00e1s flexible. Esto permitir\u00e1 implementar la aplicaci\u00f3n correctamente, sin tiempo de inactividad.<\/li>\n<\/ul>\n<p>\nUn concepto del tipo 'paz en todo el mundo', que funciona en todas las \u00e1reas de la vida: lea las instrucciones antes de usar, no despu\u00e9s. Solo con informaci\u00f3n completa se pueden construir sistemas confiables y hacer felices a los usuarios.<\/p>\n<p><strong>Otros enlaces sobre el tema:<\/strong><\/p>\n<ol>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/453734\/\">Introducci\u00f3n a <i>Helm<\/i> 3<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/helm.sh\/\">Sitio oficial de Helm<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/helm\/helm\">Repositorio de Helm en GitHub<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/mailru\/blog\/425343\/\">25 herramientas \u00fatiles de Kubernetes: implementaci\u00f3n y gesti\u00f3n<\/a><\/noindex><\/li>\n<\/ol>\n<p>\nEsta presentaci\u00f3n se pronunci\u00f3 por primera vez en <noindex><a rel=\"nofollow\" href=\"https:\/\/corp.mail.ru\/ru\/press\/events\/at-kubernetes-conference\/\">@Kubernetes Conference<\/a><\/noindex> por Mail.ru Cloud Solutions. Vea <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/playlist?list=PLQzTaxmOHjnv0tP_HDxsIvcuac2kkIJTQ\">videos<\/a><\/noindex> otras presentaciones y suscr\u00edbase a los anuncios de eventos en Telegram <noindex><a rel=\"nofollow\" href=\"https:\/\/t.me\/k8s_mail\">Alrededor de Kubernetes en Mail.ru Group<\/a><\/noindex>.<br \/>\n<br \/>Fuente: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/mailru\/blog\/488192\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>Typhon freight hauler concept, Anton Swanepoel \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0414\u043c\u0438\u0442\u0440\u0438\u0439 \u0421\u0443\u0433\u0440\u043e\u0431\u043e\u0432, \u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0432 \u00ab\u041b\u0435\u0440\u0443\u0430 \u041c\u0435\u0440\u043b\u0435\u043d\u00bb. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u0437\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u0435\u043d Helm, \u043a\u0430\u043a \u043e\u043d \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 Kubernetes, \u0447\u0442\u043e \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u043e\u0441\u044c \u0432 \u0442\u0440\u0435\u0442\u044c\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0438 \u043a\u0430\u043a \u0441 \u0435\u0433\u043e \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0435 \u0431\u0435\u0437 \u043f\u0440\u043e\u0441\u0442\u043e\u044f. \u042d\u0442\u043e \u043a\u043e\u043d\u0441\u043f\u0435\u043a\u0442 \u043f\u043e \u043c\u043e\u0442\u0438\u0432\u0430\u043c \u0432\u044b\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 @Kubernetes Conference by Mail.ru Cloud [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":70955,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-70954","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/ustrojstvo-helm-i-ego-podvodnye-kamni\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e Helm \u0438 \u0435\u0433\u043e \u043f\u043e\u0434\u0432\u043e\u0434\u043d\u044b\u0435 \u043a\u0430\u043c\u043d\u0438 | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/ustrojstvo-helm-i-ego-podvodnye-kamni\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-02-22T21:58:17+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-03-03T13:14:40+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47La estructura de Helm y sus detalles ocultos | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/ustrojstvo-helm-i-ego-podvodnye-kamni","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"es_ES","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e Helm \u0438 \u0435\u0433\u043e \u043f\u043e\u0434\u0432\u043e\u0434\u043d\u044b\u0435 \u043a\u0430\u043c\u043d\u0438 | ProHoster","og:url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/ustrojstvo-helm-i-ego-podvodnye-kamni","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-02-22T21:58:17+00:00","article:modified_time":"2020-03-03T13:14:40+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"70954","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 19:11:23","updated":"2022-09-30 13:54:53","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/70954","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=70954"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/70954\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/70955"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=70954"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=70954"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=70954"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}