{"id":534,"date":"2026-09-06T00:55:22","date_gmt":"2026-09-06T03:55:22","guid":{"rendered":"https:\/\/www.linuxpro.com.br\/2026\/09\/a-historia-do-kubernetes\/"},"modified":"2026-09-08T07:57:21","modified_gmt":"2026-09-08T10:57:21","slug":"a-historia-do-kubernetes","status":"publish","type":"post","link":"https:\/\/www.linuxpro.com.br\/es\/2026\/09\/a-historia-do-kubernetes\/","title":{"rendered":"La historia de Kubernetes: el tim\u00f3n del Borg"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" alt=\"Mascote do LinuxPro ao tim\u00e3o do navio com os cont\u00eaineres organizados no conv\u00e9s e o leme do Kubernetes\" src=\"\/wp-content\/uploads\/2026\/09\/kubernetes-historia-v2.webp\" width=\"1052\" height=\"652\" \/><\/p>\n<p>El 6 de junio de 2014 Joe Beda hizo el primer commit p\u00fablico de lo que se convertir\u00eda en Kubernetes: 250 archivos, 47.501 l\u00edneas de Go, Bash y Markdown. Cuatro d\u00edas despu\u00e9s Eric Brewer anunci\u00f3 el proyecto en DockerCon. Un a\u00f1o m\u00e1s tarde, el 21 de julio de 2015, sali\u00f3 la 1.0 \u2014 y Google anunci\u00f3 que donar\u00eda el c\u00f3digo a la reci\u00e9n creada Cloud Native Computing Foundation. Doce a\u00f1os despu\u00e9s, Kubernetes 1.37.0 (26 de agosto de 2026), apodado Garhwal, sigue siendo la forma est\u00e1ndar de orquestar contenedores en producci\u00f3n.<\/p>\n<p><!-- more --><\/p>\n<h2>A\u00f1os 2000: Borg, Omega y un prototipo en Java<\/h2>\n<p>Antes del tim\u00f3n exist\u00eda el Borg. Desde mediados de los a\u00f1os 2000 Google ya ejecutaba jobs en un cl\u00faster interno que nadie de fuera ve\u00eda. Omega (2013) intent\u00f3 el siguiente paso: un scheduler m\u00e1s compartido, menos monolito. Nada de esto sal\u00eda del campus. Fuera, en 2013, el mundo de la nube todav\u00eda era script bash, imagen de VM inmutable al estilo Netflix y muy poca orquestaci\u00f3n de contenedores.<\/p>\n<p>Qui\u00e9n cambi\u00f3 el enfoque fue el <a href=\"\/es\/2026\/09\/a-historia-do-docker\/\">Docker<\/a>. Brendan Burns, Craig McLuckie y Joe Beda, en Google Cloud, vieron el runtime de una sola m\u00e1quina y entendieron el vac\u00edo: faltaba el orquestador de la flota. Burns hizo un prototipo en Java. Lo reescribieron en <a href=\"\/es\/2026\/09\/a-historia-da-linguagem-go\/\">Go<\/a>. Llegaron Ville Aikas, Tim Hockin, Dawn Chen, Brian Grant y Daniel Smith. A\u00fan se llamaba Task; el nombre cambi\u00f3 dos d\u00edas antes del anuncio, en el commit 8 de junio.<\/p>\n<p>El nombre clave interno, puesto por Burns, era <em>Seven of Nine<\/em>: el Borg m\u00e1s accesible de <em>Star Trek<\/em>. De ah\u00ed el hept\u00e1gono del logo: siete lados, siete rayos en el tim\u00f3n. Kubernetes, en griego, es el timonel \u2014 el piloto del barco. k8s es el mismo truco que i18n: ocho letras en medio.<\/p>\n<h2>Junio de 2014: el commit y la DockerCon<\/h2>\n<p>El primer commit p\u00fablico es del 6 de junio de 2014, 16:40:48 hora del Pac\u00edfico. Beda limpi\u00f3 el repositorio para el lanzamiento; el trabajo anterior ya exist\u00eda. El 10 de junio Brewer subi\u00f3 al escenario del primer DockerCon. El mensaje era sencillo: Docker empaqueta; falta alguien que esparza el paquete en decenas de m\u00e1quinas, que replique, que descubra el servicio y que cure lo que muere.<\/p>\n<p>El \u201corquestador m\u00ednimo viable\u201d que quer\u00edan ten\u00eda cuatro piezas: replicaci\u00f3n, balanceo y descubrimiento de servicio, health check con autorreparaci\u00f3n, y un scheduler que trata la flota como un pool. El resto \u2014 Ingress, CRD, Operators, sidecar \u2014 vino despu\u00e9s, de la comunidad.<\/p>\n<div style=\"position:relative;padding-bottom:56.25%;height:0;overflow:hidden;margin:1.5em 0\">\n<iframe src=\"https:\/\/www.youtube.com\/embed\/YrxnVKZeqK8\" title=\"Eric Brewer anuncia Kubernetes en DockerCon 2014\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" allowfullscreen style=\"position:absolute;top:0;left:0;width:100%;height:100%;border:0\"><\/iframe>\n<\/div>\n<h2>Julio de 2015: la 1.0, la OSCON y la CNCF<\/h2>\n<p>Red Hat lleg\u00f3 pronto y trajo lo que faltaba: la experiencia de vender software a empresas grandes, acumulada en OpenShift. Sin ese enfoque del mundo real \u2014 multi-tenancy, actualizaci\u00f3n sin downtime, autorizaci\u00f3n que sobrevive a una auditor\u00eda \u2014 la 1.0 no sal\u00eda. Un RBAC de verdad solo llegar\u00eda en la 1.6, en 2017. El 21 de julio de 2015, en OSCON, el Kubernetes 1.0 fue declarado listo para producci\u00f3n. Ese mismo d\u00eda Google cedi\u00f3 el control: nac\u00eda la Cloud Native Computing Foundation, brazo de la Linux Foundation, con AT&amp;T, Cisco, Docker, IBM, Intel, Red Hat, Twitter, VMware y una decena m\u00e1s.<\/p>\n<p>El proyecto solo entr\u00f3 de hecho como hosted project de la CNCF el 10 de marzo de 2016 \u2014 el primero. El 6 de marzo de 2018 fue el primero en graduarse. Apache 2.0, Go, API declarativa: t\u00fa describes el estado deseado; el control loop intenta llegar all\u00ed. ReplicaSet, Deployment, Service, Namespace. Despu\u00e9s Job, DaemonSet, StatefulSet, Ingress, CRD.<\/p>\n<h2>Lo que el tim\u00f3n copi\u00f3 del Borg \u2014 y lo que no copi\u00f3<\/h2>\n<p>El Pod es la unidad at\u00f3mica: uno o m\u00e1s contenedores que comparten red y volumen, programados juntos. En Borg esto ya exist\u00eda. Label y selector, el Service como VIP estable frente a Pods que mueren, el kubelet en cada nodo, etcd como fuente de la verdad \u2014 ese es el dise\u00f1o. Lo que Borg no ten\u00eda, y Kubernetes apost\u00f3 por ello, fue la API abierta y la extensibilidad: Custom Resource Definition, admission webhook, Container Runtime Interface.<\/p>\n<p>El runtime, por cierto, nunca fue \u201cDocker obligatorio\u201d. El dockershim (el puente que hablaba con el demonio de Docker) se marc\u00f3 como deprecated en 1.20 y <strong>se elimin\u00f3 en 1.24<\/strong> (mayo de 2022). Quien a\u00fan piense que \u201cKubernetes = Docker\u201d lleva cuatro a\u00f1os de retraso, en el mejor de los casos. CRI-O y containerd hablan CRI directamente. El motor de Docker, por debajo, tambi\u00e9n usa containerd. La historia de la ballena est\u00e1 en <a href=\"\/es\/2026\/09\/a-historia-do-docker\/\">el post hermano<\/a>.<\/p>\n<h2>Kubernetes y Linux: la deuda que nadie menciona<\/h2>\n<p>Kubernetes solo existe porque el kernel Linux obtuvo, a\u00f1os antes, las dos primitivas que hacen posible el contenedor \u2014 y una de ellas sali\u00f3 del mismo sitio.<\/p>\n<ul>\n<li><strong>Los Namespaces<\/strong> responden a <em>\u201c\u00bfqu\u00e9 ve este proceso?\u201d<\/em>. El primer tipo entr\u00f3 en el kernel 2002 (mount); el conjunto cl\u00e1sico \u2014 PID, red, IPC, UTS, usuario \u2014 solo se complet\u00f3 en 2013, con el user namespace en el kernel 3.8. El cgroup namespace vendr\u00eda despu\u00e9s en 2016, y el de tiempo en 2020.<\/li>\n<li><strong>cgroups<\/strong> responden a <em>\u201c\u00bfqu\u00e9 puede consumir este proceso?\u201d<\/em>. Fueron escritos por <strong>Paul Menage<\/strong> e <strong>Rohit Seth<\/strong>, de Google, a partir de 2006, y entraron en la l\u00ednea principal del kernel <strong>2.6.24<\/strong>, publicado en enero de 2008. El nombre original era <em>process containers<\/em> \u2014 cambiado porque \u201ccontainer\u201d ya estaba sobrecargado en el ecosistema Linux: Solaris Zones, Linux-VServer, OpenVZ.<\/li>\n<\/ul>\n<p>Dos ingenieros de Google tocando el l\u00edmite de CPU y memoria en 2006 no es casualidad: la empresa ya ejecutaba todo en un cl\u00faster compartido, el linaje que desembocar\u00eda en Borg. El mismo campus que produjo Borg don\u00f3 al kernel la pieza que, cinco a\u00f1os despu\u00e9s, Docker empaquet\u00f3 y Kubernetes orquest\u00f3. El tim\u00f3n no invent\u00f3 el aislamiento \u2014 program\u00f3, a escala, un aislamiento que Linux ya sab\u00eda hacer.<\/p>\n<p>Esto aparece en el d\u00eda a d\u00eda: el <code data-no-translation=\"\">limit<\/code> de un Pod se convierte en cgroup en el nodo (<code data-no-translation=\"\">cpu.max<\/code>, <code data-no-translation=\"\">memory.max<\/code>) y el <code data-no-translation=\"\">request<\/code> de CPU se convierte en peso de planificaci\u00f3n (<code data-no-translation=\"\">cpu.weight<\/code>) \u2014 el <code data-no-translation=\"\">request<\/code> de memoria solo se convierte en cgroup con Memory QoS activado. El <code data-no-translation=\"\">kubelet<\/code> es un proceso com\u00fan leyendo y escribiendo en <code data-no-translation=\"\">\/sys\/fs\/cgroup<\/code>. Y el <strong>cgroup v2<\/strong> (est\u00e1ndar en las distribuciones actuales) trajo el controlador de memoria unificado \u2014 <code data-no-translation=\"\">memory.min<\/code>, <code data-no-translation=\"\">memory.low<\/code>, <code data-no-translation=\"\">memory.high<\/code>, <code data-no-translation=\"\">memory.max<\/code> \u2014, que frena la carga de trabajo en lugar de matarla en el l\u00edmite. Es bajo la jerarqu\u00eda de v2 que el kernel expone el PSI (<em>pressure stall information<\/em>, kernel 4.20, diciembre de 2018) por cgroup; el kubelet lee esa se\u00f1al de forma estable desde la 1.36. Quien entiende el kernel de debajo depura Kubernetes mucho m\u00e1s r\u00e1pido que quien solo sabe YAML.<\/p>\n<h2>2016\u20132017: la guerra que Swarm perdi\u00f3<\/h2>\n<p>Mientras el tim\u00f3n crec\u00eda, Docker apost\u00f3 por Swarm como orquestador nativo \u2014 m\u00e1s sencillo de aprender, integrado en el producto que todo el mundo ya ten\u00eda instalado. En 2017 la propia Docker, Inc. tir\u00f3 la toalla y anunci\u00f3 soporte para Kubernetes. Mesos, Nomad, Cattle \u2014 todos sobrevivieron en nichos. El patr\u00f3n de hecho se qued\u00f3 con el hept\u00e1gono. No porque el YAML sea bonito (no lo es), sino porque todo proveedor de nube pas\u00f3 a vender el mismo objeto: un cluster Kubernetes gestionado. GKE, EKS, AKS, el OpenShift de Red Hat, el Rancher. La API se convirti\u00f3 en el Linux de la nube: nadie la ama, todo el mundo la habla.<\/p>\n<h2>2016\u20132018: qu\u00e9 pas\u00f3 con quienes lo crearon<\/h2>\n<p>Los tres salieron de Google, cada uno a su tiempo. <strong>Brendan Burns<\/strong> se fue a Microsoft en julio de 2016 y ayud\u00f3 a construir Azure Kubernetes Service. <strong>Joe Beda<\/strong> ya hab\u00eda salido en 2015; <strong>Craig McLuckie<\/strong> sali\u00f3 a finales de 2016, y ambos fundaron <strong>Heptio<\/strong> en noviembre, en Seattle, para vender Kubernetes a empresas. VMware anunci\u00f3 la compra en noviembre de 2018 por aproximadamente <strong>$ 550 millones de USD<\/strong> y la cerr\u00f3 en diciembre; Heptio se convirti\u00f3 en uno de los pilares de Tanzu \u2014 Velero, Sonobuoy, Contour, el TKG. El proyecto qued\u00f3 donde deb\u00eda: en una fundaci\u00f3n, con gobernanza abierta y cientos de empresas empujando.<\/p>\n<h2>2026: Garhwal, kube-dns y la limpieza del legado<\/h2>\n<p>Kubernetes 1.37.0 sali\u00f3 el 26 de agosto de 2026, ciclo de 15 semanas, release lead Dipesh Rawat. Apodo <strong>Garhwal<\/strong> (\u0917\u0922\u093c\u0935\u093e\u0932), regi\u00f3n del Himalaya en Uttarakhand. 67 mejoras: 16 estables, 23 beta, 27 alpha, una deprecaci\u00f3n. Aspectos destacados que importan en el cl\u00faster de verdad:<\/p>\n<ul>\n<li>Dynamic Resource Allocation cerr\u00f3 el paquete: solicitud de recurso extendido mediante driver, <em>taint<\/em> e <em>toleration<\/em> de dispositivo y el atributo <code data-no-translation=\"\">resource.kubernetes.io\/numaNode<\/code> se volvieron Stable. El n\u00facleo de DRA ya era GA desde la 1.34: es lo que sac\u00f3 a la GPU, la FPGA y el dispositivo de IA del apa\u00f1o de Device Plugin.<\/li>\n<li>kube-dns est\u00e1 deprecated. CoreDNS es el DNS por defecto desde la 1.13; no se debe publicar un nuevo paquete de kube-dns despu\u00e9s de la 1.40.<\/li>\n<li>El modo IPVS de kube-proxy ya ven\u00eda deprecated desde la 1.35; el camino es iptables o, preferentemente, nftables: el modo desaparece por completo en la 1.43.<\/li>\n<li>HPA scale-to-zero entr\u00f3 en beta, activado por defecto: el autoscale ahora puede dejar a cero la r\u00e9plica.<\/li>\n<li>Un nodo en cgroup v1 ya no arranca: el <code data-no-translation=\"\">failCgroupV1<\/code> del kubelet es <code data-no-translation=\"\">true<\/code> por defecto desde la 1.35. Sin cgroup v2 no hay Memory QoS, swap ni m\u00e9trica de PSI: la deuda con el kernel se convirti\u00f3 en requisito operativo.<\/li>\n<\/ul>\n<p>Las versiones con soporte activo en septiembre de 2026 son 1.37, 1.36 y 1.35; la 1.34 a\u00fan recibe correcciones hasta el 27 de octubre. La 1.37.1 est\u00e1 marcada para el 15 de septiembre. El etcd y las implementaciones de CRI y CNI siguen fuera del binario: el tim\u00f3n orquesta; quien ejecuta el contenedor es otro proceso.<\/p>\n<h2>Probar hoy, sin cl\u00faster y sin nube<\/h2>\n<p>Doce a\u00f1os despu\u00e9s, levantar un Kubernetes para estudiar es cuesti\u00f3n de minutos en una sola m\u00e1quina. Tres caminos, del m\u00e1s desechable al m\u00e1s parecido a producci\u00f3n:<\/p>\n<pre data-no-translation=\"\"><code class=\"language-bash\" data-no-translation=\"\"># kind \u2014 cluster dentro de containers, o mais r\u00e1pido de jogar fora\nkind create cluster --name estudo\nkubectl get nodes\n\n# minikube \u2014 VM ou container, com addons (dashboard, ingress, registry)\nminikube start\nminikube addons enable ingress\n\n# k3s \u2014 leve, criado pela Rancher (hoje SUSE) e doado \u00e0 CNCF em 2020; roda de verdade em Raspberry Pi\ncurl -sfL https:\/\/get.k3s.io | sh -\nsudo k3s kubectl get nodes<\/code><\/pre>\n<p>O <code data-no-translation=\"\">kind<\/code> y el <code data-no-translation=\"\">minikube<\/code> son laboratorio. El <strong>k3s<\/strong> es otra cosa: un \u00fanico binario, con etcd sustituido por SQLite por defecto (etcd vuelve solo en HA con varios servidores), utilizado en el borde y en entornos peque\u00f1os de producci\u00f3n. Si la idea es tener un cl\u00faster de verdad en un servidor casero, empiece por \u00e9l.<\/p>\n<h2>L\u00ednea de tiempo<\/h2>\n<ul>\n<li><strong>Mediados de los a\u00f1os 2000<\/strong> \u2014 Google ya ejecuta trabajos en Borg, un cl\u00faster interno que nadie de fuera ve.<\/li>\n<li><strong>2006\u20132008<\/strong> \u2014 Paul Menage y Rohit Seth, de Google, escriben los cgroups; la funcionalidad llega al kernel 2.6.24 en enero de 2008.<\/li>\n<li><strong>2013<\/strong> \u2014 Omega intenta el siguiente paso dentro de Google; fuera de all\u00ed, Docker hace que el contenedor sea evidente.<\/li>\n<li><strong>6 de junio de 2014<\/strong> \u2014 primer commit p\u00fablico: 250 archivos, 47.501 l\u00edneas.<\/li>\n<li><strong>10 de junio de 2014<\/strong> \u2014 Eric Brewer anuncia el proyecto en el primer DockerCon.<\/li>\n<li><strong>21 de julio de 2015<\/strong> \u2014 Kubernetes 1.0 no OSCON; el mismo d\u00eda nace la CNCF y Google anuncia que ceder\u00e1 el control.<\/li>\n<li><strong>10 de marzo de 2016<\/strong> \u2014 primer proyecto alojado de la CNCF.<\/li>\n<li><strong>2016<\/strong> \u2014 Burns se va a Microsoft; McLuckie y Beda fundan Heptio.<\/li>\n<li><strong>2017<\/strong> \u2014 Docker, Inc. anuncia soporte para Kubernetes; la disputa con Swarm termina.<\/li>\n<li><strong>6 de marzo de 2018<\/strong> \u2014 primer proyecto en graduarse en la CNCF.<\/li>\n<li><strong>Noviembre de 2018<\/strong> \u2014 VMware compra Heptio por aproximadamente US$ 550 millones.<\/li>\n<li><strong>Mayo de 2022<\/strong> \u2014 dockershim se elimina en la versi\u00f3n 1.24; containerd y CRI-O toman el relevo.<\/li>\n<li><strong>26 de agosto de 2026<\/strong> \u2014 1.37.0 \u201cGarhwal\u201d: kube-dns obsoleto, HPA scale-to-zero en beta, DRA completo, cgroup v1 bloqueado en kubelet.<\/li>\n<\/ul>\n<h2>Cierre<\/h2>\n<p>Tres ingenieros en Google Cloud, un tiempo de ejecuci\u00f3n de una m\u00e1quina, un cl\u00faster interno que nadie ve\u00eda. El resultado es el plano de control que la industria copi\u00f3. El hept\u00e1gono en la portada es el mismo de 2014. El YAML tambi\u00e9n \u2014 para bien y para mal.<\/p>\n<p>La ballena que hizo obvio el contenedor est\u00e1 en <a href=\"\/es\/2026\/09\/a-historia-do-docker\/\">A hist\u00f3ria do Docker<\/a>. El hipervisor de servidor, en <a href=\"\/es\/2026\/09\/a-historia-do-proxmox\/\">Proxmox<\/a> e <a href=\"\/es\/2026\/09\/a-historia-do-xen\/\">Xen<\/a>. El kernel debajo de todo, en <a href=\"\/es\/2026\/09\/linux-35-anos\/\">Linux cumple 35 a\u00f1os<\/a> e <a href=\"\/es\/2026\/09\/a-historia-de-linus-torvalds\/\">La historia de Linus Torvalds<\/a>.<\/p>\n<p>De Borg a Garhwal: el timonel sigue al mando. 1.37.0, Apache 2.0, CRI, nftables. Siete radios, doce a\u00f1os, y el YAML que a nadie le gusta escribir, pero todo el mundo commitea.<\/p>","protected":false},"excerpt":{"rendered":"<p>Em 6 de junho de 2014 Joe Beda fez o primeiro commit p\u00fablico do que viraria o Kubernetes: 250 arquivos, 47.501 linhas de Go, Bash e Markdown. Quatro dias depois Eric Brewer anunciou o projeto no DockerCon. Um ano depois, em 21 de julho de 2015, saiu a 1.0 \u2014 e o Google anunciou que &#8230; <a title=\"La historia de Kubernetes: el tim\u00f3n del Borg\" class=\"read-more\" href=\"https:\/\/www.linuxpro.com.br\/es\/2026\/09\/a-historia-do-kubernetes\/\" aria-label=\"Leer m\u00e1s sobre A hist\u00f3ria do Kubernetes: o leme do Borg\">Leer m\u00e1s<\/a><\/p>","protected":false},"author":0,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[103,46,2,111,120],"tags":[227,228,229,156,58,226,225],"class_list":["post-534","post","type-post","status-publish","format-standard","hentry","category-cloud","category-devops","category-linux","category-opensource","category-servidores","tag-borg","tag-cncf","tag-containers","tag-docker","tag-go","tag-k8s","tag-kubernetes"],"_links":{"self":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts\/534","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/comments?post=534"}],"version-history":[{"count":5,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts\/534\/revisions"}],"predecessor-version":[{"id":1162,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts\/534\/revisions\/1162"}],"wp:attachment":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/media?parent=534"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/categories?post=534"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/tags?post=534"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}