<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Coles C</title>
    <description>The latest articles on Forem by Coles C (@coles980).</description>
    <link>https://forem.com/coles980</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F851495%2Fb2b8aa57-ebf0-4fac-92ac-82ac4fa3a294.png</url>
      <title>Forem: Coles C</title>
      <link>https://forem.com/coles980</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/coles980"/>
    <language>en</language>
    <item>
      <title>Kubernetes resources</title>
      <dc:creator>Coles C</dc:creator>
      <pubDate>Wed, 25 Mar 2026 20:58:43 +0000</pubDate>
      <link>https://forem.com/coles980/kubernetes-resources-50lo</link>
      <guid>https://forem.com/coles980/kubernetes-resources-50lo</guid>
      <description>&lt;p&gt;En Kubernetes, hay configuraciones que parecen pequeñas, pero tienen un impacto enorme en operación. Una de las más importantes es &lt;code&gt;resources&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Muchos equipos la rellenan al final, copiando valores de otro deployment o usando números “razonables” sin validar nada. El problema es que Kubernetes sí se toma esos valores muy en serio. A partir de ahí decide dónde ubicar un pod, cuánto puede consumir y cómo se comporta el nodo cuando hay presión de recursos.&lt;/p&gt;

&lt;p&gt;Por eso, cuando &lt;code&gt;resources&lt;/code&gt; está mal definido, los síntomas aparecen rápido: pods en &lt;code&gt;Pending&lt;/code&gt;, reinicios por &lt;code&gt;OOMKilled&lt;/code&gt;, CPU throttling, degradación bajo carga o incluso &lt;code&gt;Evicted&lt;/code&gt; en procesos con alto uso de almacenamiento temporal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué estás definiendo realmente
&lt;/h2&gt;

&lt;p&gt;Cuando declaras algo como esto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;requests&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;cpu&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;250m"&lt;/span&gt;
    &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;256Mi"&lt;/span&gt;
  &lt;span class="na"&gt;limits&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;cpu&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;500m"&lt;/span&gt;
    &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;512Mi"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;no estás simplemente completando un bloque del manifiesto. Le estás diciendo a Kubernetes dos cosas clave:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;requests&lt;/code&gt;: lo mínimo que el contenedor necesita para que el scheduler lo coloque en un nodo.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;limits&lt;/code&gt;: el máximo que ese contenedor puede llegar a consumir.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La diferencia importa mucho. Los &lt;code&gt;requests&lt;/code&gt; afectan la planificación. Los &lt;code&gt;limits&lt;/code&gt; afectan el comportamiento en tiempo de ejecución.&lt;/p&gt;

&lt;p&gt;Si defines mal uno de los dos, el clúster empieza a tomar decisiones basadas en una realidad que no existe.&lt;/p&gt;

&lt;h2&gt;
  
  
  El error clásico: definir recursos a ojo
&lt;/h2&gt;

&lt;p&gt;Este es uno de los errores más comunes en entornos reales. Se asignan valores porque “seguro con esto alcanza”, porque otro servicio usa algo parecido o porque interesa que el pod entre rápido en el nodo.&lt;/p&gt;

&lt;p&gt;Ahí empiezan los problemas.&lt;/p&gt;

&lt;p&gt;Si el &lt;code&gt;request&lt;/code&gt; es demasiado alto, el pod puede quedarse en &lt;code&gt;Pending&lt;/code&gt; porque ningún nodo tiene capacidad suficiente. Si es demasiado bajo, Kubernetes coloca más carga de la que el nodo realmente puede soportar. Si el &lt;code&gt;limit&lt;/code&gt; es demasiado agresivo, el contenedor se vuelve inestable cuando aumenta el consumo. Y si no hay &lt;code&gt;limits&lt;/code&gt;, una aplicación puede crecer sin control y afectar al resto de workloads.&lt;/p&gt;

&lt;p&gt;Lo más peligroso es que muchas veces esto no explota al desplegar. Explota después, en producción, cuando llega tráfico, concurrencia o una ejecución inesperada.&lt;/p&gt;

&lt;h2&gt;
  
  
  Un ejemplo muy común en producción
&lt;/h2&gt;

&lt;p&gt;Supongamos una API desplegada con esta configuración:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apps/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deployment&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;orders-api&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;replicas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;matchLabels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;orders-api&lt;/span&gt;
  &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;orders-api&lt;/span&gt;
    &lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;orders-api&lt;/span&gt;
          &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;registry.example.com/orders-api:1.0.0&lt;/span&gt;
          &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;containerPort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8080&lt;/span&gt;
          &lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;requests&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;cpu&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;100m"&lt;/span&gt;
              &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;128Mi"&lt;/span&gt;
            &lt;span class="na"&gt;limits&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;cpu&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;200m"&lt;/span&gt;
              &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;256Mi"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En el papel, parece una configuración eficiente. Pero en la práctica, la aplicación arranca consumiendo entre 300 y 400 MiB y, en picos, supera 500 MiB.&lt;/p&gt;

&lt;p&gt;¿Qué ocurre entonces?&lt;/p&gt;

&lt;p&gt;Kubernetes planifica el pod pensando que necesita solo &lt;code&gt;128Mi&lt;/code&gt; de memoria. El nodo acepta más pods de los que realmente puede soportar. Cuando la aplicación entra en carga y supera el &lt;code&gt;limit&lt;/code&gt; de &lt;code&gt;256Mi&lt;/code&gt;, el proceso termina en &lt;code&gt;OOMKilled&lt;/code&gt;. El pod reinicia, sube la latencia, fallan peticiones y el equipo empieza a investigar la aplicación cuando, en realidad, el primer problema estaba en el manifiesto.&lt;/p&gt;

&lt;p&gt;Una configuración más alineada con el comportamiento real podría ser esta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;requests&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;cpu&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;300m"&lt;/span&gt;
    &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;512Mi"&lt;/span&gt;
  &lt;span class="na"&gt;limits&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;cpu&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1000m"&lt;/span&gt;
    &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;768Mi"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aquí el scheduler trabaja con una reserva más realista, el nodo no se sobrecarga tan fácilmente y la aplicación tiene margen para absorber picos sin colapsar.&lt;/p&gt;

&lt;h2&gt;
  
  
  El recurso que muchos olvidan: ephemeral-storage
&lt;/h2&gt;

&lt;p&gt;En entornos DevOps hay otro punto que suele pasarse por alto: &lt;code&gt;ephemeral-storage&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Esto aparece mucho en pipelines de Jenkins sobre Kubernetes, builds con Kaniko, procesos batch, cargas temporales o contenedores que generan archivos intermedios. Aunque CPU y memoria estén bien definidas, un uso elevado de disco efímero puede hacer que el pod termine en &lt;code&gt;Evicted&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;requests&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;cpu&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;500m"&lt;/span&gt;
    &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;512Mi"&lt;/span&gt;
    &lt;span class="na"&gt;ephemeral-storage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1Gi"&lt;/span&gt;
  &lt;span class="na"&gt;limits&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;cpu&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1000m"&lt;/span&gt;
    &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1Gi"&lt;/span&gt;
    &lt;span class="na"&gt;ephemeral-storage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2Gi"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si tu workload descarga artefactos, genera cachés o escribe mucho en &lt;code&gt;/tmp&lt;/code&gt;, ignorar este recurso puede convertirse en un problema operativo serio.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo definir resources de forma correcta
