<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://slargacha.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://slargacha.github.io/" rel="alternate" type="text/html" /><updated>2026-03-16T13:18:32+00:00</updated><id>https://slargacha.github.io/feed.xml</id><title type="html">Sebastian Largacha</title><subtitle>DevOps Engineer specializing in cloud infrastructure, automation, and scalable systems.</subtitle><author><name>Sebastian Largacha</name><email>your-email@email.com</email></author><entry><title type="html">Objects de tipo Workload en Kubernetes</title><link href="https://slargacha.github.io/blog/2026/03/13/workload-objects-en-kubernetes/" rel="alternate" type="text/html" title="Objects de tipo Workload en Kubernetes" /><published>2026-03-13T00:00:00+00:00</published><updated>2026-03-13T00:00:00+00:00</updated><id>https://slargacha.github.io/blog/2026/03/13/workload-objects-en-kubernetes</id><content type="html" xml:base="https://slargacha.github.io/blog/2026/03/13/workload-objects-en-kubernetes/"><![CDATA[<h2 id="qué-son-los-workload-objects-en-kubernetes">¿Qué son los Workload Objects en Kubernetes?</h2>

<p>En Kubernetes, los <strong>Workload Objects</strong> (objetos de carga de trabajo) son los recursos que se encargan de gestionar y ejecutar tus aplicaciones dentro del clúster. Estos objetos definen cómo se crean, escalan y mantienen los <strong>Pods</strong> — la unidad mínima de ejecución en Kubernetes.</p>

<p>En lugar de crear Pods directamente, lo recomendado es usar estos objetos de mayor nivel que proporcionan capacidades como auto-recuperación, escalado, actualizaciones progresivas y más.</p>

<hr />

<h2 id="los-principales-workload-objects">Los principales Workload Objects</h2>

<h3 id="1-pod">1. Pod</h3>

<p>El <strong>Pod</strong> es la unidad más pequeña y básica en Kubernetes. Representa uno o más contenedores que comparten red y almacenamiento.</p>

<ul>
  <li>Cada Pod tiene su propia dirección IP</li>
  <li>Los contenedores dentro de un Pod comparten el mismo espacio de red (localhost)</li>
  <li>Generalmente no se crean Pods directamente en producción, sino a través de otros Workload Objects</li>
</ul>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">apiVersion</span><span class="pi">:</span> <span class="s">v1</span>
<span class="na">kind</span><span class="pi">:</span> <span class="s">Pod</span>
<span class="na">metadata</span><span class="pi">:</span>
  <span class="na">name</span><span class="pi">:</span> <span class="s">mi-app</span>
<span class="na">spec</span><span class="pi">:</span>
  <span class="na">containers</span><span class="pi">:</span>
    <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">app</span>
      <span class="na">image</span><span class="pi">:</span> <span class="s">nginx:latest</span>
      <span class="na">ports</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">containerPort</span><span class="pi">:</span> <span class="m">80</span>
</code></pre></div></div>

<hr />

<h3 id="2-deployment">2. Deployment</h3>

<p>El <strong>Deployment</strong> es el objeto más utilizado. Gestiona un conjunto de Pods idénticos (réplicas) y permite actualizaciones declarativas.</p>

<p><strong>¿Para qué sirve?</strong></p>
<ul>
  <li>Mantener un número deseado de réplicas de tu aplicación</li>
  <li>Realizar <strong>rolling updates</strong> (actualizaciones sin downtime)</li>
  <li>Hacer <strong>rollbacks</strong> a versiones anteriores</li>
  <li>Escalar horizontal y automáticamente</li>
</ul>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">apiVersion</span><span class="pi">:</span> <span class="s">apps/v1</span>
<span class="na">kind</span><span class="pi">:</span> <span class="s">Deployment</span>
<span class="na">metadata</span><span class="pi">:</span>
  <span class="na">name</span><span class="pi">:</span> <span class="s">mi-deployment</span>
