{"id":1164,"date":"2026-03-11T10:28:06","date_gmt":"2026-03-11T13:28:06","guid":{"rendered":"https:\/\/maurobernal.com.ar\/blog\/?p=1164"},"modified":"2026-03-11T10:29:50","modified_gmt":"2026-03-11T13:29:50","slug":"el-parche-perfecto-como-dome-una-fuga-de-memoria-en-kubernetes-con-un-cronjob-inteligente","status":"publish","type":"post","link":"https:\/\/maurobernal.com.ar\/blog\/el-parche-perfecto-como-dome-una-fuga-de-memoria-en-kubernetes-con-un-cronjob-inteligente\/","title":{"rendered":"El parche perfecto: C\u00f3mo dom\u00e9 una fuga de memoria en Kubernetes con un CronJob inteligente"},"content":{"rendered":"\n<h3 class=\"wp-block-heading\">El Problema: Una API con hambre de RAM<\/h3>\n\n\n\n<p>No importa cu\u00e1nta experiencia tengas, a veces el c\u00f3digo te juega una mala pasada. Recientemente, me encontr\u00e9 con un desaf\u00edo cl\u00e1sico pero persistente: una de nuestras APIs cr\u00edticas desarrollada en <strong>.NET<\/strong> presentaba una fuga de memoria (memory leak).<\/p>\n\n\n\n<p>En nuestro entorno <strong>On-Premise<\/strong>, corriendo sobre un cluster de <strong>SUSE Linux Enterprise (HA)<\/strong> con solo dos nodos, no pod\u00edamos permitir que un pod consumiera recursos hasta asfixiar al nodo o provocar un reinicio descontrolado por el <em>OOMKiller<\/em>. Si el pod llegaba al l\u00edmite del Deployment (1500 Mi), la latencia sub\u00eda y la experiencia del usuario se degradaba.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">La Idea: Si no puedes curarlo (a\u00fan), mant\u00e9nlo limpio<\/h3>\n\n\n\n<p>Mientras el equipo de desarrollo investigaba el <em>root cause<\/em> en el c\u00f3digo, necesitaba una soluci\u00f3n operativa. Podr\u00eda haber configurado un auto-reinicio simple, pero quer\u00eda algo m\u00e1s \u00abquir\u00fargico\u00bb.<\/p>\n\n\n\n<p><strong>Mi premisa fue:<\/strong><\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>No quiero reiniciar todos los pods a la vez (evitar <em>downtime<\/em>).<\/li>\n\n\n\n<li>Solo quiero matar al pod que est\u00e9 realmente en peligro (umbral del 75-80%).<\/li>\n\n\n\n<li>Debo asegurar que el nuevo pod est\u00e9 saludable antes de pasar al siguiente.<\/li>\n<\/ol>\n\n\n\n<p>Como mi d\u00eda a d\u00eda es en la terminal con <strong>Zsh<\/strong> y mi fiel alias <code>kub<\/code> para <code>kubectl<\/code>, decid\u00ed automatizar mi propio flujo de trabajo.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">La Implementaci\u00f3n: RBAC y un Script de Bash<\/h3>\n\n\n\n<p>La soluci\u00f3n no pod\u00eda ser \u00abtoscamente\u00bb manual. Implement\u00e9 un <strong>CronJob<\/strong> dentro del cluster que act\u00faa como un recolector de basura inteligente.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">1. Seguridad ante todo (RBAC)<\/h4>\n\n\n\n<p>No quer\u00eda que el script corriera con permisos de administrador. Cre\u00e9 una <code>ServiceAccount<\/code> espec\u00edfica y un <code>Role<\/code> con los permisos m\u00ednimos necesarios: <code>get<\/code>, <code>list<\/code> y <code>watch<\/code> para pods y despliegues. Sin el permiso de <code>watch<\/code>, el script no podr\u00eda esperar de forma segura a que la nueva r\u00e9plica estuviera lista.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">2. El \u00abCerebro\u00bb del Script<\/h4>\n\n\n\n<p>El script realiza un baile preciso:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Consulta las m\u00e9tricas reales mediante <code>kubectl top pods<\/code>.<\/li>\n\n\n\n<li>Filtra los pods de mi API y calcula el porcentaje de uso basado en el l\u00edmite real configurado en el Deployment.<\/li>\n\n\n\n<li>Si un pod supera el <strong>75%<\/strong>, lo elimina.<\/li>\n\n\n\n<li>Inmediatamente ejecuta un <code>kubectl rollout status<\/code>. Esto es vital: el script se pausa hasta que Kubernetes confirma que el nuevo pod pas\u00f3 sus <em>Health Checks<\/em>.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">3. El Toque On-Premise<\/h4>\n\n\n\n<p>Al estar en un cluster con <strong>OCFS2 (Oracle Cluster File System 2)<\/strong> y almacenamiento compartido RWX, la conmutaci\u00f3n de pods es extremadamente fluida. El nuevo pod monta los vol\u00famenes en segundos, ya sea en el <code>nodea<\/code> o en el <code>nodeb<\/code>, sin errores de bloqueo.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">El Resultado: Estabilidad 24\/7<\/h3>\n\n\n\n<p>Program\u00e9 el CronJob para ejecutarse dos veces al d\u00eda: a las <strong>3 AM<\/strong> y a las <strong>3 PM<\/strong>.<\/p>\n\n\n\n<p><strong>\u00bfEl resultado?<\/strong> El sistema ahora se \u00ablimpia\u00bb solo. En los logs de la \u00faltima prueba, pude ver c\u00f3mo el script identificaba un pod al 80% (1202 Mi), lo eliminaba y esperaba a que la nueva r\u00e9plica estuviera al 100% antes de seguir. El resto de los pods, que estaban en niveles normales, no fueron tocados.<\/p>\n\n\n\n<p>Esta soluci\u00f3n me dio la tranquilidad de que, mientras llega el parche definitivo en el c\u00f3digo, mi infraestructura sigue siendo robusta, predecible y, sobre todo, altamente disponible.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Lo que aprend\u00ed:<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Observabilidad:<\/strong> <code>kubectl top<\/code> es tu mejor amigo cuando el Metrics Server est\u00e1 bien configurado.<\/li>\n\n\n\n<li><strong>RBAC es clave:<\/strong> No escatimes en configurar los verbos correctos (<code>watch<\/code> me salv\u00f3 la vida).<\/li>\n\n\n\n<li><strong>Automatiza tus parches:<\/strong> Un \u00abparche\u00bb bien automatizado es una herramienta de ingenier\u00eda, no una chapuza.<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2026\/03\/image.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"845\" height=\"242\" src=\"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2026\/03\/image.png?resize=845%2C242&#038;ssl=1\" alt=\"\" class=\"wp-image-1166\" srcset=\"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2026\/03\/image.png?w=845&amp;ssl=1 845w, https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2026\/03\/image.png?resize=300%2C86&amp;ssl=1 300w, https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2026\/03\/image.png?resize=768%2C220&amp;ssl=1 768w, https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2026\/03\/image.png?resize=705%2C202&amp;ssl=1 705w\" sizes=\"auto, (max-width: 845px) 100vw, 845px\" \/><\/a><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> kub create job --from=cronjob\/memory-leak-patch test-mem-clean -n gag\njob.batch\/test-mem-clean created\n\u276f kub logs -f -l job-name=test-mem-clean -n gag\n--- Iniciando chequeo de memoria ---\nUmbral: 75% de 1500 Mi\n>> Pod deploy-gag-api-prod-849d5cb498-z6trv excedido: 80% (1202 Mi). Matando...\npod \"deploy-gag-api-prod-849d5cb498-z6trv\" deleted from gag namespace\n>> Esperando a que el reemplazo est\u00e9 Ready...\nWaiting for deployment \"deploy-gag-api-prod\" rollout to finish: 4 of 5 updated replicas are available...\ndeployment \"deploy-gag-api-prod\" successfully rolled out\n>> Pod deploy-gag-api-prod-849d5cb498-xzxtb OK: 21% (326 Mi).\n>> Pod deploy-gag-api-prod-849d5cb498-x8krt OK: 15% (235 Mi).\n>> Pod deploy-gag-api-prod-849d5cb498-d22w4 OK: 10% (161 Mi).\n>> Pod deploy-gag-api-prod-849d5cb498-wtlpr OK: 9% (144 Mi).\n--- Saneamiento finalizado ---<\/code><\/pre>\n\n\n\n<p>Este es el yaml<br><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>---\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n  name: pod-memory-cleaner\n  namespace: gag\n---\napiVersion: rbac.authorization.k8s.io\/v1\nkind: Role\nmetadata:\n  name: pod-memory-cleaner-role\n  namespace: gag\nrules:\n  - apiGroups: &#91;\"\"]\n    resources: &#91;\"pods\"]\n    verbs: &#91;\"get\", \"list\", \"delete\", \"watch\"]\n  - apiGroups: &#91;\"metrics.k8s.io\"]\n    resources: &#91;\"pods\"]\n    verbs: &#91;\"get\", \"list\", \"watch\"]\n  - apiGroups: &#91;\"apps\"]\n    resources: &#91;\"deployments\"]\n    verbs: &#91;\"get\", \"list\", \"watch\"]\n---\napiVersion: rbac.authorization.k8s.io\/v1\nkind: RoleBinding\nmetadata:\n  name: pod-memory-cleaner-binding\n  namespace: gag\nsubjects:\n  - kind: ServiceAccount\n    name: pod-memory-cleaner\n    namespace: gag\nroleRef:\n  kind: Role\n  name: pod-memory-cleaner-role\n  apiGroup: rbac.authorization.k8s.io\n---\napiVersion: batch\/v1\nkind: CronJob\nmetadata:\n  name: memory-leak-patch\n  namespace: gag\nspec:\n  # Se ejecuta a las 3:00 AM y 3:00 PM (15:00)\n  schedule: \"0 3,15 * * *\"\n  concurrencyPolicy: Forbid\n  jobTemplate:\n    spec:\n      template:\n        spec:\n          serviceAccountName: pod-memory-cleaner\n          restartPolicy: OnFailure\n          containers:\n          - name: patch-script\n            image: bitnami\/kubectl:latest\n            command:\n            - \/bin\/sh\n            - -c\n            - |\n              NAMESPACE=\"gag\"\n              DEPLOYMENT=\"deploy-gag-api-prod\"\n              THRESHOLD=75\n              \n              # Obtener l\u00edmite de memoria del deployment\n              LIMIT=$(kubectl get deploy $DEPLOYMENT -n $NAMESPACE -o jsonpath='{.spec.template.spec.containers&#91;0].resources.limits.memory}' | sed 's\/Mi\/\/')\n              \n              echo \"--- Iniciando saneamiento de memoria ---\"\n              echo \"Umbral configurado: $THRESHOLD% de $LIMIT Mi\"\n\n              # Listar pods del deployment ordenados por mayor consumo de memoria\n              kubectl top pods -n $NAMESPACE --no-headers | grep \"$DEPLOYMENT\" | sort -k3 -rn | while read line; do\n                POD_NAME=$(echo $line | awk '{print $1}')\n                USAGE=$(echo $line | awk '{print $3}' | sed 's\/Mi\/\/')\n                \n                # C\u00e1lculo de porcentaje\n                PERCENT=$(( USAGE * 100 \/ LIMIT ))\n                \n                if &#91; \"$PERCENT\" -gt \"$THRESHOLD\" ]; then\n                  echo \">> Pod $POD_NAME excedido: $PERCENT% ($USAGE Mi). Eliminando...\"\n                  kubectl delete pod $POD_NAME -n $NAMESPACE\n                  \n                  echo \">> Esperando que la nueva r\u00e9plica est\u00e9 Ready (Rollout Status)...\"\n                  kubectl rollout status deployment\/$DEPLOYMENT -n $NAMESPACE\n                  \n                  # Margen para convergencia de red (MetalLB)\n                  sleep 15\n                else\n                  echo \">> Pod $POD_NAME OK: $PERCENT% ($USAGE Mi).\"\n                fi\n              done\n              echo \"--- Saneamiento finalizado ---\"<\/code><\/pre>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>El Problema: Una API con hambre de RAM No importa cu\u00e1nta experiencia tengas, a veces el c\u00f3digo te juega una mala pasada. Recientemente, me encontr\u00e9 con un desaf\u00edo cl\u00e1sico pero&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[233],"tags":[236,237,234,239,238,235],"class_list":["post-1164","post","type-post","status-publish","format-standard","hentry","category-kubernetes","tag-cron","tag-cronjobs","tag-k8s","tag-kubectl","tag-kubernetes","tag-ram"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>El parche perfecto: C\u00f3mo dom\u00e9 una fuga de memoria en Kubernetes con un CronJob inteligente &#183; devops Mauro Bernal<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/maurobernal.com.ar\/blog\/el-parche-perfecto-como-dome-una-fuga-de-memoria-en-kubernetes-con-un-cronjob-inteligente\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"El parche perfecto: C\u00f3mo dom\u00e9 una fuga de memoria en Kubernetes con un CronJob inteligente &#183; devops Mauro Bernal\" \/>\n<meta property=\"og:description\" content=\"El Problema: Una API con hambre de RAM No importa cu\u00e1nta experiencia tengas, a veces el c\u00f3digo te juega una mala pasada. Recientemente, me encontr\u00e9 con un desaf\u00edo cl\u00e1sico pero...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/maurobernal.com.ar\/blog\/el-parche-perfecto-como-dome-una-fuga-de-memoria-en-kubernetes-con-un-cronjob-inteligente\/\" \/>\n<meta property=\"og:site_name\" content=\"devops Mauro Bernal\" \/>\n<meta property=\"article:published_time\" content=\"2026-03-11T13:28:06+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-03-11T13:29:50+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2026\/03\/image.png\" \/>\n<meta name=\"author\" content=\"Mauro Bernal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@_maurobernal\" \/>\n<meta name=\"twitter:site\" content=\"@_maurobernal\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Mauro Bernal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/el-parche-perfecto-como-dome-una-fuga-de-memoria-en-kubernetes-con-un-cronjob-inteligente\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/el-parche-perfecto-como-dome-una-fuga-de-memoria-en-kubernetes-con-un-cronjob-inteligente\\\/\"},\"author\":{\"name\":\"Mauro Bernal\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\"},\"headline\":\"El parche perfecto: C\u00f3mo dom\u00e9 una fuga de memoria en Kubernetes con un CronJob inteligente\",\"datePublished\":\"2026-03-11T13:28:06+00:00\",\"dateModified\":\"2026-03-11T13:29:50+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/el-parche-perfecto-como-dome-una-fuga-de-memoria-en-kubernetes-con-un-cronjob-inteligente\\\/\"},\"wordCount\":586,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\"},\"image\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/el-parche-perfecto-como-dome-una-fuga-de-memoria-en-kubernetes-con-un-cronjob-inteligente\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/image.png\",\"keywords\":[\"cron\",\"cronjobs\",\"k8s\",\"kubectl\",\"kubernetes\",\"ram\"],\"articleSection\":[\"Kubernetes\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/el-parche-perfecto-como-dome-una-fuga-de-memoria-en-kubernetes-con-un-cronjob-inteligente\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/el-parche-perfecto-como-dome-una-fuga-de-memoria-en-kubernetes-con-un-cronjob-inteligente\\\/\",\"url\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/el-parche-perfecto-como-dome-una-fuga-de-memoria-en-kubernetes-con-un-cronjob-inteligente\\\/\",\"name\":\"El parche perfecto: C\u00f3mo dom\u00e9 una fuga de memoria en Kubernetes con un CronJob inteligente &#183; devops Mauro Bernal\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/el-parche-perfecto-como-dome-una-fuga-de-memoria-en-kubernetes-con-un-cronjob-inteligente\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/el-parche-perfecto-como-dome-una-fuga-de-memoria-en-kubernetes-con-un-cronjob-inteligente\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/image.png\",\"datePublished\":\"2026-03-11T13:28:06+00:00\",\"dateModified\":\"2026-03-11T13:29:50+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/el-parche-perfecto-como-dome-una-fuga-de-memoria-en-kubernetes-con-un-cronjob-inteligente\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/el-parche-perfecto-como-dome-una-fuga-de-memoria-en-kubernetes-con-un-cronjob-inteligente\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/el-parche-perfecto-como-dome-una-fuga-de-memoria-en-kubernetes-con-un-cronjob-inteligente\\\/#primaryimage\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/image.png?fit=845%2C242&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/image.png?fit=845%2C242&ssl=1\",\"width\":845,\"height\":242},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/el-parche-perfecto-como-dome-una-fuga-de-memoria-en-kubernetes-con-un-cronjob-inteligente\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"El parche perfecto: C\u00f3mo dom\u00e9 una fuga de memoria en Kubernetes con un CronJob inteligente\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/\",\"name\":\"devops Mauro Bernal\",\"description\":\"Cuando tu trabajo es hacer que las cosas funcionen bien...\",\"publisher\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\",\"name\":\"Mauro Bernal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logo-maurobernal.png?fit=1740%2C1740&ssl=1\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logo-maurobernal.png?fit=1740%2C1740&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logo-maurobernal.png?fit=1740%2C1740&ssl=1\",\"width\":1740,\"height\":1740,\"caption\":\"Mauro Bernal\"},\"logo\":{\"@id\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logo-maurobernal.png?fit=1740%2C1740&ssl=1\"},\"description\":\"Desarrollo de Sistemas en .Net, IT Callcenters, DBA de SQL Server, Mikrotik, Pentest y T\u00e9cnico consultor de Sistemas Bejerman\",\"sameAs\":[\"https:\\\/\\\/maurobernal.com.ar\",\"https:\\\/\\\/x.com\\\/_maurobernal\",\"https:\\\/\\\/youtube.com\\\/maurobernal\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"El parche perfecto: C\u00f3mo dom\u00e9 una fuga de memoria en Kubernetes con un CronJob inteligente &#183; devops Mauro Bernal","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/maurobernal.com.ar\/blog\/el-parche-perfecto-como-dome-una-fuga-de-memoria-en-kubernetes-con-un-cronjob-inteligente\/","og_locale":"es_ES","og_type":"article","og_title":"El parche perfecto: C\u00f3mo dom\u00e9 una fuga de memoria en Kubernetes con un CronJob inteligente &#183; devops Mauro Bernal","og_description":"El Problema: Una API con hambre de RAM No importa cu\u00e1nta experiencia tengas, a veces el c\u00f3digo te juega una mala pasada. Recientemente, me encontr\u00e9 con un desaf\u00edo cl\u00e1sico pero...","og_url":"https:\/\/maurobernal.com.ar\/blog\/el-parche-perfecto-como-dome-una-fuga-de-memoria-en-kubernetes-con-un-cronjob-inteligente\/","og_site_name":"devops Mauro Bernal","article_published_time":"2026-03-11T13:28:06+00:00","article_modified_time":"2026-03-11T13:29:50+00:00","og_image":[{"url":"https:\/\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2026\/03\/image.png","type":"","width":"","height":""}],"author":"Mauro Bernal","twitter_card":"summary_large_image","twitter_creator":"@_maurobernal","twitter_site":"@_maurobernal","twitter_misc":{"Escrito por":"Mauro Bernal","Tiempo de lectura":"5 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/maurobernal.com.ar\/blog\/el-parche-perfecto-como-dome-una-fuga-de-memoria-en-kubernetes-con-un-cronjob-inteligente\/#article","isPartOf":{"@id":"https:\/\/maurobernal.com.ar\/blog\/el-parche-perfecto-como-dome-una-fuga-de-memoria-en-kubernetes-con-un-cronjob-inteligente\/"},"author":{"name":"Mauro Bernal","@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283"},"headline":"El parche perfecto: C\u00f3mo dom\u00e9 una fuga de memoria en Kubernetes con un CronJob inteligente","datePublished":"2026-03-11T13:28:06+00:00","dateModified":"2026-03-11T13:29:50+00:00","mainEntityOfPage":{"@id":"https:\/\/maurobernal.com.ar\/blog\/el-parche-perfecto-como-dome-una-fuga-de-memoria-en-kubernetes-con-un-cronjob-inteligente\/"},"wordCount":586,"commentCount":0,"publisher":{"@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283"},"image":{"@id":"https:\/\/maurobernal.com.ar\/blog\/el-parche-perfecto-como-dome-una-fuga-de-memoria-en-kubernetes-con-un-cronjob-inteligente\/#primaryimage"},"thumbnailUrl":"https:\/\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2026\/03\/image.png","keywords":["cron","cronjobs","k8s","kubectl","kubernetes","ram"],"articleSection":["Kubernetes"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/maurobernal.com.ar\/blog\/el-parche-perfecto-como-dome-una-fuga-de-memoria-en-kubernetes-con-un-cronjob-inteligente\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/maurobernal.com.ar\/blog\/el-parche-perfecto-como-dome-una-fuga-de-memoria-en-kubernetes-con-un-cronjob-inteligente\/","url":"https:\/\/maurobernal.com.ar\/blog\/el-parche-perfecto-como-dome-una-fuga-de-memoria-en-kubernetes-con-un-cronjob-inteligente\/","name":"El parche perfecto: C\u00f3mo dom\u00e9 una fuga de memoria en Kubernetes con un CronJob inteligente &#183; devops Mauro Bernal","isPartOf":{"@id":"https:\/\/maurobernal.com.ar\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/maurobernal.com.ar\/blog\/el-parche-perfecto-como-dome-una-fuga-de-memoria-en-kubernetes-con-un-cronjob-inteligente\/#primaryimage"},"image":{"@id":"https:\/\/maurobernal.com.ar\/blog\/el-parche-perfecto-como-dome-una-fuga-de-memoria-en-kubernetes-con-un-cronjob-inteligente\/#primaryimage"},"thumbnailUrl":"https:\/\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2026\/03\/image.png","datePublished":"2026-03-11T13:28:06+00:00","dateModified":"2026-03-11T13:29:50+00:00","breadcrumb":{"@id":"https:\/\/maurobernal.com.ar\/blog\/el-parche-perfecto-como-dome-una-fuga-de-memoria-en-kubernetes-con-un-cronjob-inteligente\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/maurobernal.com.ar\/blog\/el-parche-perfecto-como-dome-una-fuga-de-memoria-en-kubernetes-con-un-cronjob-inteligente\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/maurobernal.com.ar\/blog\/el-parche-perfecto-como-dome-una-fuga-de-memoria-en-kubernetes-con-un-cronjob-inteligente\/#primaryimage","url":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2026\/03\/image.png?fit=845%2C242&ssl=1","contentUrl":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2026\/03\/image.png?fit=845%2C242&ssl=1","width":845,"height":242},{"@type":"BreadcrumbList","@id":"https:\/\/maurobernal.com.ar\/blog\/el-parche-perfecto-como-dome-una-fuga-de-memoria-en-kubernetes-con-un-cronjob-inteligente\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/maurobernal.com.ar\/blog\/"},{"@type":"ListItem","position":2,"name":"El parche perfecto: C\u00f3mo dom\u00e9 una fuga de memoria en Kubernetes con un CronJob inteligente"}]},{"@type":"WebSite","@id":"https:\/\/maurobernal.com.ar\/blog\/#website","url":"https:\/\/maurobernal.com.ar\/blog\/","name":"devops Mauro Bernal","description":"Cuando tu trabajo es hacer que las cosas funcionen bien...","publisher":{"@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/maurobernal.com.ar\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":["Person","Organization"],"@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283","name":"Mauro Bernal","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2023\/07\/logo-maurobernal.png?fit=1740%2C1740&ssl=1","url":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2023\/07\/logo-maurobernal.png?fit=1740%2C1740&ssl=1","contentUrl":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2023\/07\/logo-maurobernal.png?fit=1740%2C1740&ssl=1","width":1740,"height":1740,"caption":"Mauro Bernal"},"logo":{"@id":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2023\/07\/logo-maurobernal.png?fit=1740%2C1740&ssl=1"},"description":"Desarrollo de Sistemas en .Net, IT Callcenters, DBA de SQL Server, Mikrotik, Pentest y T\u00e9cnico consultor de Sistemas Bejerman","sameAs":["https:\/\/maurobernal.com.ar","https:\/\/x.com\/_maurobernal","https:\/\/youtube.com\/maurobernal"]}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack-related-posts":[],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts\/1164","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/comments?post=1164"}],"version-history":[{"count":2,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts\/1164\/revisions"}],"predecessor-version":[{"id":1167,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts\/1164\/revisions\/1167"}],"wp:attachment":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/media?parent=1164"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/categories?post=1164"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/tags?post=1164"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}