&lt;/h2&gt;

&lt;p&gt;La respuesta no está en adivinar mejor. Está en medir.&lt;/p&gt;

&lt;p&gt;La forma sana de trabajar esto es observar el consumo real de la aplicación, entender su comportamiento base y sus picos, y ajustar a partir de datos. Los &lt;code&gt;requests&lt;/code&gt; deberían acercarse al uso normal. Los &lt;code&gt;limits&lt;/code&gt; deberían dejar margen, pero sin caer en valores exagerados que falseen la capacidad del clúster.&lt;/p&gt;

&lt;p&gt;Bien definidos, los &lt;code&gt;resources&lt;/code&gt; mejoran el scheduling, hacen más predecible el autoscaling, reducen reinicios innecesarios y ayudan a usar mejor la infraestructura. Mal definidos, convierten el clúster en una fuente constante de síntomas difíciles de interpretar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;resources&lt;/code&gt; no es un bloque decorativo del YAML. Es una de las decisiones más importantes que tomas sobre cómo va a vivir tu aplicación dentro de Kubernetes.&lt;/p&gt;

&lt;p&gt;Cuando está bien configurado, aporta estabilidad, previsibilidad y control. Cuando está mal, aparecen errores que parecen de aplicación, pero en realidad son de operación.&lt;/p&gt;

&lt;p&gt;En Kubernetes, muchas veces el problema no es que falten recursos. El problema es no haber descrito bien cuántos necesitaba de verdad tu workload.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>kubernetes</category>
      <category>español</category>
      <category>cloudcomputing</category>
    </item>
    <item>
      <title>10 problemas Linux comunes para un DevOps</title>
      <dc:creator>Coles C</dc:creator>
      <pubDate>Tue, 05 Aug 2025 22:08:25 +0000</pubDate>
      <link>https://forem.com/coles980/10-problemas-linux-comunes-para-un-devops-1a0</link>
      <guid>https://forem.com/coles980/10-problemas-linux-comunes-para-un-devops-1a0</guid>
      <description>&lt;p&gt;Trabajar con Linux es el pan de cada día para un DevOps Engineer. Sin un dominio mínimo de su funcionamiento, es fácil cometer errores que pueden dejarte sin acceso al servidor, romper configuraciones críticas o afectar la disponibilidad de una aplicación en producción. Conocer estos problemas comunes y cómo resolverlos te ayudará a ganar confianza y a manejar sistemas Linux de forma más segura y eficiente. Aquí te comparto los 10 más habituales y sus soluciones.&lt;/p&gt;