<span class="na">spec</span><span class="pi">:</span>
  <span class="na">replicas</span><span class="pi">:</span> <span class="m">3</span>
  <span class="na">selector</span><span class="pi">:</span>
    <span class="na">matchLabels</span><span class="pi">:</span>
      <span class="na">app</span><span class="pi">:</span> <span class="s">mi-app</span>
  <span class="na">template</span><span class="pi">:</span>
    <span class="na">metadata</span><span class="pi">:</span>
      <span class="na">labels</span><span class="pi">:</span>
        <span class="na">app</span><span class="pi">:</span> <span class="s">mi-app</span>
    <span class="na">spec</span><span class="pi">:</span>
      <span class="na">containers</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">app</span>
          <span class="na">image</span><span class="pi">:</span> <span class="s">mi-imagen:v1</span>
          <span class="na">ports</span><span class="pi">:</span>
            <span class="pi">-</span> <span class="na">containerPort</span><span class="pi">:</span> <span class="m">80</span>
</code></pre></div></div>

<hr />

<h3 id="3-replicaset">3. ReplicaSet</h3>

<p>El <strong>ReplicaSet</strong> garantiza que un número específico de réplicas de un Pod esté corriendo en todo momento.</p>

<p><strong>¿Para qué sirve?</strong></p>
<ul>
  <li>Mantener la cantidad deseada de Pods activos</li>
  <li>Si un Pod falla, el ReplicaSet crea uno nuevo automáticamente</li>
</ul>

<blockquote>
  <p><strong>Nota:</strong> En la práctica, no se suelen crear ReplicaSets directamente. Los <strong>Deployments</strong> los gestionan de forma automática.</p>
</blockquote>

<hr />

<h3 id="4-statefulset">4. StatefulSet</h3>

<p>El <strong>StatefulSet</strong> es similar a un Deployment, pero está diseñado para aplicaciones con <strong>estado</strong> (stateful) que necesitan identidad persistente y almacenamiento estable.</p>

<p><strong>¿Para qué sirve?</strong></p>
<ul>
  <li>Bases de datos (MySQL, PostgreSQL, MongoDB)</li>
  <li>Sistemas de mensajería (Kafka, RabbitMQ)</li>
  <li>Aplicaciones que necesitan nombres de red estables y predecibles</li>
  <li>Almacenamiento persistente vinculado a cada Pod</li>
</ul>

<p><strong>Características clave:</strong></p>
<ul>
  <li>Cada Pod tiene un nombre único y ordenado (<code class="language-plaintext highlighter-rouge">pod-0</code>, <code class="language-plaintext highlighter-rouge">pod-1</code>, <code class="language-plaintext highlighter-rouge">pod-2</code>)</li>
  <li>Se crean y eliminan en orden secuencial</li>
  <li>Cada Pod puede tener su propio PersistentVolumeClaim</li>
</ul>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">apiVersion</span><span class="pi">:</span> <span class="s">apps/v1</span>
<span class="na">kind</span><span class="pi">:</span> <span class="s">StatefulSet</span>
<span class="na">metadata</span><span class="pi">:</span>
  <span class="na">name</span><span class="pi">:</span> <span class="s">mi-db</span>
<span class="na">spec</span><span class="pi">:</span>
  <span class="na">serviceName</span><span class="pi">:</span> <span class="s2">"</span><span class="s">mi-db"</span>
  <span class="na">replicas</span><span class="pi">:</span> <span class="m">3</span>
  <span class="na">selector</span><span class="pi">:</span>
    <span class="na">matchLabels</span><span class="pi">:</span>
      <span class="na">app</span><span class="pi">:</span> <span class="s">mi-db</span>
  <span class="na">template</span><span class="pi">:</span>
    <span class="na">metadata</span><span class="pi">:</span>
      <span class="na">labels</span><span class="pi">:</span>
        <span class="na">app</span><span class="pi">:</span> <span class="s">mi-db</span>
    <span class="na">spec</span><span class="pi">:</span>
      <span class="na">containers</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">postgres</span>
          <span class="na">image</span><span class="pi">:</span> <span class="s">postgres:15</span>
          <span class="na">volumeMounts</span><span class="pi">:</span>
            <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">data</span>
              <span class="na">mountPath</span><span class="pi">:</span> <span class="s">/var/lib/postgresql/data</span>
  <span class="na">volumeClaimTemplates</span><span class="pi">:</span>
    <span class="pi">-</span> <span class="na">metadata</span><span class="pi">:</span>
        <span class="na">name</span><span class="pi">:</span> <span class="s">data</span>
      <span class="na">spec</span><span class="pi">:</span>
        <span class="na">accessModes</span><span class="pi">:</span> <span class="pi">[</span><span class="s2">"</span><span class="s">ReadWriteOnce"</span><span class="pi">]</span>
        <span class="na">resources</span><span class="pi">:</span>
          <span class="na">requests</span><span class="pi">:</span>
            <span class="na">storage</span><span class="pi">:</span> <span class="s">10Gi</span>
