{"id":2144,"date":"2020-11-23T11:41:46","date_gmt":"2020-11-23T10:41:46","guid":{"rendered":"https:\/\/geko2.factoryfy.com\/?p=3079"},"modified":"2022-04-07T13:40:21","modified_gmt":"2022-04-07T11:40:21","slug":"kubernetes-cronjobs","status":"publish","type":"post","link":"https:\/\/geko.cloud\/es\/kubernetes-cronjobs\/","title":{"rendered":"Kubernetes CronJobs &#8211; Una vista en profundidad"},"content":{"rendered":"<h2>Introducci\u00f3n<\/h2>\n<p style=\"text-align: justify;\">Hoy en d\u00eda, y cada vez m\u00e1s, es com\u00fan que las empresas migren algunas partes de su infraestructura (o incluso la compa\u00f1\u00eda entera) al <a href=\"https:\/\/geko2.factoryfy.com\/es\/que-es-cloud\/\">cloud<\/a>. Hay dos principales enfoques: Permanecer lo mas cerca posible de la antigua arquitectura usando <a href=\"https:\/\/en.wikipedia.org\/wiki\/Virtual_machine\">VMs<\/a>, o apostar por flexibilidad\/escalabilidad\/disponibilidad y buscar una nueva perspectiva mediante el uso de un orquestador de contenedores como <a href=\"https:\/\/geko.cloud\/es\/que-es-kubernetes\/\">Kubernetes<\/a>. Centr\u00e1ndose en esta \u00faltima opci\u00f3n (<a href=\"https:\/\/geko.cloud\/es\/que-es-kubernetes\/\"><strong>Kubernetes<\/strong><\/a>), lo que anteriormente se ejecutaba directamente sobre un Sistema Operativo (y que por tanto ten\u00eda acceso a la mayor\u00eda de aplicaciones que provee dicho Sistema) ahora se ejecuta dentro de contenedores. Adem\u00e1s, estos contenedores com\u00fanmente no se ejecutan en un destino (m\u00e1quina\/nodo) espec\u00edfico, sino en un <a href=\"https:\/\/en.wikipedia.org\/wiki\/Computer_cluster\">cl\u00faster<\/a>. Todo funciona bien y todo es fant\u00e1stico, hasta que uno se da cuenta de que el entorno ya no es tan amigable y conocido como cabr\u00eda esperar. Herramientas de Sistema Operativo, como las <em>tareas programadas<\/em>\u00a0o <a href=\"https:\/\/en.wikipedia.org\/wiki\/Cron\">Crones<\/a>, no encajan en las <a href=\"https:\/\/cloud.google.com\/solutions\/best-practices-for-building-containers\">buenas pr\u00e1cticas de los contenedores<\/a>, ya que son trasversales al Sistema (lo que es lo opuesto a la filosof\u00eda que se predica para los contenedores, consistente en aislar cada aplicaci\u00f3n). Incrustar esas herramientas (o sus comportamientos) en la aplicaci\u00f3n, al mismo tiempo que se a\u00edsla la misma, puede llegar a convertirse en una ardua tarea plagada de parches temporales y pr\u00e1cticas no tan buenas.<\/p>\n<p style=\"text-align: justify;\">Como ecosistema <del>completo<\/del> grande, <a href=\"https:\/\/geko.cloud\/es\/que-es-kubernetes\/\"><strong>Kubernetes<\/strong><\/a> provee por su cuenta algunas de las funcionalidades anteriormente mencionadas, de modo que los requerimientos del d\u00eda a d\u00eda puedan ser atendidos y gestionados. Sin embargo, aparecen nuevas operativas y posibilidades cuando se habla de cl\u00fasteres y contenedores. A lo largo de las siguientes l\u00edneas se describir\u00e1 c\u00f3mo <a href=\"https:\/\/geko.cloud\/es\/que-es-kubernetes\/\"><strong>Kubernetes<\/strong><\/a> ha solucionado la funcionalidad Cron, as\u00ed como la mayor\u00eda de sus nuevas caracter\u00edsticas y detalles ocultos.<\/p>\n<h2>1. C\u00f3mo funcionan los CronJobs en Kubernetes realmente<\/h2>\n<p><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-3091 alignright\" src=\"https:\/\/geko2.factoryfy.com\/wp-content\/uploads\/diagram1.png\" alt=\"cronjob-job-pod\" width=\"112\" height=\"245\" \/><\/p>\n<p style=\"text-align: justify;\">Cuando se crea un recurso <strong>CronJob<\/strong>, lo que hace realmente <a href=\"https:\/\/geko.clou\/es\/que-es-kubernetes\/\"><strong>Kubernetes<\/strong><\/a> es registrar una programaci\u00f3n en el tiempo. <a href=\"https:\/\/github.com\/kubernetes\/kubernetes\/blob\/392bf0adef478175b9cf0226b02820eb1820f797\/pkg\/controller\/cronjob\/cronjob_controller.go#L95-L96\">Cada 10 segundos el Controlador de CronJobs comprueba si hay programaciones que coincidan y de las que deba ocuparse<\/a>. Cuando llega el momento se\u00f1alado se crea un recurso Job, que deber\u00e1 hacerse cargo de la tarea para esa ejecuci\u00f3n espec\u00edfica. Finalmente cada Job crea un recurso Pod, que ser\u00e1 el ejecutor final.<\/p>\n<p style=\"text-align: justify;\">Como probablemente se haya podido apreciar ya, esta aproximaci\u00f3n difiere significativamente del enfoque que tiene un Sistema Operativo. Lo que se observa aqu\u00ed es un desacoplamiento entre el sistema de programaci\u00f3n en el tiempo (Cron) y la gesti\u00f3n de las ejecuciones (Jobs). Esto permite al cl\u00faster (y por tanto al usuario) gestionar tareas ef\u00edmeras sin perder el control sobre ellas.<\/p>\n<p style=\"text-align: justify;\">Cabe adem\u00e1s mencionar que los Jobs pueden crear uno o m\u00e1s Pods (permitiendo concurrencia\/paralelismo) a la vez que se aseguran que las tareas se completan satisfactoriamente. <strong>Sin embargo, este \u00faltimo comportamiento podr\u00eda crear complejidades adicionales ya que los contenedores ya incorporan su propia funcionalidad de gesti\u00f3n de fallos y reinicios.<\/strong> Este tema ser\u00e1 abordado en la siguiente secci\u00f3n.<\/p>\n<h2>2. C\u00f3mo configurar los detalles avanzados<\/h2>\n<p style=\"text-align: justify;\">Debe tenerse en cuenta que para configurar un <strong>CronJob<\/strong>, cada recurso subyacente debe configurarse tambi\u00e9n. Esto significa que la configuraci\u00f3n de un <strong>CronJob<\/strong> agrega <a href=\"https:\/\/kubernetes.io\/docs\/tasks\/job\/automated-tasks-with-cron-jobs\/#writing-a-cron-job-spec\">sus propios par\u00e1metros<\/a> adem\u00e1s de las <a href=\"https:\/\/kubernetes.io\/docs\/concepts\/workloads\/controllers\/job\/#writing-a-job-spec\">propiedades del Job<\/a> y de las especificaciones del Pod\/contenedor. Teniendo en cuenta que la mayor\u00eda de las operativas comunes se pueden entender y conseguir leyendo la documentaci\u00f3n, el prop\u00f3sito de esta secci\u00f3n es mostrar c\u00f3mo obtener ciertas funcionalidades avanzadas mediante la configuraci\u00f3n.<\/p>\n<h3>Gestionar los errores<\/h3>\n<p style=\"text-align: justify;\">Cuando un contenedor detiene su ejecuci\u00f3n (ya sea por un fallo o despu\u00e9s de una ejecuci\u00f3n satisfactoria) existen una serie de acciones que se pueden tomar justo despu\u00e9s, las cuales son definidas (como de costumbre) por las directivas del propio recurso. Las acciones t\u00edpicas son reiniciar el contenedor (siempre o s\u00f3lo cuando ha sucedido alg\u00fan error) o bien no hacer nada. Pero, adem\u00e1s, los Jobs a\u00f1aden una capa de complejidad adicional que se encarga de que la tarea se termine adecuadamente. Esto quiere decir que la pol\u00edtica de reinicios se garantiza desde dos capas diferentes, que a su vez deben gestionarse desde dos partes diferentes.<\/p>\n<p style=\"text-align: justify;\">Desde el lado de los contenedores, la directiva se llama <a href=\"https:\/\/kubernetes.io\/docs\/concepts\/workloads\/pods\/pod-lifecycle\/#restart-policy\">restartPolicy<\/a>. En el lado de los Jobs, la pol\u00edtica se gestiona mediante la directiva <a href=\"https:\/\/kubernetes.io\/docs\/concepts\/workloads\/controllers\/job\/#pod-backoff-failure-policy\">backoffLimit<\/a>, la cual\u00a0 especifica el <strong>n\u00famero<\/strong> de fallos permitidos antes dejar de reiniciar la tarea. Teniendo ambas en cuenta, obtener la configuraci\u00f3n para un <strong>CronJob<\/strong> que pueda fallar sin reinicios se aproxima a lo siguiente.<\/p>\n<div class=\"wp-block-codemirror-blocks code-block \">\n<pre class=\"CodeMirror\" data-setting=\"{\">apiVersion: batch\/v1beta1\r\nkind: CronJob\r\n...\r\nspec:\r\n  ...\r\n  jobTemplate:\r\n    spec:\r\n      <strong>backoffLimit: 0<\/strong>\r\n      template:\r\n        spec:\r\n          containers:\r\n            ...\r\n          <strong>restartPolicy: Never<\/strong><\/pre>\n<\/div>\n<h3>Ejecuciones Solapadas vs. Secuenciales<\/h3>\n<p style=\"text-align: justify;\">Cuando se habla de un <strong>CronJob<\/strong> en espec\u00edfico, podr\u00edan coexistir varias ejecuciones. Dependiendo del tipo de operativa que caracterice a la tarea, la concurrencia podr\u00eda ser una forma de proceder para acelerar el procesamiento. Existen tres v\u00edas disponibles para gestionar c\u00f3mo se ejecutan los Jobs, las cuales son controladas mediante la directiva <a href=\"https:\/\/kubernetes.io\/docs\/tasks\/job\/automated-tasks-with-cron-jobs\/#concurrency-policy\">concurrencyPolicy<\/a>.<\/p>\n<ol>\n<li><strong>Allow<\/strong>: Permite ejecuciones solapadas.<\/li>\n<li><strong>Replace<\/strong>: Las nuevas ejecuciones fuerzan, antes de comenzar, que se terminen las ejecuciones previas.<\/li>\n<li><strong>Forbid<\/strong>: Las nuevas ejecuciones se descartan si una ejecuci\u00f3n previa todav\u00eda est\u00e1 en ejecuci\u00f3n.<\/li>\n<\/ol>\n<p style=\"text-align: justify;\">Mientras que la primera permite la concurrencia, las dos \u00faltimas apuestan por ejecuciones secuenciales. Una vez m\u00e1s, para seguir el estilo de los crones de la vieja escuela, la opci\u00f3n que m\u00e1s se aproxima es <strong>Allow<\/strong>. Por otra parte, las ejecuciones concurrentes pueden desembocar en efectos no deseados si no se tratan adecuadamente, y es algo que se debe tener en cuenta y tratarse con cautela.<\/p>\n<h3>Tiempo m\u00ednimo de ejecuci\u00f3n<\/h3>\n<p style=\"text-align: justify;\">Como ya se ha visto anteriormente, las nuevas ejecuciones de tareas pueden llegar a interferir con las anteriores, dependiendo de c\u00f3mo se establezcan las directivas de concurrencia. Existe una propiedad en la especificaci\u00f3n de los contenedores (<a href=\"https:\/\/kubernetes.io\/docs\/concepts\/containers\/container-lifecycle-hooks\/#hook-handler-execution\">terminationGracePeriodSeconds<\/a>) que se puede emplear para sobrellevar las consecuencias de interrumpir ejecuciones. Mediante su uso se puede definir un tiempo m\u00ednimo de ejecuci\u00f3n, de modo que aunque una nueva tarea fuerce la terminaci\u00f3n de una previa, se garantiza una terminaci\u00f3n gr\u00e1cil.<\/p>\n<h2>3. Operar con los CronJobs como un Maestro<\/h2>\n<p style=\"text-align: justify;\">Una vez la configuraci\u00f3n pone de manifiesto lo que se pretende que haga el CronJob, <a href=\"https:\/\/kubernetes.io\/docs\/tasks\/job\/automated-tasks-with-cron-jobs\">los comandos b\u00e1sicos pueden ser utilizados para recuperar su estado<\/a> (informaci\u00f3n acerca de la programaci\u00f3n, el estado de ejecuci\u00f3n, logs, &#8230;). Al igual que en la secci\u00f3n anterior, las siguientes operativas cubren c\u00f3mo obtener algunas funcionalidades menos comunes.<\/p>\n<h3>Habilitar\/Deshabilitar los CronJobs<\/h3>\n<p style=\"text-align: justify;\">La especificaci\u00f3n de los <strong>CronJobs<\/strong> contiene una propiedad llamada <a href=\"https:\/\/kubernetes.io\/docs\/tasks\/job\/automated-tasks-with-cron-jobs\/#suspend\">suspend<\/a> que permite deshabilitarlos. Ya sea de manera temporal o permanente, los <strong>CronJobs<\/strong> se pueden definir sin que ello implique que vayan a ser ejecutados (a pesar de lo que indiquen sus programaciones en el tiempo).<\/p>\n<div class=\"wp-block-codemirror-blocks code-block \">\n<pre class=\"CodeMirror\" data-setting=\"{\"># Deshabilitar un CronJob\r\nNOMBRE_CRONJOB=mi-cronjob-1\r\nkubectl patch cronjobs $NOMBRE_CRONJOB -p '{\"spec\" : {\"suspend\" : true }}'\r\n\r\n# Deshabilitar TODOS los CronJobs\r\nkubectl get cronjobs | grep False | cut -d' ' -f 1 | xargs kubectl patch cronjobs -p '{\"spec\" : {\"suspend\" : true }}'<\/pre>\n<\/div>\n<p><strong>Echa un vistazo a la siguiente secci\u00f3n para descubrir m\u00e1s detalles sobre los efectos colaterales que esto podr\u00eda causar.<\/strong><\/p>\n<h3>Ejecutar CronJobs manualmente<\/h3>\n<p style=\"text-align: justify;\">Es ampliamente reconocido que las pruebas (comunmente llamados tests, del Ingl\u00e9s) son \u00fatiles para detectar efectos no deseados. Los <strong>CronJobs<\/strong> se pueden ejecutar manualmente incluso cuando est\u00e1n desactivados, por lo que mantenerlos en ese estado y poder ejecutarlos bajo circunstancias que sirvan para probarlos puede ayudar a validar que todo est\u00e1 correctamente configurado.<\/p>\n<div class=\"wp-block-codemirror-blocks code-block \">\n<pre class=\"CodeMirror\" data-setting=\"{\">NOMBRE_CRONJOB=mi-cronjob-1\r\nkubectl create job --from=cronjobs\/$NOMBRE_CRONJOB $NOMBRE_CRONJOB-ejec-manual-01<\/pre>\n<\/div>\n<h2>4. Sacando a la luz los casos poco frecuentes<\/h2>\n<p style=\"text-align: justify;\">Despu\u00e9s de todo, no existir\u00eda la variedad si todo funcionase igual. Cada situaci\u00f3n tiene sus propias particularidades y caracter\u00edsticas especiales, por lo que cuando se trata de los <strong>CronJobs<\/strong> la cosa no es diferente. A lo largo de las siguientes l\u00edneas se presentar\u00e1n y tratar\u00e1n algunos casos poco frecuentes, de modo que las soluciones aportadas puedan ser reutilizadas (o, al menos, tenidas en consideraci\u00f3n).<\/p>\n<h3>Tiempo m\u00e1ximo de ejecuci\u00f3n<\/h3>\n<p style=\"text-align: justify;\">En secciones anteriores se trat\u00f3 el tema del tiempo de ejecuci\u00f3n, de modo que se garantizase un tiempo m\u00ednimo antes de forzar la terminaci\u00f3n. Pero, \u00a1eh! \u00bfQu\u00e9 sucede con las ejecuciones que se alarguen en el tiempo m\u00e1s all\u00e1 de lo previsto? La motivaci\u00f3n (desde un punto de vista agn\u00f3stico) de los contenedores (y tambi\u00e9n la de <a href=\"https:\/\/geko.clou\/es\/que-es-kubernetes\/\"><strong>Kubernetes<\/strong><\/a>) es la de ejecutar las tareas hasta el infinito y m\u00e1s all\u00e1. Los contenedores pueden fluir o pueden <em>crashear<\/em> (fallar), pero no se deben terminar como una pr\u00e1ctica habitual. Siguiendo este principio, no existe ninguna forma de gestionar la expiraci\u00f3n del tiempo previsto desde la especificaci\u00f3n de los CronJobs\/Jobs\/Contenedores. \u00bfEntonces, es imposible implantar un tiempo m\u00e1ximo de ejecuci\u00f3n? \u2014 \u00a1No, no lo es! En este punto es donde el abanico de herramientas de Linux aparece al rescate. Existe un comando llamado <a href=\"https:\/\/linux.die.net\/man\/1\/timeout\">timeout<\/a> que puede ser usado para ejecutar otro comando durante una cantidad espec\u00edfica de tiempo.<\/p>\n<p style=\"text-align: justify;\">Aunque la utilidad anterior puede limitar el tiempo, el c\u00f3digo de salida de la ejecuci\u00f3n cuando lo hace, no es un c\u00f3digo exitoso; por lo que el contenedor entrar\u00e1 en un estado de fallo (que puede escalar en un reinicio si as\u00ed est\u00e1 especificado). Por otra parte, el estado del comando que se quiere ejecutar se puede preservar, pero entonces no se puede saber si fue terminado o no. Entonces, \u00bfc\u00f3mo tratar ambas situaciones? En el siguiente extracto de c\u00f3digo se puede hallar una propuesta que consigue terminar siempre de manera satisfactorio, a la vez que se devuelve retroalimentaci\u00f3n acerca de lo ocurrido en realidad.<\/p>\n<div class=\"wp-block-codemirror-blocks code-block \">\n<pre class=\"CodeMirror\" data-setting=\"{\">containers:\r\n  - name: \"mi-container-limitado-a-10s\"\r\n    ...\r\n    command: [\"bash\", \"-c\"]\r\n    args:\r\n      - \/usr\/bin\/timeout 10 bash -c 'bash -c \"com arg1\" &amp;&amp; echo OK || echo KO-COM' || echo KO-TMP<\/pre>\n<\/div>\n<h3>CronJobs que no se ejecutan despu\u00e9s de haber sido desactivados y activados de nuevo<\/h3>\n<p style=\"text-align: justify;\">Se produce un efecto colateral cuando se desactiva un <strong>CronJob<\/strong>, que consiste en que despu\u00e9s de haberse perdido 100 programaciones en el tiempo, el <strong>CronJob<\/strong> no se volver\u00e1 a ejecutar. Esta informaci\u00f3n ya se se\u00f1ala en la documentaci\u00f3n, pero se menciona de pasada y se trata como algo poco relevante. La soluci\u00f3n en este caso es volver a crear el recurso.<\/p>\n<h3>CronJobs que se ejecutan fuera de su programaci\u00f3n despu\u00e9s de haber sido reactivados<\/h3>\n<p style=\"text-align: justify;\">Se puede encontrar otro efecto no esperado cuando se trata con <strong>CronJobs<\/strong>, que consiste en que al reactivar uno de ellos (y a pesar del hecho de que el momento en el que se haga no coincida con el que tiene programado) se ejecuta inmediatamente. Esto sucede porque la ejecuci\u00f3n no es simplemente un evento aislado, sino una ventana de tiempo con una fecha l\u00edmite. Esto implica que cada ejecuci\u00f3n que se pierde (por la pol\u00edtica de concurrencia, o por estar el <strong>CronJob<\/strong> deshabilitado) incrementa un contador (hasta cierta cantidad, lo que probablemente est\u00e1 relacionado con el caso poco frecuente anterior). Entonces, llegado el momento, cuando el <strong>CronJob<\/strong> se vuelve a activar y se permite de nuevo su ejecuci\u00f3n, el controlador tiene en cuenta que existen programaciones pendientes. Si la ventana de tiempo no se ha cerrado a\u00fan, el <strong>CronJob<\/strong> comienza a ejecutarse.<\/p>\n<p style=\"text-align: justify;\">Este comportamiento puede gestionarse estableciendo la directiva <a href=\"https:\/\/medium.com\/@hengfeng\/what-does-kubernetes-cronjobs-startingdeadlineseconds-exactly-mean-cc2117f9795f\">startingDeadlineSeconds<\/a> en un valor peque\u00f1o, de modo que la ventana de ejecuci\u00f3n no coincida con el momento de la reactivaci\u00f3n.<\/p>\n<h3>CronJobs que no se ejecutan<\/h3>\n<p style=\"text-align: justify;\">Cabe tener en cuenta que la anterior directiva <strong><em>startingDeadlineSeconds<\/em> se puede establecer en cualquier valor, pero no todos ellos van a causar el efecto deseado<\/strong>. Como ya se ha mencionado anteriormente el controlador de CronJobs se ejecuta cada 10 segundos, por lo que <strong>todo valor por debajo de diez segundos har\u00e1 que los CronJobs nunca se ejecuten<\/strong>. Se ha enviado una <a href=\"https:\/\/github.com\/kubernetes\/website\/issues\/23622\">incidencia<\/a> al proyecto de website de <a href=\"https:\/\/geko.clou\/es\/que-es-kubernetes\/\"><strong>Kubernetes<\/strong><\/a>, avis\u00e1ndoles de este caso. Seguramente en siguientes versiones se podr\u00e1 encontrar que ya se ha documentado, aunque no sea as\u00ed por el momento.<\/p>\n<p><strong>As\u00ed que no se debe olvidar establecer <em>startingDeadlineSeconds<\/em> en un valor mayor que 10.<\/strong><\/p>\n<h2>Conclusi\u00f3n<\/h2>\n<p style=\"text-align: justify;\">Como habr\u00e1s podido comprobar, la diferencia entre los crones de Sistema Operativo y los de <a href=\"https:\/\/geko.clou\/es\/que-es-kubernetes\/\"><strong>Kubernetes<\/strong><\/a> es mayor de la esperable desde un primer momento. Existen diferentes escenarios en un cl\u00faster y numerosas situaciones gestionar, y por eso se tratan. En algunos casos estaremos buscando un comportamiento similar al que podemos obtener en un Sistema Operativo, y en otros casos no, pero probablemente todos ellos pueden ser abordados. Por otra parte, que algo se incline mucho al multi-prop\u00f3sito tambi\u00e9n puede derivar (como los <strong>CronJobs<\/strong>) en una experiencia de configuraci\u00f3n con una mayor dificultad.<\/p>\n<p style=\"text-align: justify;\">Afortunadamente siempre puedes contar con el equipo de <a href=\"https:\/\/geko2.factoryfy.com\/\">Geko<\/a> (un equipo de ingenieros altamente cualificados), quienes profundizar\u00e1n en el tema hasta conseguir hacerlo sencillo para ti. \u00a1No olvides volver por el <a href=\"https:\/\/geko.cloud\/es\/blog\/labs\/\">blog de Geko<\/a> para comprobar qu\u00e9 hay nuevo por aqu\u00ed! El equipo de <a href=\"https:\/\/geko2.factoryfy.com\/\">Geko<\/a> siempre estar\u00e1 m\u00e1s que contento de verte por aqu\u00ed, y por supuesto <a href=\"https:\/\/geko.cloud\/es\/contacto\/\" target=\"_blank\" rel=\"noopener noreferrer\">\u00a1Ponte en contacto con nosotros para m\u00e1s informaci\u00f3n!<\/a><\/p>\n<h2>Lectura adicional<\/h2>\n<p><a href=\"https:\/\/kubernetes.io\/docs\/tasks\/job\/automated-tasks-with-cron-jobs\/\">https:\/\/kubernetes.io\/docs\/tasks\/job\/automated-tasks-with-cron-jobs\/<\/a><br \/>\n<a href=\"https:\/\/kubernetes.io\/docs\/concepts\/workloads\/controllers\/cron-jobs\/\">https:\/\/kubernetes.io\/docs\/concepts\/workloads\/controllers\/cron-jobs\/<\/a><br \/>\n<a href=\"https:\/\/kubernetes.io\/docs\/concepts\/workloads\/controllers\/job\/\">https:\/\/kubernetes.io\/docs\/concepts\/workloads\/controllers\/job\/<\/a><br \/>\n<a href=\"https:\/\/www.magalix.com\/blog\/kubernetes-patterns-the-cron-job-pattern\">https:\/\/www.magalix.com\/blog\/kubernetes-patterns-the-cron-job-pattern<\/a><br \/>\n<a href=\"https:\/\/medium.com\/@bambash\/kubernetes-docker-and-cron-8e92e3b5640f\">https:\/\/medium.com\/@bambash\/kubernetes-docker-and-cron-8e92e3b5640f<\/a><br \/>\n<a href=\"https:\/\/medium.com\/cloud-native-the-gathering\/how-to-write-and-use-kubernetes-cronjobs-3fbb891f88b8\">https:\/\/medium.com\/cloud-native-the-gathering\/how-to-write-and-use-kubernetes-cronjobs-3fbb891f88b8<\/a><br \/>\n<a href=\"https:\/\/medium.com\/@hengfeng\/what-does-kubernetes-cronjobs-startingdeadlineseconds-exactly-mean-cc2117f9795f\">https:\/\/medium.com\/@hengfeng\/what-does-kubernetes-cronjobs-startingdeadlineseconds-exactly-mean-cc2117f9795f<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introducci\u00f3n Hoy en d\u00eda, y cada vez m\u00e1s, es com\u00fan que las empresas migren algunas partes de su infraestructura (o incluso la compa\u00f1\u00eda entera) al cloud. Hay dos principales enfoques: Permanecer lo mas cerca posible de la antigua arquitectura usando VMs, o apostar por flexibilidad\/escalabilidad\/disponibilidad y buscar una nueva perspectiva mediante el uso de un [&hellip;]<\/p>\n","protected":false},"author":38,"featured_media":5402,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[18],"tags":[37],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Kubernetes CronJobs - Una vista en profundidad - Geko Cloud<\/title>\n<meta name=\"description\" content=\"Si quieres apostar por una mayor disponibilidad y flexibilidad mediante el uso de un orquestador de contenedores como Kubernetes, en nuestro post conocer\u00e1s c\u00f3mo funcionan los CronJobs en este ecosistema.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/geko.cloud\/es\/kubernetes-cronjobs\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Kubernetes CronJobs - Una vista en profundidad - Geko Cloud\" \/>\n<meta property=\"og:description\" content=\"Si quieres apostar por una mayor disponibilidad y flexibilidad mediante el uso de un orquestador de contenedores como Kubernetes, en nuestro post conocer\u00e1s c\u00f3mo funcionan los CronJobs en este ecosistema.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/geko.cloud\/es\/kubernetes-cronjobs\/\" \/>\n<meta property=\"og:site_name\" content=\"Geko Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2020-11-23T10:41:46+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-04-07T11:40:21+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/geko.cloud\/wp-content\/uploads\/2020\/11\/cronjobs.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1100\" \/>\n\t<meta property=\"og:image:height\" content=\"397\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Geko Cloud\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@geko_cloud\" \/>\n<meta name=\"twitter:site\" content=\"@geko_cloud\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/geko.cloud\/es\/kubernetes-cronjobs\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/geko.cloud\/es\/kubernetes-cronjobs\/\"},\"author\":{\"name\":\"Geko Cloud\",\"@id\":\"https:\/\/geko.cloud\/es\/#\/schema\/person\/c87e3587fb419825d72ac2043e798ab6\"},\"headline\":\"Kubernetes CronJobs &#8211; Una vista en profundidad\",\"datePublished\":\"2020-11-23T10:41:46+00:00\",\"dateModified\":\"2022-04-07T11:40:21+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/geko.cloud\/es\/kubernetes-cronjobs\/\"},\"wordCount\":2231,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/geko.cloud\/es\/#organization\"},\"image\":{\"@id\":\"https:\/\/geko.cloud\/es\/kubernetes-cronjobs\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/geko.cloud\/wp-content\/uploads\/2020\/11\/cronjobs.jpg\",\"keywords\":[\"Kubernetes\"],\"articleSection\":[\"Labs\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/geko.cloud\/es\/kubernetes-cronjobs\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/geko.cloud\/es\/kubernetes-cronjobs\/\",\"url\":\"https:\/\/geko.cloud\/es\/kubernetes-cronjobs\/\",\"name\":\"Kubernetes CronJobs - Una vista en profundidad - Geko Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/geko.cloud\/es\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/geko.cloud\/es\/kubernetes-cronjobs\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/geko.cloud\/es\/kubernetes-cronjobs\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/geko.cloud\/wp-content\/uploads\/2020\/11\/cronjobs.jpg\",\"datePublished\":\"2020-11-23T10:41:46+00:00\",\"dateModified\":\"2022-04-07T11:40:21+00:00\",\"description\":\"Si quieres apostar por una mayor disponibilidad y flexibilidad mediante el uso de un orquestador de contenedores como Kubernetes, en nuestro post conocer\u00e1s c\u00f3mo funcionan los CronJobs en este ecosistema.\",\"breadcrumb\":{\"@id\":\"https:\/\/geko.cloud\/es\/kubernetes-cronjobs\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/geko.cloud\/es\/kubernetes-cronjobs\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/geko.cloud\/es\/kubernetes-cronjobs\/#primaryimage\",\"url\":\"https:\/\/geko.cloud\/wp-content\/uploads\/2020\/11\/cronjobs.jpg\",\"contentUrl\":\"https:\/\/geko.cloud\/wp-content\/uploads\/2020\/11\/cronjobs.jpg\",\"width\":1100,\"height\":397,\"caption\":\"cronjobs\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/geko.cloud\/es\/kubernetes-cronjobs\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\/\/geko.cloud\/es\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Kubernetes CronJobs &#8211; Una vista en profundidad\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/geko.cloud\/es\/#website\",\"url\":\"https:\/\/geko.cloud\/es\/\",\"name\":\"Geko Cloud\",\"description\":\"Servicios de consultor\u00eda cloud y devops\",\"publisher\":{\"@id\":\"https:\/\/geko.cloud\/es\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/geko.cloud\/es\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/geko.cloud\/es\/#organization\",\"name\":\"Geko Cloud\",\"url\":\"https:\/\/geko.cloud\/es\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/geko.cloud\/es\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/geko.cloud\/wp-content\/uploads\/2021\/10\/geko_logo-positivo.png\",\"contentUrl\":\"https:\/\/geko.cloud\/wp-content\/uploads\/2021\/10\/geko_logo-positivo.png\",\"width\":1650,\"height\":809,\"caption\":\"Geko Cloud\"},\"image\":{\"@id\":\"https:\/\/geko.cloud\/es\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/x.com\/geko_cloud\",\"https:\/\/www.instagram.com\/gekocloud\/\",\"https:\/\/www.linkedin.com\/company\/gekocloud\",\"https:\/\/www.youtube.com\/channel\/UC5EFLCqUM7fEaXSa_0nWowQ\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/geko.cloud\/es\/#\/schema\/person\/c87e3587fb419825d72ac2043e798ab6\",\"name\":\"Geko Cloud\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/geko.cloud\/es\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/10fe5eb7a547a27afabbe3a5a0f60c96?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/10fe5eb7a547a27afabbe3a5a0f60c96?s=96&d=mm&r=g\",\"caption\":\"Geko Cloud\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Kubernetes CronJobs - Una vista en profundidad - Geko Cloud","description":"Si quieres apostar por una mayor disponibilidad y flexibilidad mediante el uso de un orquestador de contenedores como Kubernetes, en nuestro post conocer\u00e1s c\u00f3mo funcionan los CronJobs en este ecosistema.","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:\/\/geko.cloud\/es\/kubernetes-cronjobs\/","og_locale":"es_ES","og_type":"article","og_title":"Kubernetes CronJobs - Una vista en profundidad - Geko Cloud","og_description":"Si quieres apostar por una mayor disponibilidad y flexibilidad mediante el uso de un orquestador de contenedores como Kubernetes, en nuestro post conocer\u00e1s c\u00f3mo funcionan los CronJobs en este ecosistema.","og_url":"https:\/\/geko.cloud\/es\/kubernetes-cronjobs\/","og_site_name":"Geko Cloud","article_published_time":"2020-11-23T10:41:46+00:00","article_modified_time":"2022-04-07T11:40:21+00:00","og_image":[{"width":1100,"height":397,"url":"https:\/\/geko.cloud\/wp-content\/uploads\/2020\/11\/cronjobs.jpg","type":"image\/jpeg"}],"author":"Geko Cloud","twitter_card":"summary_large_image","twitter_creator":"@geko_cloud","twitter_site":"@geko_cloud","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/geko.cloud\/es\/kubernetes-cronjobs\/#article","isPartOf":{"@id":"https:\/\/geko.cloud\/es\/kubernetes-cronjobs\/"},"author":{"name":"Geko Cloud","@id":"https:\/\/geko.cloud\/es\/#\/schema\/person\/c87e3587fb419825d72ac2043e798ab6"},"headline":"Kubernetes CronJobs &#8211; Una vista en profundidad","datePublished":"2020-11-23T10:41:46+00:00","dateModified":"2022-04-07T11:40:21+00:00","mainEntityOfPage":{"@id":"https:\/\/geko.cloud\/es\/kubernetes-cronjobs\/"},"wordCount":2231,"commentCount":0,"publisher":{"@id":"https:\/\/geko.cloud\/es\/#organization"},"image":{"@id":"https:\/\/geko.cloud\/es\/kubernetes-cronjobs\/#primaryimage"},"thumbnailUrl":"https:\/\/geko.cloud\/wp-content\/uploads\/2020\/11\/cronjobs.jpg","keywords":["Kubernetes"],"articleSection":["Labs"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/geko.cloud\/es\/kubernetes-cronjobs\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/geko.cloud\/es\/kubernetes-cronjobs\/","url":"https:\/\/geko.cloud\/es\/kubernetes-cronjobs\/","name":"Kubernetes CronJobs - Una vista en profundidad - Geko Cloud","isPartOf":{"@id":"https:\/\/geko.cloud\/es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/geko.cloud\/es\/kubernetes-cronjobs\/#primaryimage"},"image":{"@id":"https:\/\/geko.cloud\/es\/kubernetes-cronjobs\/#primaryimage"},"thumbnailUrl":"https:\/\/geko.cloud\/wp-content\/uploads\/2020\/11\/cronjobs.jpg","datePublished":"2020-11-23T10:41:46+00:00","dateModified":"2022-04-07T11:40:21+00:00","description":"Si quieres apostar por una mayor disponibilidad y flexibilidad mediante el uso de un orquestador de contenedores como Kubernetes, en nuestro post conocer\u00e1s c\u00f3mo funcionan los CronJobs en este ecosistema.","breadcrumb":{"@id":"https:\/\/geko.cloud\/es\/kubernetes-cronjobs\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/geko.cloud\/es\/kubernetes-cronjobs\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/geko.cloud\/es\/kubernetes-cronjobs\/#primaryimage","url":"https:\/\/geko.cloud\/wp-content\/uploads\/2020\/11\/cronjobs.jpg","contentUrl":"https:\/\/geko.cloud\/wp-content\/uploads\/2020\/11\/cronjobs.jpg","width":1100,"height":397,"caption":"cronjobs"},{"@type":"BreadcrumbList","@id":"https:\/\/geko.cloud\/es\/kubernetes-cronjobs\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/geko.cloud\/es\/"},{"@type":"ListItem","position":2,"name":"Kubernetes CronJobs &#8211; Una vista en profundidad"}]},{"@type":"WebSite","@id":"https:\/\/geko.cloud\/es\/#website","url":"https:\/\/geko.cloud\/es\/","name":"Geko Cloud","description":"Servicios de consultor\u00eda cloud y devops","publisher":{"@id":"https:\/\/geko.cloud\/es\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/geko.cloud\/es\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/geko.cloud\/es\/#organization","name":"Geko Cloud","url":"https:\/\/geko.cloud\/es\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/geko.cloud\/es\/#\/schema\/logo\/image\/","url":"https:\/\/geko.cloud\/wp-content\/uploads\/2021\/10\/geko_logo-positivo.png","contentUrl":"https:\/\/geko.cloud\/wp-content\/uploads\/2021\/10\/geko_logo-positivo.png","width":1650,"height":809,"caption":"Geko Cloud"},"image":{"@id":"https:\/\/geko.cloud\/es\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/geko_cloud","https:\/\/www.instagram.com\/gekocloud\/","https:\/\/www.linkedin.com\/company\/gekocloud","https:\/\/www.youtube.com\/channel\/UC5EFLCqUM7fEaXSa_0nWowQ"]},{"@type":"Person","@id":"https:\/\/geko.cloud\/es\/#\/schema\/person\/c87e3587fb419825d72ac2043e798ab6","name":"Geko Cloud","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/geko.cloud\/es\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/10fe5eb7a547a27afabbe3a5a0f60c96?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/10fe5eb7a547a27afabbe3a5a0f60c96?s=96&d=mm&r=g","caption":"Geko Cloud"}}]}},"_links":{"self":[{"href":"https:\/\/geko.cloud\/es\/wp-json\/wp\/v2\/posts\/2144"}],"collection":[{"href":"https:\/\/geko.cloud\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/geko.cloud\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/geko.cloud\/es\/wp-json\/wp\/v2\/users\/38"}],"replies":[{"embeddable":true,"href":"https:\/\/geko.cloud\/es\/wp-json\/wp\/v2\/comments?post=2144"}],"version-history":[{"count":4,"href":"https:\/\/geko.cloud\/es\/wp-json\/wp\/v2\/posts\/2144\/revisions"}],"predecessor-version":[{"id":7864,"href":"https:\/\/geko.cloud\/es\/wp-json\/wp\/v2\/posts\/2144\/revisions\/7864"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/geko.cloud\/es\/wp-json\/wp\/v2\/media\/5402"}],"wp:attachment":[{"href":"https:\/\/geko.cloud\/es\/wp-json\/wp\/v2\/media?parent=2144"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/geko.cloud\/es\/wp-json\/wp\/v2\/categories?post=2144"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/geko.cloud\/es\/wp-json\/wp\/v2\/tags?post=2144"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}