&lt;h3&gt;
  
  
  1. Confusión de directorios (&lt;code&gt;/var/log&lt;/code&gt;, &lt;code&gt;/etc&lt;/code&gt;, &lt;code&gt;/usr/bin&lt;/code&gt;)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/var/log&lt;/code&gt;&lt;/strong&gt; → almacena logs del sistema y aplicaciones.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/etc&lt;/code&gt;&lt;/strong&gt; → contiene configuraciones (ej. &lt;code&gt;nginx.conf&lt;/code&gt;, &lt;code&gt;ssh/sshd_config&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/usr/bin&lt;/code&gt;&lt;/strong&gt; → binarios ejecutables del sistema (comandos).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Error común: borrar o mover archivos críticos por no diferenciar su función.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Cambiar el puerto SSH y quedarse fuera
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;El acceso remoto por defecto es &lt;strong&gt;puerto 22&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Si lo cambias en &lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt; sin configurar bien firewall (&lt;code&gt;iptables&lt;/code&gt;, &lt;code&gt;ufw&lt;/code&gt;, &lt;code&gt;security group&lt;/code&gt; en AWS), te bloqueas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Solución: tener siempre &lt;strong&gt;otra sesión abierta&lt;/strong&gt; o acceso de emergencia (ej. consola en AWS).&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Intentar matar un proceso zombi
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Un &lt;strong&gt;zombie&lt;/strong&gt; es un proceso terminado pero que aún aparece en &lt;code&gt;ps&lt;/code&gt; porque su padre no lo ha recogido.&lt;/li&gt;
&lt;li&gt;No se puede matar con &lt;code&gt;kill&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Solución: matar o reiniciar el &lt;strong&gt;proceso padre&lt;/strong&gt;, o esperar a que libere al zombi.&lt;/p&gt;




&lt;h3&gt;
  
  
  4. Instalar paquetes con &lt;code&gt;apt&lt;/code&gt; sin revisar dependencias
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Comando: &lt;code&gt;sudo apt install paquete&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Puede &lt;strong&gt;eliminar paquetes dependientes&lt;/strong&gt; al hacer upgrades.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Siempre usar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;apt show paquete&lt;/code&gt; (ver detalles).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;apt-get -s install paquete&lt;/code&gt; (simulación antes de instalar).&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  5. Borrar logs sobredimensionados
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Logs en &lt;code&gt;/var/log/&lt;/code&gt; pueden crecer mucho (&lt;code&gt;syslog&lt;/code&gt;, &lt;code&gt;auth.log&lt;/code&gt;, &lt;code&gt;nginx/access.log&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Si los borras directo con &lt;code&gt;rm&lt;/code&gt;, las apps pueden fallar porque el file descriptor sigue apuntando.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Mejor: &lt;code&gt;truncate -s 0 archivo.log&lt;/code&gt; o usar &lt;code&gt;logrotate&lt;/code&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  6. Crear scripts con &lt;code&gt;sudo&lt;/code&gt; y no poder editarlos
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Ejemplo: &lt;code&gt;sudo nano script.sh&lt;/code&gt; → queda como root.&lt;/li&gt;
&lt;li&gt;Después tu usuario no puede modificarlo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Usar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;sudo chown usuario:usuario script.sh&lt;/code&gt; (cambiar dueño).&lt;/li&gt;
&lt;li&gt;O &lt;code&gt;sudoedit&lt;/code&gt; para editar sin cambiar permisos.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  7. Confundir proceso, servicio y demonio
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Proceso&lt;/strong&gt; → programa en ejecución (&lt;code&gt;ps&lt;/code&gt;, &lt;code&gt;top&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Servicio&lt;/strong&gt; → proceso gestionado por &lt;code&gt;systemd&lt;/code&gt; o &lt;code&gt;init.d&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Daemon&lt;/strong&gt; → proceso en background (ej. &lt;code&gt;sshd&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Error común: intentar reiniciar un proceso directo en vez del servicio (&lt;code&gt;systemctl restart nginx&lt;/code&gt;).&lt;/p&gt;




&lt;h3&gt;
  
  
  8. Romper &lt;code&gt;iptables&lt;/code&gt; y bloquear acceso
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;iptables&lt;/code&gt; gestiona firewall en Linux.&lt;/li&gt;
&lt;li&gt;Una regla mal escrita puede cortar acceso SSH a todos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Siempre:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Probar reglas con &lt;code&gt;iptables -L&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Guardar backup: &lt;code&gt;iptables-save &amp;gt; backup.rules&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Usar &lt;code&gt;at&lt;/code&gt; o &lt;code&gt;cron&lt;/code&gt; para restaurar reglas en caso de error.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  9. Montar un volumen encima de otro
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;mount /dev/xvdf /mnt/data&lt;/code&gt; sobre un directorio con datos → se ocultan.&lt;/li&gt;
&lt;li&gt;Los datos siguen ahí, pero inaccesibles hasta desmontar (&lt;code&gt;umount&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Ver antes con: &lt;code&gt;lsblk&lt;/code&gt;, &lt;code&gt;df -h&lt;/code&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  10. Cron ejecuta como root, tú como user
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Tareas en &lt;code&gt;/etc/crontab&lt;/code&gt; o &lt;code&gt;crontab -e&lt;/code&gt; pueden ejecutarse con distintos usuarios.&lt;/li&gt;
&lt;li&gt;Resultado: variables de entorno distintas, rutas distintas.
👉 Siempre especificar rutas absolutas en cron y comprobar con &lt;code&gt;whoami&lt;/code&gt; dentro del script.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;En resumen: dominar estos puntos de Linux te da &lt;strong&gt;una base sólida como DevOps/Cloud Engineer&lt;/strong&gt;, porque gran parte de los workloads en la nube corren sobre &lt;strong&gt;Linux (Amazon Linux, Ubuntu, Debian)&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>cloudskills</category>
      <category>cloud</category>
      <category>devops</category>
    </item>
    <item>
      <title>Docker componentes esenciales</title>
      <dc:creator>Coles C</dc:creator>
      <pubDate>Tue, 20 May 2025 11:12:04 +0000</pubDate>
      <link>https://forem.com/coles980/docker-componentes-esenciales-4b4f</link>
      <guid>https://forem.com/coles980/docker-componentes-esenciales-4b4f</guid>
      <description>&lt;p&gt;Docker ha revolucionado el mundo del desarrollo y la implementación de software, haciendo que empaquetar, distribuir y ejecutar aplicaciones sea más fácil que nunca. Pero, ¿alguna vez te has preguntado qué piezas forman este ecosistema? Hoy vamos a repasar los &lt;strong&gt;componentes principales de Docker&lt;/strong&gt;, para ayudarte a comprender cómo encajan entre sí.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧱 1. Imágenes (Images)
&lt;/h2&gt;

&lt;p&gt;Una imagen es una &lt;strong&gt;plantilla de solo lectura&lt;/strong&gt; utilizada para crear contenedores. Incluye el código de la aplicación, bibliotecas, dependencias y todo lo necesario para ejecutarla.&lt;/p&gt;

&lt;h2&gt;
  
  
  📦 2. Contenedor (Container)
&lt;/h2&gt;

&lt;p&gt;Un contenedor es una &lt;strong&gt;instancia en ejecución&lt;/strong&gt; de una imagen. Se trata de un paquete independiente y liviano que ejecuta la aplicación de manera consistente sin importar el entorno.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔧 3. Dockerfile
&lt;/h2&gt;

&lt;p&gt;Este archivo es una especie de &lt;strong&gt;receta&lt;/strong&gt; que define paso a paso cómo construir una imagen. Es el punto de partida para automatizar la creación de entornos de desarrollo o producción.&lt;/p&gt;

&lt;h2&gt;
  
  
  📁 4. Volúmenes (Volumes)
&lt;/h2&gt;

&lt;p&gt;Los volúmenes permiten &lt;strong&gt;persistir datos&lt;/strong&gt; fuera del ciclo de vida de un contenedor. Esto es ideal cuando necesitas que tus datos sobrevivan reinicios o se compartan entre múltiples contenedores.&lt;/p&gt;

&lt;h2&gt;
  
  
  🐳 5. Docker Daemon
&lt;/h2&gt;

&lt;p&gt;El Docker Daemon es un servicio que corre en segundo plano y se encarga de gestionar objetos de Docker (contenedores, imágenes, redes, etc.). Es el &lt;strong&gt;motor detrás de todo&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚙️ 6. Docker Engine
&lt;/h2&gt;

&lt;p&gt;El Docker Engine es la &lt;strong&gt;combinación del daemon, una API REST y la interfaz de línea de comandos (CLI)&lt;/strong&gt;. Es el componente central que permite construir, ejecutar y administrar contenedores.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Conclusión
&lt;/h2&gt;

&lt;p&gt;Comprender estos componentes te ayudará a dominar Docker desde sus fundamentos. Cada uno cumple una función específica, y juntos hacen posible la magia del desarrollo basado en contenedores.&lt;/p&gt;

&lt;p&gt;¿Te gustaría que hablemos más a fondo sobre alguno de estos componentes? ¡Déjamelo saber en los comentarios!&lt;/p&gt;

</description>
      <category>español</category>
      <category>docker</category>
      <category>devops</category>
      <category>container</category>
    </item>
    <item>
      <title>GitOps, Automatiza tu despliegue usando Flux y Kubernetes 🚀</title>
      <dc:creator>Coles C</dc:creator>
      <pubDate>Mon, 19 May 2025 10:09:46 +0000</pubDate>
      <link>https://forem.com/coles980/automatiza-tu-despliegue-con-gitops-usando-flux-y-kubernetes-1262</link>
      <guid>https://forem.com/coles980/automatiza-tu-despliegue-con-gitops-usando-flux-y-kubernetes-1262</guid>
      <description>&lt;p&gt;En este artículo veremos cómo implementar una estrategia &lt;strong&gt;GitOps&lt;/strong&gt; usando &lt;strong&gt;Flux&lt;/strong&gt;, un operador para Kubernetes que mantiene tu clúster sincronizado con un repositorio Git. Esta es una guía práctica que puedes seguir para automatizar tus despliegues de manera segura y reproducible.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué es GitOps?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;GitOps&lt;/strong&gt; es una metodología que utiliza Git como única fuente de verdad para las configuraciones e infraestructura. Cada cambio se realiza mediante &lt;em&gt;pull requests&lt;/em&gt; y se refleja automáticamente en el entorno.&lt;/p&gt;

&lt;p&gt;Beneficios clave:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Historial de cambios claro y auditable.&lt;/li&gt;
&lt;li&gt;Reversión sencilla usando &lt;code&gt;git revert&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Automatización del ciclo de vida de aplicaciones.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ¿Qué es Flux?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://fluxcd.io/" rel="noopener noreferrer"&gt;Flux&lt;/a&gt; es una herramienta CNCF que actúa como un &lt;em&gt;controlador&lt;/em&gt; que se ejecuta dentro de tu clúster de Kubernetes y aplica automáticamente los cambios definidos en tus repositorios Git.&lt;/p&gt;




&lt;h2&gt;
  
  
  Requisitos previos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Un clúster de Kubernetes (puedes usar &lt;a href="https://kind.sigs.k8s.io/" rel="noopener noreferrer"&gt;kind&lt;/a&gt; para pruebas locales o cualquier proveedor cloud).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;kubectl&lt;/code&gt; configurado.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;flux&lt;/code&gt; CLI instalado (&lt;a href="https://fluxcd.io/flux/installation/" rel="noopener noreferrer"&gt;instrucciones&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Un repositorio Git (GitHub, GitLab, etc.).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧪 Ejemplo simple: Despliegue de una app con Flux
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Paso 1: Instalar Flux
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;flux bootstrap github &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--owner&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;tu-usuario &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--repository&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;tu-repo &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--branch&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;main &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;clusters/mi-cluster &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--personal&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Paso 2: Estructura del repositorio
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.
├── clusters/
│   └── mi-cluster/
│       ├── kustomization.yaml
│       └── apps/
│           └── nginx/
│               ├── deployment.yaml
│               └── kustomization.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ejemplo de &lt;code&gt;kustomization.yaml&lt;/code&gt; en &lt;code&gt;apps/nginx/&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;kustomize.config.k8s.io/v1beta1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Kustomization&lt;/span&gt;
&lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;deployment.yaml&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;clusters/mi-cluster/kustomization.yaml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;kustomize.toolkit.fluxcd.io/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Kustomization&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apps&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;flux-system&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1m&lt;/span&gt;
  &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./clusters/mi-cluster/apps&lt;/span&gt;
  &lt;span class="na"&gt;prune&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="na"&gt;sourceRef&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;GitRepository&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;flux-system&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Paso 3: Despliegue automático
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add &lt;span class="nb"&gt;.&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Agregar despliegue de nginx"&lt;/span&gt;
git push
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🌱 Ejemplo avanzado: Múltiples entornos (dev y prod)
&lt;/h2&gt;

&lt;p&gt;Una estrategia común en GitOps es separar los entornos por carpetas, usando Kustomize para sobreescribir valores.&lt;/p&gt;

&lt;h3&gt;
  
  
  Estructura del repositorio
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.
├── apps/
│   └── nginx/
│       ├── base/
│       │   ├── deployment.yaml
│       │   └── kustomization.yaml
│       ├── dev/
│       │   ├── kustomization.yaml
│       │   └── patch.yaml
│       └── prod/
│           ├── kustomization.yaml
│           └── patch.yaml
├── clusters/
│   ├── dev/
│   │   └── kustomization.yaml
│   └── prod/
│       └── kustomization.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;apps/nginx/base/kustomization.yaml&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;deployment.yaml&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;apps/nginx/dev/kustomization.yaml&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;../base&lt;/span&gt;
&lt;span class="na"&gt;patchesStrategicMerge&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;patch.yaml&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y &lt;code&gt;patch.yaml&lt;/code&gt; podría modificar el número de réplicas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apps/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deployment&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;replicas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;apps/nginx/prod/patch.yaml&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apps/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deployment&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;replicas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;clusters/dev/kustomization.yaml&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;kustomize.toolkit.fluxcd.io/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Kustomization&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx-dev&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;flux-system&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1m&lt;/span&gt;
  &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./apps/nginx/dev&lt;/span&gt;
  &lt;span class="na"&gt;prune&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="na"&gt;sourceRef&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;GitRepository&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;flux-system&lt;/span&gt;
  &lt;span class="na"&gt;targetNamespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dev&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y análogamente para &lt;code&gt;prod&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Verificación y monitoreo
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;flux get kustomizations
kubectl get pods &lt;span class="nt"&gt;-n&lt;/span&gt; dev
kubectl get pods &lt;span class="nt"&gt;-n&lt;/span&gt; prod
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;Flux y GitOps te permiten automatizar múltiples entornos de forma limpia y reproducible. Separar &lt;code&gt;dev&lt;/code&gt; y &lt;code&gt;prod&lt;/code&gt; con Kustomize mantiene tus bases reutilizables y tus entornos consistentes.&lt;/p&gt;

&lt;p&gt;¿Te gustaría ver un ejemplo con Helm Charts o integración con ArgoCD? ¡Déjalo en los comentarios! 🙌&lt;/p&gt;

</description>
      <category>español</category>
      <category>gitop</category>
      <category>kubernetes</category>
      <category>devops</category>
    </item>
    <item>
      <title>Dockerizar una aplicación de Node.js 🚀</title>
      <dc:creator>Coles C</dc:creator>
      <pubDate>Tue, 21 Jan 2025 13:24:54 +0000</pubDate>
      <link>https://forem.com/coles980/como-dockerizar-una-aplicacion-de-nodejs-25p4</link>
      <guid>https://forem.com/coles980/como-dockerizar-una-aplicacion-de-nodejs-25p4</guid>
      <description>&lt;p&gt;Dockerizar tu aplicación de Node.js es una excelente manera de asegurar que se ejecute de manera consistente en cualquier entorno. En este artículo, te mostraré cómo crear un Dockerfile, construir una imagen y ejecutar un contenedor para tu proyecto Node.js.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paso 1: Configurar el proyecto de Node.js
&lt;/h2&gt;

&lt;p&gt;Comencemos creando una aplicación básica de Node.js.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Archivo: &lt;code&gt;server.js&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;¡Hola, mundo desde Docker!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Servidor escuchando en http://localhost:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Asegúrate de tener un archivo &lt;code&gt;package.json&lt;/code&gt; con las dependencias necesarias:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm init &lt;span class="nt"&gt;-y&lt;/span&gt;
npm &lt;span class="nb"&gt;install &lt;/span&gt;express
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Paso 2: Crear un Dockerfile
&lt;/h2&gt;

&lt;p&gt;El &lt;code&gt;Dockerfile&lt;/code&gt; es un archivo que define cómo construir la imagen de tu contenedor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Archivo: &lt;code&gt;Dockerfile&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;# Utilizar una imagen base de Node.js&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; node:16-alpine&lt;/span&gt;

&lt;span class="c"&gt;# Crear un directorio de trabajo&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;

&lt;span class="c"&gt;# Copiar los archivos de la aplicación al contenedor&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; package*.json ./&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; server.js ./&lt;/span&gt;

&lt;span class="c"&gt;# Instalar dependencias&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt;

&lt;span class="c"&gt;# Exponer el puerto de la aplicación&lt;/span&gt;
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 3000&lt;/span&gt;

&lt;span class="c"&gt;# Comando para ejecutar la aplicación&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["node", "server.js"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Paso 3: Crear el archivo &lt;code&gt;.dockerignore&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Para evitar copiar archivos innecesarios al contenedor, crea un archivo &lt;code&gt;.dockerignore&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Archivo: &lt;code&gt;.dockerignore&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;node_modules
npm-debug.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Paso 4: Construir la imagen Docker
&lt;/h2&gt;

&lt;p&gt;Usa el siguiente comando para construir la imagen:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker build &lt;span class="nt"&gt;-t&lt;/span&gt; nodejs-app &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Paso 5: Ejecutar el contenedor
&lt;/h2&gt;

&lt;p&gt;Inicia un contenedor con la imagen que acabas de crear:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-p&lt;/span&gt; 3000:3000 nodejs-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Abre tu navegador y accede a &lt;code&gt;http://localhost:3000&lt;/code&gt;. ¡Deberías ver el mensaje "¡Hola, mundo desde Docker!"! 🎉&lt;/p&gt;




&lt;h2&gt;
  
  
  Paso 6: Opcional - Publicar la imagen en Docker Hub
&lt;/h2&gt;

&lt;p&gt;Si deseas compartir tu imagen, primero inicia sesión en Docker Hub:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Luego etiqueta tu imagen y publícala:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker tag nodejs-app tu-usuario/nodejs-app
docker push tu-usuario/nodejs-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;Dockerizar una aplicación de Node.js es fácil y útil para garantizar la portabilidad de tu código. Este es solo el comienzo: puedes agregar herramientas como &lt;code&gt;docker-compose&lt;/code&gt; o crear configuraciones más avanzadas.&lt;/p&gt;




&lt;p&gt;Espero que este tutorial te haya sido útil. Si tienes dudas, ¡deja un comentario! 😊&lt;/p&gt;

</description>
      <category>docker</category>
      <category>devops</category>
      <category>spanish</category>
      <category>container</category>
    </item>
    <item>
      <title>Vagrant comandos básicos</title>
      <dc:creator>Coles C</dc:creator>
      <pubDate>Sun, 03 Nov 2024 18:34:31 +0000</pubDate>
      <link>https://forem.com/coles980/comandos-basicos-de-vagrant-4fc2</link>
      <guid>https://forem.com/coles980/comandos-basicos-de-vagrant-4fc2</guid>
      <description>&lt;h2&gt;
  
  
  0. Instalación
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Instalar proveedor de virtualización&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Vagrant requiere un proveedor de virtualización, como &lt;a href="https://www.virtualbox.org/" rel="noopener noreferrer"&gt;VirtualBox&lt;/a&gt;, &lt;a href="https://www.vmware.com/" rel="noopener noreferrer"&gt;VMware&lt;/a&gt; o &lt;a href="https://www.qemu.org/" rel="noopener noreferrer"&gt;QEMU&lt;/a&gt;. Descarga e instala el proveedor de tu elección.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Descargar e instalar Vagrant&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Visita la página oficial de &lt;a href="https://www.vagrantup.com/" rel="noopener noreferrer"&gt;Vagrant&lt;/a&gt; y descarga el instalador adecuado para tu sistema operativo. Luego, sigue las instrucciones de instalación.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Verificar la instalación&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Una vez que hayas instalado Vagrant, abre una terminal y ejecuta el siguiente comando para asegurarte de que esté correctamente instalado:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   vagrant &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  1. Inicializar Vagrant en un directorio
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vagrant init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Crea un archivo &lt;code&gt;Vagrantfile&lt;/code&gt; en el directorio actual, donde puedes especificar la configuración de la máquina virtual.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Crear y levantar la máquina virtual
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vagrant up
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Descarga la caja especificada en el &lt;code&gt;Vagrantfile&lt;/code&gt; y levanta la máquina virtual.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Acceder a la máquina virtual
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vagrant ssh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inicia sesión en la máquina virtual a través de SSH.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Suspender la máquina virtual
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vagrant &lt;span class="nb"&gt;suspend&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pausa la máquina virtual, guardando su estado en la RAM.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Detener la máquina virtual
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vagrant halt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Apaga la máquina virtual de forma segura.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Reiniciar la máquina virtual
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vagrant reload
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reinicia la máquina virtual y recarga su configuración.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Destruir la máquina virtual
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vagrant destroy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Elimina la máquina virtual. No afecta al &lt;code&gt;Vagrantfile&lt;/code&gt; ni a las configuraciones guardadas.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Actualizar la caja de Vagrant
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vagrant box update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Actualiza la caja a la última versión disponible.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Listar cajas disponibles
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vagrant box list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Muestra todas las cajas que están descargadas en tu entorno local.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Agregar una caja manualmente
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vagrant box add &amp;lt;nombre_caja&amp;gt; &amp;lt;url_caja&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Permite agregar una caja descargada o desde una URL.&lt;/p&gt;

&lt;h2&gt;
  
  
  11. Eliminar una caja
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vagrant box remove &amp;lt;nombre_caja&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Elimina una caja específica de Vagrant de tu sistema local.&lt;/p&gt;

&lt;h2&gt;
  
  
  12. Mostrar el estado de la máquina virtual
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vagrant status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Indica si la máquina está en ejecución, detenida o no ha sido creada.&lt;/p&gt;

&lt;h2&gt;
  
  
  13. Mostrar el ID de la máquina virtual
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vagrant global-status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Muestra el estado de todas las máquinas de Vagrant y sus IDs.&lt;/p&gt;

&lt;h2&gt;
  
  
  14. Sincronizar carpetas compartidas
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vagrant rsync
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sincroniza los archivos entre el sistema host y la máquina virtual en caso de usar &lt;code&gt;rsync&lt;/code&gt; para carpetas compartidas.&lt;/p&gt;

&lt;h2&gt;
  
  
  15. Verificar versión de Vagrant
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vagrant &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Muestra la versión actual de Vagrant instalada.&lt;/p&gt;




&lt;p&gt;Estos comandos cubren las operaciones más comunes y te permitirán gestionar entornos virtuales de desarrollo con Vagrant de manera efectiva.&lt;/p&gt;

</description>
      <category>español</category>
      <category>vagrant</category>
      <category>devops</category>
      <category>virtualmachine</category>
    </item>
    <item>
      <title>Git comandos útiles</title>
      <dc:creator>Coles C</dc:creator>
      <pubDate>Tue, 20 Aug 2024 14:11:29 +0000</pubDate>
      <link>https://forem.com/coles980/comandos-git-5f09</link>
      <guid>https://forem.com/coles980/comandos-git-5f09</guid>
      <description>&lt;h3&gt;
  
  
  Iniciar un repositorio
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Clonar un repositorio
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone &amp;lt;url_repositorio&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Ver el estado del repositorio
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Agregar un archivo al área de preparación (stage)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git add &amp;lt;archivo&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Agregar todos los cambios al área de preparación
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git add .
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Confirmar cambios con un mensaje
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git commit -m "mensaje"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Listar ramas
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git branch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Crear una nueva rama
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git branch &amp;lt;rama&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Cambiar a una rama específica
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git checkout &amp;lt;rama&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Fusionar una rama con la rama actual
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git merge &amp;lt;rama&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Ver los remotos configurados
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git remote -v
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Obtener cambios de una rama remota
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git pull origin &amp;lt;rama&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Enviar cambios a una rama remota
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git push origin &amp;lt;rama&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Ver el historial de confirmaciones
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Ver el historial de confirmaciones en una sola línea
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git log --oneline
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Revertir una confirmación específica
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git revert &amp;lt;commit&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Restablecer a una confirmación específica
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git reset &amp;lt;commit&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Listar las etiquetas
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git tag
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Crear una etiqueta anotada
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git tag -a v1.0 -m "etiqueta"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Configurar el nombre de usuario global
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git config --global user.name "nombre"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Configurar el correo electrónico global
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git config --global user.email "correo"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>español</category>
      <category>git</category>
      <category>devops</category>
      <category>development</category>
    </item>
    <item>
      <title>Linux networking tools</title>
      <dc:creator>Coles C</dc:creator>
      <pubDate>Sun, 16 Jun 2024 12:12:59 +0000</pubDate>
      <link>https://forem.com/coles980/linux-networking-tools-35b9</link>
      <guid>https://forem.com/coles980/linux-networking-tools-35b9</guid>
      <description>&lt;p&gt;𝗦𝗼𝘂𝗿𝗰𝗲: &lt;a href="https://wizardzines.com/networking-tools-poster/" rel="noopener noreferrer"&gt;https://wizardzines.com/networking-tools-poster/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F51pirx6jcrhyd07lz1ep.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F51pirx6jcrhyd07lz1ep.png" alt=" " width="800" height="1050"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;share in the section comments your favorite tool :)&lt;/p&gt;

</description>
      <category>networking</category>
      <category>linux</category>
      <category>devops</category>
    </item>
    <item>
      <title>Linux networking tools</title>
      <dc:creator>Coles C</dc:creator>
      <pubDate>Sun, 16 Jun 2024 12:12:59 +0000</pubDate>
      <link>https://forem.com/coles980/linux-networking-tools-bh7</link>
      <guid>https://forem.com/coles980/linux-networking-tools-bh7</guid>
      <description>&lt;p&gt;𝗦𝗼𝘂𝗿𝗰𝗲: &lt;a href="https://lnkd.in/grHR7Kdv" rel="noopener noreferrer"&gt;https://lnkd.in/grHR7Kdv&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F51pirx6jcrhyd07lz1ep.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F51pirx6jcrhyd07lz1ep.png" alt=" " width="800" height="1050"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;share in the section comments your favorite tool :)&lt;/p&gt;

</description>
      <category>networking</category>
      <category>linux</category>
      <category>devops</category>
    </item>
    <item>
      <title>Administración Kubernetes</title>
      <dc:creator>Coles C</dc:creator>
      <pubDate>Tue, 30 Jan 2024 17:08:05 +0000</pubDate>
      <link>https://forem.com/coles980/kubernetes-administracion-basica-2i40</link>
      <guid>https://forem.com/coles980/kubernetes-administracion-basica-2i40</guid>
      <description>&lt;p&gt;Hoy quiero compartir con ustedes una &lt;strong&gt;guía muy útil&lt;/strong&gt; para quienes trabajamos con &lt;strong&gt;Kubernetes&lt;/strong&gt;. En esta entrada encontrarás los comandos más esenciales de &lt;code&gt;kubectl&lt;/code&gt; para gestionar clústeres, pods, despliegues, servicios, configuraciones y más.&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠️ Primeros pasos con kubectl
&lt;/h2&gt;

&lt;p&gt;Para administrar y obtener información sobre un clúster de Kubernetes, puedes usar la herramienta de línea de comandos &lt;strong&gt;kubectl&lt;/strong&gt;, que es el cliente oficial de Kubernetes.&lt;/p&gt;

&lt;h3&gt;
  
  
  1️⃣ Instalar kubectl
&lt;/h3&gt;

&lt;p&gt;Asegúrate de tener &lt;strong&gt;kubectl&lt;/strong&gt; instalado en tu máquina. Puedes encontrar instrucciones de instalación en la documentación oficial de Kubernetes:&lt;/p&gt;

&lt;p&gt;🔗 &lt;a href="https://kubernetes.io/es/docs/tasks/tools/included/install-kubectl-linux/" rel="noopener noreferrer"&gt;Instalar kubectl&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2️⃣ Configurar kubectl
&lt;/h3&gt;

&lt;p&gt;Después de instalarlo, necesitas configurar &lt;code&gt;kubectl&lt;/code&gt; para conectarte al clúster. Esto normalmente implica:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Proporcionar la dirección del servidor API del clúster.&lt;/li&gt;
&lt;li&gt;Establecer las credenciales de autenticación necesarias.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Puedes hacerlo utilizando el comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🚀 Comandos Esenciales
&lt;/h2&gt;

&lt;p&gt;A continuación, comandos por categoría para que puedas navegar Kubernetes con soltura:&lt;/p&gt;




&lt;h3&gt;
  
  
  📦 Comandos de clúster
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl cluster-info &lt;span class="c"&gt;# Muestra información del clúster&lt;/span&gt;
kubectl get nodes &lt;span class="nt"&gt;-o&lt;/span&gt; wide &lt;span class="c"&gt;# Lista todos los nodos y muestra sus IPs&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🐳 Comandos de pods
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get pods &lt;span class="c"&gt;# Lista todos los pods&lt;/span&gt;
kubectl get pods &lt;span class="nt"&gt;-o&lt;/span&gt; wide &lt;span class="c"&gt;# Información detallada de pods&lt;/span&gt;
kubectl get pods &lt;span class="nt"&gt;-l&lt;/span&gt; &amp;lt;label&amp;gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;valor&amp;gt; &lt;span class="c"&gt;# Filtra pods por etiqueta&lt;/span&gt;
kubectl get pod &amp;lt;nombre&amp;gt; &lt;span class="c"&gt;# Muestra un pod específico&lt;/span&gt;
kubectl describe pod &amp;lt;pod&amp;gt; &lt;span class="c"&gt;# Detalles del pod&lt;/span&gt;
kubectl logs &amp;lt;pod&amp;gt; &lt;span class="c"&gt;# Muestra logs de un pod&lt;/span&gt;
kubectl &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; &amp;lt;pod&amp;gt; &lt;span class="nt"&gt;--&lt;/span&gt; &amp;lt;cmd&amp;gt; &lt;span class="c"&gt;# Ejecuta un comando en un pod&lt;/span&gt;
kubectl delete pod &amp;lt;pod&amp;gt; &lt;span class="c"&gt;# Elimina un pod&lt;/span&gt;
kubectl explain pod &amp;lt;recurso&amp;gt; &lt;span class="c"&gt;# Muestra descripción del recurso Pod&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🚢 Comandos de despliegue
&lt;/h3&gt;

&lt;p&gt;Estos comandos te permiten gestionar &lt;strong&gt;despliegues (Deployments)&lt;/strong&gt;, que son controladores que administran el ciclo de vida de tus pods y aseguran que el estado deseado se mantenga activo en el clúster.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl create deployment &amp;lt;nombre&amp;gt; &lt;span class="nt"&gt;--image&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;imagen&amp;gt; &lt;span class="c"&gt;# Crea un nuevo despliegue&lt;/span&gt;
kubectl get deployments &lt;span class="c"&gt;# Lista todos los despliegues&lt;/span&gt;
kubectl describe deployment &amp;lt;nombre&amp;gt; &lt;span class="c"&gt;# Detalles de un despliegue específico&lt;/span&gt;
kubectl scale deployment &amp;lt;nombre&amp;gt; &lt;span class="nt"&gt;--replicas&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;número&amp;gt; &lt;span class="c"&gt;# Escala un despliegue a más (o menos) réplicas&lt;/span&gt;
kubectl rollout restart deployment/&amp;lt;nombre&amp;gt; &lt;span class="c"&gt;# Reinicia el despliegue&lt;/span&gt;
kubectl rollout status deployment/&amp;lt;nombre&amp;gt;  &lt;span class="c"&gt;# Muestra el estado del rollout&lt;/span&gt;
kubectl create deployment &amp;lt;nombre&amp;gt; &lt;span class="nt"&gt;--image&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;imagen&amp;gt; &lt;span class="nt"&gt;-o&lt;/span&gt; yaml &lt;span class="c"&gt;# Genera el YAML del despliegue sin aplicarlo&lt;/span&gt;
kubectl create deployment &amp;lt;nombre&amp;gt; &lt;span class="nt"&gt;--image&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;imagen&amp;gt; &lt;span class="nt"&gt;-o&lt;/span&gt; yaml &lt;span class="nt"&gt;--dry-run&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;client &lt;span class="c"&gt;# Genera el YAML del Deployment sin aplicarlo.&lt;/span&gt;
kubectl create deployment &amp;lt;nombre&amp;gt; &lt;span class="nt"&gt;--image&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;imagen&amp;gt; &lt;span class="nt"&gt;-o&lt;/span&gt; yaml &lt;span class="nt"&gt;--dry-run&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;client &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; nombre.yaml &lt;span class="c"&gt;# Genera y guarda el YAML del Deployment en un archivo.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🌐 Comandos de servicios
&lt;/h3&gt;

&lt;p&gt;Los &lt;strong&gt;servicios&lt;/strong&gt; permiten exponer aplicaciones ejecutándose en tus pods, ya sea para el acceso interno o externo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get services &lt;span class="c"&gt;# Lista todos los servicios&lt;/span&gt;
kubectl describe service &amp;lt;nombre&amp;gt; &lt;span class="c"&gt;# Detalles de un servicio específico&lt;/span&gt;
kubectl expose pod &amp;lt;nombre&amp;gt; &lt;span class="c"&gt;# Crea un servicio que expone un pod&lt;/span&gt;
kubectl delete service &amp;lt;nombre&amp;gt; &lt;span class="c"&gt;# Elimina un servicio&lt;/span&gt;
kubectl port-forward &amp;lt;pod&amp;gt; &amp;lt;puerto-local&amp;gt;:&amp;lt;puerto-remoto&amp;gt; &lt;span class="c"&gt;# Redirige tráfico del host al pod&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🧩 ConfigMaps y Secrets
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;ConfigMaps&lt;/strong&gt; y &lt;strong&gt;Secrets&lt;/strong&gt; te permiten manejar configuración y datos sensibles (como contraseñas o tokens) por separado del código de tus aplicaciones.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl create configmap &amp;lt;nombre&amp;gt; &lt;span class="nt"&gt;--from-literal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;clave&amp;gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;valor&amp;gt; &lt;span class="c"&gt;# Crea un ConfigMap desde un valor literal&lt;/span&gt;
kubectl create secret generic &amp;lt;nombre&amp;gt; &lt;span class="nt"&gt;--from-literal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;clave&amp;gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;valor&amp;gt; &lt;span class="c"&gt;# Crea un Secret genérico&lt;/span&gt;
kubectl get configmaps &lt;span class="c"&gt;# Lista todos los ConfigMaps&lt;/span&gt;
kubectl get secrets &lt;span class="c"&gt;# Lista todos los Secrets&lt;/span&gt;
kubectl describe configmap &amp;lt;nombre&amp;gt; &lt;span class="c"&gt;# Detalla un ConfigMap específico&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🗂️ Namespaces
&lt;/h3&gt;

&lt;p&gt;Los &lt;strong&gt;namespaces&lt;/strong&gt; permiten dividir recursos dentro de un mismo clúster en espacios lógicos aislados.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get namespaces &lt;span class="c"&gt;# Lista todos los namespaces&lt;/span&gt;
kubectl create namespace &amp;lt;nombre&amp;gt; &lt;span class="c"&gt;# Crea un nuevo namespace&lt;/span&gt;
kubectl delete namespace &amp;lt;nombre&amp;gt; &lt;span class="c"&gt;# Elimina un namespace&lt;/span&gt;
kubectl config set-context &lt;span class="nt"&gt;--current&lt;/span&gt; &lt;span class="nt"&gt;--namespace&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;nombre&amp;gt; &lt;span class="c"&gt;# Cambia el contexto actual al namespace indicado&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🛠️ Recursos
&lt;/h3&gt;

&lt;p&gt;Manejo general de recursos definidos en archivos YAML o JSON.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; &amp;lt;archivo&amp;gt; &lt;span class="c"&gt;# Aplica un archivo de configuración&lt;/span&gt;
kubectl edit &amp;lt;tipo&amp;gt; &amp;lt;nombre&amp;gt; &lt;span class="c"&gt;# Edita un recurso directamente desde el editor&lt;/span&gt;
kubectl delete &lt;span class="nt"&gt;-f&lt;/span&gt; &amp;lt;archivo&amp;gt; &lt;span class="c"&gt;# Elimina un recurso definido en archivo&lt;/span&gt;
kubectl get &amp;lt;tipo&amp;gt; &lt;span class="c"&gt;# Lista recursos por tipo&lt;/span&gt;
kubectl describe &amp;lt;tipo&amp;gt; &amp;lt;nombre&amp;gt; &lt;span class="c"&gt;# Muestra detalles de un recurso específico&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  📊 Estadísticas y eventos
&lt;/h3&gt;

&lt;p&gt;Estos comandos te ayudan a monitorear el uso de recursos y eventos recientes en el clúster.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl top nodes &lt;span class="c"&gt;# Muestra el uso de CPU/Memoria por nodo&lt;/span&gt;
kubectl top pods &lt;span class="c"&gt;# Muestra el uso de CPU/Memoria por pod&lt;/span&gt;
kubectl events &lt;span class="c"&gt;# Lista eventos recientes (versión antigua)&lt;/span&gt;
kubectl get events &lt;span class="c"&gt;# Lista eventos recientes (formato moderno)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🔐 Permisos
&lt;/h3&gt;

&lt;p&gt;Consulta sobre roles definidos en el clúster, útiles para manejar &lt;strong&gt;RBAC (control de acceso basado en roles)&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get roles &lt;span class="c"&gt;# Lista todos los roles definidos en el clúster&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;¿Tienes algún comando favorito que no aparece aquí? ¡Déjalo en los comentarios! 👇&lt;/p&gt;




&lt;p&gt;¿Te gustaría ver más contenido como este? ¡Sígueme para más tips de DevOps y Kubernetes en español! 🚀🐳&lt;/p&gt;




</description>
      <category>spanish</category>
      <category>kubernetes</category>
      <category>beginners</category>
      <category>devops</category>
    </item>
    <item>
      <title>Docker comandos basicos</title>
      <dc:creator>Coles C</dc:creator>
      <pubDate>Wed, 22 Nov 2023 22:44:03 +0000</pubDate>
      <link>https://forem.com/coles980/comandos-basicos-de-docker-4f44</link>
      <guid>https://forem.com/coles980/comandos-basicos-de-docker-4f44</guid>
      <description>&lt;p&gt;Docker es una plataforma de contenerización que facilita la creación, implementación y ejecución de aplicaciones en entornos aislados llamados contenedores. Aquí tienes algunos comandos básicos de Docker que te pueden resultar útiles:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;docker version&lt;/strong&gt;: Muestra la versión de Docker que está instalada en tu sistema.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;docker version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;docker info&lt;/strong&gt;: Proporciona información detallada sobre la configuración de Docker, como el número de contenedores y de imágenes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;docker info
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;docker pull&lt;/strong&gt;: Descarga una imagen de Docker desde Docker Hub o cualquier otro registro de imágenes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;docker pull nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;docker images&lt;/strong&gt;: Lista las imágenes de Docker que están almacenadas localmente en tu sistema.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;docker images
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;docker run&lt;/strong&gt;: Crea y ejecuta un contenedor a partir de una imagen.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 80:80 &lt;span class="nt"&gt;--name&lt;/span&gt; mi-aplicacion nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;-d&lt;/code&gt;: Ejecuta el contenedor en segundo plano.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-p 80:80&lt;/code&gt;: Mapea el puerto 80 del host al puerto 80 del contenedor.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--name mi-aplicacion&lt;/code&gt;: Asigna el nombre "mi-aplicacion" al contenedor.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;nginx&lt;/code&gt;: La imagen a partir de la cual se creará el contenedor.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;docker stop&lt;/strong&gt;: Detiene un contenedor en ejecución.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;docker stop mi-aplicacion
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;docker ps&lt;/strong&gt;: Muestra los contenedores en ejecución.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;docker ps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;para mostrar todos los contenedores, tanto los que están en ejecución como los detenidos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;docker ps &lt;span class="nt"&gt;-a&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;docker start&lt;/strong&gt;: Inicia un contenedor detenido.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;docker start mi-aplicacion
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;docker restart&lt;/strong&gt;: Detiene y vuelve a iniciar un contenedor.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;docker restart mi-aplicacion
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;docker rm&lt;/strong&gt;: Elimina un contenedor.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;docker &lt;span class="nb"&gt;rm &lt;/span&gt;mi-aplicacion
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;docker rmi&lt;/strong&gt;: Elimina una imagen.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;docker rmi nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;docker exec&lt;/strong&gt;: Ejecuta un comando dentro de un contenedor en ejecución.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; mi-aplicacion /bin/bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;docker logs&lt;/strong&gt;: Muestra los registros (logs) de un contenedor en ejecución.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;docker logs &lt;span class="o"&gt;[&lt;/span&gt;nombre-pod]
...
&lt;span class="nv"&gt;$ &lt;/span&gt;docker logs &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;nombre-pod]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Estos son solo algunos comandos básicos de Docker. Hay muchos más comandos y opciones disponibles para satisfacer diversas necesidades. Puedes obtener más información sobre cada comando utilizando el comando &lt;code&gt;docker --help&lt;/code&gt; o consultando la documentación oficial de Docker en &lt;a href="https://docs.docker.com/" rel="noopener noreferrer"&gt;https://docs.docker.com/&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>spanish</category>
      <category>docker</category>
      <category>learning</category>
    </item>
    <item>
      <title>Git comandos básicos</title>
      <dc:creator>Coles C</dc:creator>
      <pubDate>Wed, 15 Nov 2023 18:14:14 +0000</pubDate>
      <link>https://forem.com/coles980/comandos-git-mas-utilizados-1c8i</link>
      <guid>https://forem.com/coles980/comandos-git-mas-utilizados-1c8i</guid>
      <description>&lt;p&gt;Aunque hay cientos de comandos diferentes de Git, hay unos pocos que se utilizan con más frecuencia, entre ellos:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;git config&lt;/strong&gt;: Este comando se utiliza para establecer la configuración específica de usuario o de repositorio. Puedes configurar tu nombre de usuario, dirección de correo electrónico, colores de interfaz, entre otras opciones.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git config &lt;span class="nt"&gt;--global&lt;/span&gt; user.name &lt;span class="s2"&gt;"Tu Nombre"&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;git config &lt;span class="nt"&gt;--global&lt;/span&gt; user.email &lt;span class="s2"&gt;"tu@email.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;git clone&lt;/strong&gt;: Este comando se utiliza para clonar un repositorio existente en un nuevo directorio. Descarga una copia de un repositorio remoto, incluidos todos los historiales y ramas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git clone &amp;lt;URL_del_repositorio&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;git init&lt;/strong&gt;: Este comando se utiliza para iniciar un nuevo repositorio Git. Crea un nuevo directorio y configura los archivos de control de versiones de Git.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;git status&lt;/strong&gt;: Muestra el estado actual del repositorio. Te dice qué archivos han cambiado, están pendientes de ser confirmados o no están siendo rastreados por Git.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;git push&lt;/strong&gt;: Este comando se utiliza para enviar los cambios locales al repositorio remoto.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git push &amp;lt;nombre_remoto&amp;gt; &amp;lt;rama_local&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;git add&lt;/strong&gt;: Agrega cambios al área de preparación (staging area). Permite seleccionar qué cambios se incluirán en la próxima confirmación.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git add &amp;lt;nombre_archivo&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;git commit&lt;/strong&gt;: Registra los cambios confirmados en el repositorio. Crea un punto de control con un mensaje que describe los cambios realizados.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Mensaje descriptivo"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;git branch&lt;/strong&gt;: Muestra, crea o borra ramas. También se puede usar para cambiar entre ramas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git branch                    &lt;span class="c"&gt;# Muestra las ramas&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;git branch &amp;lt;nombre_rama&amp;gt;      &lt;span class="c"&gt;# Crea una nueva rama&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;git branch &lt;span class="nt"&gt;-d&lt;/span&gt; &amp;lt;nombre_rama&amp;gt;   &lt;span class="c"&gt;# Borra una rama&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Estos son comandos básicos y muy utilizados en Git. Cada uno de ellos tiene opciones adicionales que puedes explorar en la documentación oficial de Git o mediante la ayuda integrada (&lt;code&gt;git help &amp;lt;comando&amp;gt;&lt;/code&gt;).&lt;/p&gt;

</description>
      <category>git</category>
      <category>codenewbie</category>
      <category>programming</category>
      <category>spanish</category>
    </item>
  </channel>
</rss>