</code></pre></div></div>

<hr />

<h3 id="5-daemonset">5. DaemonSet</h3>

<p>El <strong>DaemonSet</strong> asegura que una copia de un Pod se ejecute en <strong>todos</strong> (o algunos) nodos del clúster.</p>

<p><strong>¿Para qué sirve?</strong></p>
<ul>
  <li>Agentes de monitoreo (Prometheus Node Exporter, Datadog)</li>
  <li>Agentes de logging (Fluentd, Filebeat)</li>
  <li>Herramientas de red (kube-proxy, CNI plugins)</li>
  <li>Agentes de seguridad</li>
</ul>

<p>Cuando se agrega un nuevo nodo al clúster, el DaemonSet automáticamente despliega el Pod en ese nodo.</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">apiVersion</span><span class="pi">:</span> <span class="s">apps/v1</span>
<span class="na">kind</span><span class="pi">:</span> <span class="s">DaemonSet</span>
<span class="na">metadata</span><span class="pi">:</span>
  <span class="na">name</span><span class="pi">:</span> <span class="s">agente-monitoreo</span>
<span class="na">spec</span><span class="pi">:</span>
  <span class="na">selector</span><span class="pi">:</span>
    <span class="na">matchLabels</span><span class="pi">:</span>
      <span class="na">app</span><span class="pi">:</span> <span class="s">monitoreo</span>
  <span class="na">template</span><span class="pi">:</span>
    <span class="na">metadata</span><span class="pi">:</span>
      <span class="na">labels</span><span class="pi">:</span>
        <span class="na">app</span><span class="pi">:</span> <span class="s">monitoreo</span>
    <span class="na">spec</span><span class="pi">:</span>
      <span class="na">containers</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">node-exporter</span>
          <span class="na">image</span><span class="pi">:</span> <span class="s">prom/node-exporter:latest</span>
          <span class="na">ports</span><span class="pi">:</span>
            <span class="pi">-</span> <span class="na">containerPort</span><span class="pi">:</span> <span class="m">9100</span>
</code></pre></div></div>

<hr />

<h3 id="6-job">6. Job</h3>

<p>El <strong>Job</strong> ejecuta uno o más Pods hasta que se completen exitosamente. A diferencia de un Deployment, un Job no mantiene los Pods corriendo indefinidamente.</p>

<p><strong>¿Para qué sirve?</strong></p>
<ul>
  <li>Migraciones de base de datos</li>
  <li>Procesamiento batch de datos</li>
  <li>Tareas de respaldo (backups)</li>
  <li>Cualquier tarea que deba ejecutarse una vez y terminar</li>
</ul>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">apiVersion</span><span class="pi">:</span> <span class="s">batch/v1</span>
<span class="na">kind</span><span class="pi">:</span> <span class="s">Job</span>
<span class="na">metadata</span><span class="pi">:</span>
  <span class="na">name</span><span class="pi">:</span> <span class="s">migracion-db</span>
<span class="na">spec</span><span class="pi">:</span>
  <span class="na">template</span><span class="pi">:</span>
    <span class="na">spec</span><span class="pi">:</span>
      <span class="na">containers</span><span class="pi">:</span>
        <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">migrar</span>
          <span class="na">image</span><span class="pi">:</span> <span class="s">mi-app:latest</span>
          <span class="na">command</span><span class="pi">:</span> <span class="pi">[</span><span class="s2">"</span><span class="s">python"</span><span class="pi">,</span> <span class="s2">"</span><span class="s">manage.py"</span><span class="pi">,</span> <span class="s2">"</span><span class="s">migrate"</span><span class="pi">]</span>
      <span class="na">restartPolicy</span><span class="pi">:</span> <span class="s">Never</span>
  <span class="na">backoffLimit</span><span class="pi">:</span> <span class="m">3</span>
