<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ helm - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Descubre miles de cursos de programación escritos por expertos. Aprende Desarrollo Web, Ciencia de Datos, DevOps, Seguridad y obtén asesoramiento profesional para desarrolladores. ]]>
        </description>
        <link>https://www.freecodecamp.org/espanol/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ helm - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/espanol/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Fri, 19 Jun 2026 05:19:16 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/espanol/news/tag/helm/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ ¿Qué es un Helm Chart? Un tutorial para principiantes en Kubernetes ]]>
                </title>
                <description>
                    <![CDATA[ Kubernetes [https://azure.microsoft.com/es-es/products/kubernetes-service/?WT.mc_id=containers-19838-ludossan] es una herramienta muy útil para los desarrolladores nativos de la nube. Pero no cubre todas las bases por sí sola: hay algunas cosas que Kubernetes no puede resolver o que están fuera de su alcance. Esta es una de las razones por las que los proyectos de ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/que-es-un-helm-chart-un-tutorial-para-principiantes-en-kubernetes/</link>
                <guid isPermaLink="false">63cbf391700708073437c1e0</guid>
                
                    <category>
                        <![CDATA[ helm ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Jorge Sierra ]]>
                </dc:creator>
                <pubDate>Thu, 26 Jan 2023 18:28:32 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2023/01/604640a8a7946308b768453d.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/what-is-a-helm-chart-tutorial-for-kubernetes-beginners/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">What is a Helm Chart? A Tutorial for Kubernetes Beginners</a>
      </p><p><a href="https://azure.microsoft.com/es-es/products/kubernetes-service/?WT.mc_id=containers-19838-ludossan">Kubernetes </a>es una herramienta muy útil para los desarrolladores nativos de la nube. Pero no cubre todas las bases por sí sola: hay algunas cosas que Kubernetes no puede resolver o que están fuera de su alcance.</p><p>Esta es una de las razones por las que los proyectos de código abierto son tan fantásticos. Ayudan a que herramientas increíbles sean aún más increíbles cuando las combinamos con otras herramientas increíbles de código abierto. Y a menudo estas herramientas se desarrollaron con el único propósito de llenar los vacíos. Una de estas herramientas es Helm.</p><h2 id="-qu-es-helm">¿Qué es Helm?</h2><p><a href="https://helm.sh/">Helm </a>es ampliamente conocido como "el gestor de paquetes para <a href="https://azure.microsoft.com/es-es/products/kubernetes-service/?WT.mc_id=containers-19838-ludossan">Kubernetes</a>". Aunque se presenta así, su alcance va mucho más allá del de un simple gestor de paquetes. Sin embargo, empecemos por el principio.</p><p>Helm es un proyecto de código abierto que fue creado originalmente por <a href="https://deislabs.io/">DeisLabs </a>y donado a <a href="https://azure.microsoft.com/es-es/blog/announcing-cncf/?WT.mc_id=containers-19838-ludossan">CNCF</a>, que ahora lo mantiene. El objetivo original de Helm era proporcionar a los usuarios una forma mejor de gestionar todos los archivos YAML de <a href="https://azure.microsoft.com/es-es/products/kubernetes-service/?WT.mc_id=containers-19838-ludossan">Kubernetes </a>que creamos en los proyectos de <a href="https://azure.microsoft.com/es-es/products/kubernetes-service/?WT.mc_id=containers-19838-ludossan">Kubernetes</a>.</p><p>El camino que <a href="https://learn.microsoft.com/es-es/azure/aks/kubernetes-helm?WT.mc_id=containers-19838-ludossan">Helm </a>tomó para resolver este problema fue crear Helm <a href="https://learn.microsoft.com/es-es/azure/aks/kubernetes-helm?WT.mc_id=containers-19838-ludossan">Charts</a>. Cada gráfico es un paquete con uno o más manifiestos de <a href="https://azure.microsoft.com/es-es/products/kubernetes-service/?WT.mc_id=containers-19838-ludossan">Kubernetes</a>: un gráfico puede tener gráficos hijos y gráficos dependientes.</p><p>Esto significa que Helm instala todo el árbol de dependencias de un proyecto si ejecuta el comando install para el gráfico de nivel superior. Sólo tiene que ejecutar un único comando para instalar toda su aplicación, en lugar de listar los ficheros a instalar mediante <code>kubectl</code>.</p><p>Charts también te permite versionar tus archivos de manifiesto, al igual que hacemos con Node.js o cualquier otro paquete. Esto te permite instalar versiones específicas de gráficos, lo que significa mantener configuraciones específicas para tu infraestructura en forma de código.</p><p>Helm también mantiene un historial de versiones de todas las cartas desplegadas, por lo que puede volver a una versión anterior si algo va mal.</p><p><a href="https://learn.microsoft.com/es-es/azure/aks/kubernetes-helm?WT.mc_id=containers-19838-ludossan">Helm </a>soporta <a href="https://azure.microsoft.com/es-es/products/kubernetes-service/?WT.mc_id=containers-19838-ludossan">Kubernetes </a>de forma nativa, lo que significa que no tienes que escribir ningún archivo de sintaxis complejo ni nada para empezar a usar Helm. Solo tienes que soltar tus archivos de plantilla en un nuevo gráfico y listo.</p><p>Pero, ¿por qué deberíamos utilizarlo? La gestión de los manifiestos de aplicación puede hacerse fácilmente con unas pocas combinaciones de comandos.</p><h2 id="-por-qu-utilizar-helm">¿Por qué utilizar Helm?</h2><p>Helm realmente brilla donde Kubernetes no llegó. Por ejemplo, las plantillas. El alcance del proyecto Kubernetes es tratar con sus contenedores para usted, no sus archivos de plantilla.</p><p>Esto dificulta en exceso la creación de archivos realmente genéricos que puedan utilizarse en un equipo o una organización grandes, con muchos parámetros diferentes que deben configurarse para cada archivo.</p><p>Y también, ¿cómo versionar información sensible usando Git cuando los archivos de plantilla son texto plano?</p><p>La respuesta: Ir a las plantillas. Helm le permite añadir variables y utilizar funciones dentro de sus archivos de plantilla. Esto lo hace perfecto para aplicaciones escalables que eventualmente necesitarán cambiar sus parámetros. Veamos un ejemplo.</p><p>Tengo un proyecto de código abierto llamado <a href="https://github.com/khaosdoctor/zaqar/">Zaqar</a>, un microservicio de correo electrónico simple para Node.js que se comunica con SendGrid. El proyecto se compone básicamente de un servicio, un despliegue y un autoescalador.</p><p>Tomemos como ejemplo el archivo de despliegue. Tendría algo como esto</p><pre><code class="language-yaml">apiVersion: apps/v1
kind: Deployment
metadata:
  name: zaqar
  namespace: default
  labels:
    app: zaqar
    version: v1.0.0
    env: production
spec:
  replicas: 1
  selector:
    matchLabels:
      app: zaqar
      env: production
  template:
    metadata:
      labels:
        app: zaqar
        version: v1.0.0
        env: production
    spec:
      containers:
        - name: zaqar
          image: "khaosdoctor/zaqar:v1.0.0"
          imagePullPolicy: IfNotPresent
          env:
            - name: SENDGRID_APIKEY
              value: "MY_SECRET_KEY"
            - name: DEFAULT_FROM_ADDRESS
              value: "my@email.com"
            - name: DEFAULT_FROM_NAME
              value: "Lucas Santos"
          ports:
            - name: http
              containerPort: 3000
              protocol: TCP
          resources:
            requests:
              cpu: 100m
              memory: 128Mi
            limits:
              cpu: 250m
              memory: 256Mi</code></pre><p>Si quisiera usar esta plantilla en un CI pipeline, o publicarla en mi GitHub, necesitaría reemplazar las partes variables por marcadores de posición. Así que podemos reemplazar estos textos con la información requerida.</p><p>En este caso, tanto la etiqueta de versión como la etiqueta <code>env</code> y las variables de entorno se sustituirían por marcadores de posición, así:</p><pre><code class="language-yaml">apiVersion: apps/v1
kind: Deployment
metadata:
  name: zaqar
  namespace: default
  labels:
    app: zaqar
    version: #!VERSION!#
    env: #!ENV!#
spec:
  replicas: 1
  selector:
    matchLabels:
      app: zaqar
      env: #!ENV!#
  template:
    metadata:
      labels:
        app: zaqar
        version: #!VERSION!#
        env: #!ENV!#
    spec:
      containers:
        - name: zaqar
          image: "khaosdoctor/zaqar:#!VERSION!#"
          imagePullPolicy: IfNotPresent
          env:
            - name: SENDGRID_APIKEY
              value: "#!SENDGRID_KEY!#"
            - name: DEFAULT_FROM_ADDRESS
              value: "#!FROM_ADDR!#"
            - name: DEFAULT_FROM_NAME
              value: "#!FROM_NAME!#"
          ports:
            - name: http
              containerPort: 3000
              protocol: TCP
          resources:
            requests:
              cpu: 100m
              memory: 128Mi
            limits:
              cpu: 250m
              memory: 256Mi</code></pre><p>Ahora podemos ejecutar nuestro CI pipeline. Pero antes de hacerlo, tenemos que reemplazar nuestros marcadores de posición con los valores reales.</p><p>Para ello podemos utilizar <code>sed</code> y su "super fácil" <code>sed 's/#!PLACEHOLDER!#/replacement/g'</code>, y canalizar esto hacia abajo hasta que terminemos todos los marcadores de posición. El comando final sería algo como esto:</p><pre><code class="language-bash">cat deploy.yaml | \
    sed 's/#!ENV!#/production/g' | \
    sed 's/#!VERSION!#/v1.0.0/g' | \
    sed 's/#!SENDGRID_KEY!#/MyKey/g' | \
    sed 's/#!FROM_ADDR!#/my@email.com/g' | \
    sed 's/#!FROM_NAME!#/Lucas Santos/g'</code></pre><p>Por defecto, sed envía todo al archivo<code>stdout</code>, para que podamos añadir otra tubería a <code>kubectl -f</code>, como <code>&lt;all the command from before&gt; | kubectl -f -</code>. Entonces tendremos nuestro despliegue en su lugar. El único problema es que tenemos que hacer lo mismo para todos los demás archivos.</p><p>Ahora imagina un proyecto más grande, con muchas otras variables y marcadores de posición. Probablemente, escribirías un script para hacerlo por ti, ¿verdad? Ese script es Helm.</p><p>Cuando se crea un Gráfico (más sobre esto más adelante), tenemos un árbol de directorios específico que debemos seguir para que Helm entienda lo que queremos hacer. Dentro del directorio <code>templates</code> podemos añadir nuestros archivos de manifiesto, <strong>con</strong> <strong>plantillas go nativas</strong>, de la siguiente manera:</p><pre><code class="language-yaml">apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Values.name }}
  namespace: {{ default .Release.Namespace .Values.namespace }}
  labels:
    app: {{ .Values.name }}
    version: {{ .Values.image.tag }}
    env: {{ .Values.env }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app: {{ .Values.name }}
      env: {{ .Values.env }}
  template:
    metadata:
      labels:
        app: {{ .Values.name }}
        version: {{ .Values.image.tag }}
        env: {{ .Values.env }}
    spec:
      containers:
        - name: {{ .Chart.Name }}
          image: "khaosdoctor/zaqar:{{ .Values.image.tag }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          env:
            - name: SENDGRID_APIKEY
              value: {{ required "You must set a valid Sendgrid API key" .Values.environment.SENDGRID_APIKEY | quote }}
            - name: DEFAULT_FROM_ADDRESS
              value: {{ required "You must set a default from address" .Values.environment.DEFAULT_FROM_ADDRESS | quote }}
            - name: DEFAULT_FROM_NAME
              value: {{ required "You must set a default from name" .Values.environment.DEFAULT_FROM_NAME | quote }}
          ports:
            - name: http
              containerPort: 3000
              protocol: TCP
          resources:
            {{- toYaml .Values.resources | nindent 12 }}</code></pre><p>Todos esos valores pueden obtenerse a partir de un archivo <code>Values.yaml</code> (para los valores por defecto), o puede configurarlos en la CLI utilizando el comando con su bandera <code>--set &lt;path&gt; value</code>.</p><p>Si queremos instalar nuestro gráfico podemos emitir el siguiente comando:</p><pre><code class="language-bash">helm upgrade --install --create-namespace myChart ./path/to/my/chart \
  --set image.tag=v1.0.0 \
  --set env=production \
  --set environment.SENDGRID_APIKEY=myKey \
  --set environment.DEFAULT_FROM_ADDRESS="my@email.com" \
  --set environment.DEFAULT_FROM_NAME="Lucas Santos"</code></pre><p>Helm también nos permite utilizar funciones dentro de nuestros despliegues. Así que podemos tener <code>default</code> para volver a los valores por defecto si no se rellenan, como el espacio de nombres. O podemos tener <code>required</code> que muestra un mensaje y no instala el gráfico si no se proporciona el valor, que es el caso de nuestras variables de entorno.</p><p>Hay muchas otras funciones útiles en sus documentos.</p><p>Ahora podemos no sólo gestionar de forma más eficiente los recursos de nuestra aplicación, sino también publicar estos recursos en un sistema de versiones de código abierto sin ningún tipo de molestia ni problema de seguridad.</p><h2 id="c-mo-crear-un-cuadro-de-mando">Cómo crear un cuadro de mando</h2><p>Es bastante fácil crear un gráfico en Helm. Primero, necesita tener <a href="https://helm.sh/es/docs/intro/quickstart/">Helm instalado</a>. Luego, simplemente escriba <code>helm create &lt;chart name&gt;</code> y creará un directorio lleno de archivos y otros directorios. Esos archivos son necesarios para que Helm cree un gráfico.</p><p>Veamos con más detalle qué aspecto tiene este árbol de archivos y qué archivos contiene:</p><ul><li><strong><strong>chart.yaml:</strong></strong> Aquí es donde pondrás la información relacionada con tu gráfico. Eso incluye la versión del gráfico, el nombre y la descripción para que puedas encontrarlo si lo publicas en un repositorio abierto. También en este archivo podrás establecer <a href="https://helm.sh/es/docs/topics/provenance/">dependencias</a> externas usando el comando <code>dependencies</code> llave.</li><li><strong><strong>values.yaml</strong></strong>: Como vimos antes, este es el archivo que contiene los valores por defecto para las variables.</li><li><strong><strong>templates (dir):</strong></strong> Este es el lugar donde pondrás todos tus archivos de manifiesto. Todo lo que haya aquí se transmitirá y creará en Kubernetes.</li><li><strong><strong>charts:</strong></strong>Si su gráfico depende de otro gráfico de su propiedad, o si no quiere depender de la biblioteca por defecto de Helm (el registro por defecto de donde Helm extrae los gráficos), puede traer esta misma estructura dentro de este directorio. Las dependencias de los gráficos se instalan de abajo a arriba, lo que significa que si el gráfico A depende del gráfico B, y B depende de C, el orden de instalación será C -&gt;B -&gt;A.</li></ul><p>Hay otros campos, pero estos son los más comunes, y son los obligatorios. Puedes echar un vistazo rápido al <a href="https://github.com/khaosdoctor/zaqar/tree/master/helm">repositorio de Zaqar </a>para comprobar cómo podemos publicar gráficos de código abierto.</p><p>Una nota rápida: Cuando instale Helm, asegúrese de que está instalando la versión 3. La versión 2 todavía funciona. La versión 2 todavía funciona, pero necesita un componente del lado del servidor llamado Tiller, que ata su instalación helm a un solo clúster. Helm 3 eliminó esta necesidad con la adición de varios CRDs, pero no es compatible con todas las versiones de Kubernetes.</p><h2 id="c-mo-organizar-un-cuadro-de-mando">Cómo organizar un cuadro de mando</h2><p>Vale, has creado tu gráfico, ¿y ahora qué? ¿Tenemos que descargar todo el repositorio para instalar esos gráficos? Helm tiene una <a href="https://artifacthub.io/">biblioteca pública para los gráficos más utilizados</a>, que funciona como Docker Hub.</p><p>También puede crear su propio repositorio de gráficos y <a href="https://helm.sh/docs/topics/chart_repository/">alojarlo en línea</a>. Helm bebe de la misma fuente que HomeBrew, o Linux. Puede acceder a estos repositorios para descargar los gráficos que contienen.</p><p>Dado que un repositorio de gráficos es básicamente un <code>index.yaml</code> servido desde un servidor web estático, prácticamente se puede crear un repositorio de gráficos desde cualquier lugar.</p><p>Por ejemplo, <a href="https://github.com/khaosdoctor/zaqar/tree/master/helm">Zaqar</a> está alojado en GitHub Pages y es accesible a través de mi <a href="https://beacons.ai/lsantos">dominio</a>. Cuando Helm busca un <code>index.yaml</code> en realidad, está buscando la lista de versiones disponibles de ese gráfico, sus compendios SHA256 y la ubicación del archivo empaquetado <code>.tgz</code> para descargar el gráfico. Esto es más o menos lo que NPM hace bajo el capó (demasiado simplificado).</p><p>Esto significa que no necesitas tener tu repositorio clonado para siempre, y tus gráficos también pueden ser privados. Sólo necesitas crear un repositorio de gráficos.</p><p>Incluso puedes utilizar <a href="https://learn.microsoft.com/en-us/azure/container-registry/container-registry-helm-repos?WT.mc_id=containers-19838-ludossan">servicios alojados como Azure CR</a> para hacer el trabajo, o puedes tener una solución completa llamada <a href="https://github.com/helm/chartmuseum">Chart Museum</a>, que te permite almacenar tus gráficos y te proporciona una interfaz de usuario ordenada.</p><h2 id="conclusi-n">Conclusión</h2><p>Helm está aquí para quedarse. Ha ayudado y ayudará a muchos desarrolladores de Kubernetes durante mucho tiempo.</p><p>Si quieres saber cómo usar Helm, puedes consultar su <a href="https://helm.sh/es/">documentación</a>, o puedes seguir este <a href="https://learn.microsoft.com/es-es/training/modules/aks-app-package-management-using-helm/?WT.mc_id=containers-19838-ludossan">módulo de aprendizaje gratuito</a> sobre cómo desplegar tus aplicaciones en Kubernetes de forma sencilla con Helm.</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