</code></pre></div></div>

<hr />

<h3 id="7-cronjob">7. CronJob</h3>

<p>El <strong>CronJob</strong> crea Jobs de forma programada, siguiendo la sintaxis cron de Linux.</p>

<p><strong>¿Para qué sirve?</strong></p>
<ul>
  <li>Backups programados</li>
  <li>Envío de reportes periódicos</li>
  <li>Limpieza de datos temporales</li>
  <li>Tareas de mantenimiento recurrentes</li>
</ul>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">apiVersion</span><span class="pi">:</span> <span class="s">batch/v1</span>
<span class="na">kind</span><span class="pi">:</span> <span class="s">CronJob</span>
<span class="na">metadata</span><span class="pi">:</span>
  <span class="na">name</span><span class="pi">:</span> <span class="s">backup-diario</span>
<span class="na">spec</span><span class="pi">:</span>
  <span class="na">schedule</span><span class="pi">:</span> <span class="s2">"</span><span class="s">0</span><span class="nv"> </span><span class="s">2</span><span class="nv"> </span><span class="s">*</span><span class="nv"> </span><span class="s">*</span><span class="nv"> </span><span class="s">*"</span>
  <span class="na">jobTemplate</span><span class="pi">:</span>
    <span class="na">spec</span><span class="pi">:</span>
      <span class="na">template</span><span class="pi">:</span>
        <span class="na">spec</span><span class="pi">:</span>
          <span class="na">containers</span><span class="pi">:</span>
            <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">backup</span>
              <span class="na">image</span><span class="pi">:</span> <span class="s">mi-backup:latest</span>
              <span class="na">command</span><span class="pi">:</span> <span class="pi">[</span><span class="s2">"</span><span class="s">./backup.sh"</span><span class="pi">]</span>
          <span class="na">restartPolicy</span><span class="pi">:</span> <span class="s">OnFailure</span>
</code></pre></div></div>

<hr />

<h2 id="resumen">Resumen</h2>

<table>
  <thead>
    <tr>
      <th>Workload Object</th>
      <th>Uso principal</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>Pod</strong></td>
      <td>Unidad básica de ejecución</td>
    </tr>
    <tr>
      <td><strong>Deployment</strong></td>
      <td>Apps stateless con rolling updates</td>
    </tr>
    <tr>
      <td><strong>ReplicaSet</strong></td>
      <td>Mantener réplicas (gestionado por Deployments)</td>
    </tr>
    <tr>
      <td><strong>StatefulSet</strong></td>
      <td>Apps con estado (bases de datos)</td>
    </tr>
    <tr>
      <td><strong>DaemonSet</strong></td>
      <td>Un Pod por nodo (monitoreo, logging)</td>
    </tr>
    <tr>
      <td><strong>Job</strong></td>
      <td>Tareas que se ejecutan una vez</td>
    </tr>
    <tr>
      <td><strong>CronJob</strong></td>
      <td>Tareas programadas periódicamente</td>
    </tr>
  </tbody>
</table>

<hr />

<p>Elegir el Workload Object correcto es clave para diseñar aplicaciones robustas y eficientes en Kubernetes. Cada uno tiene su propósito y entender cuándo usar cada tipo te ahorrará muchos dolores de cabeza en producción.</p>

<hr />

<p><img src="/assets/images/k8s-workloads.webp" alt="Kubernetes Workload Objects" /></p>]]></content><author><name>Sebastian Largacha</name><email>your-email@email.com</email></author><category term="Kubernetes" /><category term="DevOps" /><category term="Containers" /><category term="Cloud" /><summary type="html"><![CDATA[Conoce los principales objetos de tipo Workload en Kubernetes, qué son, para qué sirven y cuándo usar cada uno.]]></summary></entry></feed>