{"id":20595,"date":"2026-07-04T05:02:37","date_gmt":"2026-07-04T05:02:37","guid":{"rendered":"http:\/\/www.devopsschool.com\/blog\/?p=20595"},"modified":"2026-07-04T05:02:41","modified_gmt":"2026-07-04T05:02:41","slug":"explained-kubernetes-jobs-and-cronjobs-with-example","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/explained-kubernetes-jobs-and-cronjobs-with-example\/","title":{"rendered":"Kubernetes Job &amp; CronJob Explained: API Resource, YAML Example, and Use Cases"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Kubernetes Jobs and CronJobs Explained with Examples: Complete Hands-on Guide for DevOps Engineer<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Keywords<\/h2>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Kubernetes Jobs\nKubernetes CronJobs\nKubernetes Job example\nKubernetes CronJob example\nKubernetes batch workloads\nkubectl create job\nkubectl create cronjob\nKubernetes scheduled jobs\nKubernetes background tasks\nKubernetes batch processing\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">1. Introduction<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">In Kubernetes, not every workload is a long-running application like a web server, API service, or microservice. Many real-world tasks are short-lived. They start, perform some work, complete, and then stop.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Examples include:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Database backup\nReport generation\nData cleanup\nFile processing\nBatch <span class=\"hljs-keyword\">import<\/span>\/<span class=\"hljs-keyword\">export<\/span>\nEmail notification batch\nLog archival\nCertificate renewal\nOne-time migration\nScheduled health check\nMachine learning batch job\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">For these use cases, Kubernetes provides two important workload resources:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Job\nCronJob\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">A <strong>Job<\/strong> runs one or more Pods until the task completes successfully. A <strong>CronJob<\/strong> creates Jobs repeatedly according to a time-based schedule. Kubernetes official documentation defines Jobs as one-off tasks that run to completion, while CronJobs create Jobs on a repeating schedule.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">As of the current Kubernetes documentation baseline, <strong>Kubernetes v1.36.2<\/strong> is the latest stable patch release in the Kubernetes 1.36 line, released on <strong>June 9, 2026<\/strong>. The examples in this tutorial use the stable <code>batch\/v1<\/code> APIs for Jobs and CronJobs.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">2. Job vs CronJob \u2014 Quick Comparison<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Feature<\/th><th>Job<\/th><th>CronJob<\/th><\/tr><\/thead><tbody><tr><td>Purpose<\/td><td>Run a task once until completion<\/td><td>Run tasks repeatedly on a schedule<\/td><\/tr><tr><td>API version<\/td><td><code>batch\/v1<\/code><\/td><td><code>batch\/v1<\/code><\/td><\/tr><tr><td>Creates Pods directly?<\/td><td>Yes, Job controller creates Pods<\/td><td>No, CronJob creates Jobs, then Jobs create Pods<\/td><\/tr><tr><td>Common use<\/td><td>One-time migration, batch processing, data import<\/td><td>Backups, reports, cleanup, scheduled sync<\/td><\/tr><tr><td>Scheduling<\/td><td>Runs immediately after creation unless suspended<\/td><td>Runs based on cron schedule<\/td><\/tr><tr><td>Retry support<\/td><td>Yes, using <code>backoffLimit<\/code><\/td><td>Yes, through Job template<\/td><\/tr><tr><td>Parallel execution<\/td><td>Yes, using <code>parallelism<\/code> and <code>completions<\/code><\/td><td>Yes, inside <code>jobTemplate<\/code><\/td><\/tr><tr><td>Automatic cleanup<\/td><td>Yes, using <code>ttlSecondsAfterFinished<\/code><\/td><td>Uses Job history limits and\/or Job TTL<\/td><\/tr><tr><td>Time zone support<\/td><td>Not applicable<\/td><td>Yes, using <code>.spec.timeZone<\/code><\/td><\/tr><tr><td>Concurrency control<\/td><td>Controlled by Job parallelism<\/td><td>Controlled by <code>concurrencyPolicy<\/code><\/td><\/tr><tr><td>Best for<\/td><td>One-time run-to-completion workloads<\/td><td>Scheduled run-to-completion workloads<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Simple rule:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">Use<\/span> <span class=\"hljs-title\">Job<\/span> <span class=\"hljs-title\">when<\/span> <span class=\"hljs-title\">the<\/span> <span class=\"hljs-title\">task<\/span> <span class=\"hljs-title\">must<\/span> <span class=\"hljs-title\">run<\/span> <span class=\"hljs-title\">once<\/span>.\n<span class=\"hljs-title\">Use<\/span> <span class=\"hljs-title\">CronJob<\/span> <span class=\"hljs-title\">when<\/span> <span class=\"hljs-title\">the<\/span> <span class=\"hljs-title\">task<\/span> <span class=\"hljs-title\">must<\/span> <span class=\"hljs-title\">run<\/span> <span class=\"hljs-title\">repeatedly<\/span> <span class=\"hljs-title\">on<\/span> <span class=\"hljs-title\">a<\/span> <span class=\"hljs-title\">schedule<\/span>.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">3. How Kubernetes Job Works<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A Kubernetes Job creates one or more Pods and tracks successful completions. The Job is considered complete when the required number of Pods finish successfully. For a simple non-parallel Job, Kubernetes usually starts one Pod, and the Job completes when that Pod exits successfully.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Basic flow:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">User creates Job\n        |\n        v\nJob controller creates Pod\n        |\n        v\nContainer runs command\n        |\n        v\nCommand exits <span class=\"hljs-keyword\">with<\/span> code <span class=\"hljs-number\">0<\/span>\n        |\n        v\nPod becomes Completed\n        |\n        v\nJob becomes Complete\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">If the container exits with a non-zero code, Kubernetes can retry according to the Job configuration. By default, the Job uses <code>.spec.backoffLimit<\/code>, which defaults to <code>6<\/code>, unless per-index backoff is configured for Indexed Jobs.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">4. How Kubernetes CronJob Works<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A CronJob is like a Linux crontab entry inside Kubernetes. It does not run the container directly. Instead, it creates a Job at the scheduled time, and that Job creates the Pod. Kubernetes documentation defines CronJob as a resource that starts one-time Jobs on a repeating schedule.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Basic flow:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">User creates CronJob\n        |\n        v\nCronJob controller watches schedule\n        |\n        v\nAt scheduled time, CronJob creates Job\n        |\n        v\nJob creates Pod\n        |\n        v\nContainer runs command\n        |\n        v\nPod completes\n        |\n        v\nJob completes\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">CronJob schedule: every day at <span class=\"hljs-number\">2<\/span> AM\n        |\n        v\nCreates a <span class=\"hljs-keyword\">new<\/span> Job daily at <span class=\"hljs-number\">2<\/span> AM\n        |\n        v\nEach Job runs backup script\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">5. Prerequisites<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">You need access to a Kubernetes cluster.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Check client and server version:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">kubectl version\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">For OpenShift:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc version\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Create a namespace for practice:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">kubectl create namespace jobs-demo\nkubectl config <span class=\"hljs-keyword\">set<\/span>-context --current --namespace=jobs-demo\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">For OpenShift:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">new<\/span>-project jobs-demo\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Verify:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">kubectl <span class=\"hljs-keyword\">get<\/span> ns jobs-demo\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Or:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">oc project\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">6. Basic Kubernetes Job Example<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Let us create a simple Job that prints a message and exits.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Create file:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">cat &gt; job-hello.yaml &lt;&lt;<span class=\"hljs-string\">'EOF'<\/span>\napiVersion: batch\/v1\nkind: Job\nmetadata:\n  name: hello-job\nspec:\n  template:\n    spec:\n      restartPolicy: Never\n      containers:\n        - name: hello\n          image: busybox:<span class=\"hljs-number\">1.36<\/span>\n          command:\n            - \/bin\/sh\n            - -c\n            - |\n              <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Hello from Kubernetes Job\"<\/span>\n              <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Current date is:\"<\/span>\n              date\n              <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Job completed successfully\"<\/span>\nEOF\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Apply:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">kubectl<\/span> <span class=\"hljs-selector-tag\">apply<\/span> <span class=\"hljs-selector-tag\">-f<\/span> <span class=\"hljs-selector-tag\">job-hello<\/span><span class=\"hljs-selector-class\">.yaml<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">For OpenShift:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">oc<\/span> <span class=\"hljs-selector-tag\">apply<\/span> <span class=\"hljs-selector-tag\">-f<\/span> <span class=\"hljs-selector-tag\">job-hello<\/span><span class=\"hljs-selector-class\">.yaml<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check Job:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">kubectl <span class=\"hljs-keyword\">get<\/span> jobs\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">NAME        STATUS     COMPLETIONS   DURATION   AGE\nhello-job   Complete   1\/1           5s         10s\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check Pods:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">kubectl <span class=\"hljs-keyword\">get<\/span> pods\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">NAME              READY   STATUS      RESTARTS   AGE\nhello-job-xxxxx   0\/1     Completed   0          20s\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">View logs:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">kubectl logs job\/hello-job\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected output:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">Hello<\/span> <span class=\"hljs-selector-tag\">from<\/span> <span class=\"hljs-selector-tag\">Kubernetes<\/span> <span class=\"hljs-selector-tag\">Job<\/span>\n<span class=\"hljs-selector-tag\">Current<\/span> <span class=\"hljs-selector-tag\">date<\/span> <span class=\"hljs-selector-tag\">is<\/span>:\n<span class=\"hljs-selector-tag\">Sat<\/span> <span class=\"hljs-selector-tag\">Jul<\/span>  4 10<span class=\"hljs-selector-pseudo\">:00<\/span><span class=\"hljs-selector-pseudo\">:00<\/span> <span class=\"hljs-selector-tag\">UTC<\/span> 2026\n<span class=\"hljs-selector-tag\">Job<\/span> <span class=\"hljs-selector-tag\">completed<\/span> <span class=\"hljs-selector-tag\">successfully<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The Pod remains after completion so that you can inspect status and logs. Kubernetes documentation notes that completed Job Pods are usually not deleted immediately, allowing you to inspect logs and diagnostics.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">7. Important Job Fields<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Field<\/th><th>Meaning<\/th><\/tr><\/thead><tbody><tr><td><code>template<\/code><\/td><td>Pod template used by the Job<\/td><\/tr><tr><td><code>restartPolicy<\/code><\/td><td>Must be <code>Never<\/code> or <code>OnFailure<\/code><\/td><\/tr><tr><td><code>backoffLimit<\/code><\/td><td>Number of retries before Job is marked failed<\/td><\/tr><tr><td><code>activeDeadlineSeconds<\/code><\/td><td>Maximum time allowed for the whole Job<\/td><\/tr><tr><td><code>completions<\/code><\/td><td>Number of successful Pods required<\/td><\/tr><tr><td><code>parallelism<\/code><\/td><td>Maximum Pods running at the same time<\/td><\/tr><tr><td><code>completionMode<\/code><\/td><td><code>NonIndexed<\/code> or <code>Indexed<\/code><\/td><\/tr><tr><td><code>ttlSecondsAfterFinished<\/code><\/td><td>Auto-cleanup time after Job finishes<\/td><\/tr><tr><td><code>suspend<\/code><\/td><td>Pause Job execution<\/td><\/tr><tr><td><code>podFailurePolicy<\/code><\/td><td>Advanced failure handling<\/td><\/tr><tr><td><code>successPolicy<\/code><\/td><td>Advanced success handling for Indexed Jobs<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The Kubernetes Job API states that <code>restartPolicy<\/code> inside the Job Pod template can only be <code>Never<\/code> or <code>OnFailure<\/code>. It also defines important fields such as <code>activeDeadlineSeconds<\/code>, <code>backoffLimit<\/code>, <code>completionMode<\/code>, <code>parallelism<\/code>, <code>suspend<\/code>, and <code>ttlSecondsAfterFinished<\/code>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">8. Job Restart Policy: <code>Never<\/code> vs <code>OnFailure<\/code><\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A Job Pod can use:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"HTTP\" data-shcb-language-slug=\"http\"><span><code class=\"hljs language-http\"><span class=\"hljs-attribute\">restartPolicy<\/span>: Never\n<span class=\"hljs-attribute\">restartPolicy<\/span>: OnFailure\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTTP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">http<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\"><code>restartPolicy: Never<\/code><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">If the container fails, the Pod is marked failed and the Job controller creates a new Pod.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><code>restartPolicy: OnFailure<\/code><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">If the container fails, Kubernetes restarts the container inside the same Pod.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Kubernetes documentation explains that when a container fails and <code>restartPolicy<\/code> is <code>OnFailure<\/code>, the Pod stays on the node and the container is rerun. If the Pod fails entirely, the Job controller starts a new Pod.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For clean learning, use:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-15\" data-shcb-language-name=\"HTTP\" data-shcb-language-slug=\"http\"><span><code class=\"hljs language-http\"><span class=\"hljs-attribute\">restartPolicy<\/span>: Never\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-15\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTTP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">http<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">For production, choose based on how your application handles retries.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">9. Failed Job Example<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Create a Job that always fails.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-16\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">cat &gt; job-fail.yaml &lt;&lt;<span class=\"hljs-string\">'EOF'<\/span>\napiVersion: batch\/v1\nkind: Job\nmetadata:\n  name: fail-job\nspec:\n  backoffLimit: <span class=\"hljs-number\">3<\/span>\n  template:\n    spec:\n      restartPolicy: Never\n      containers:\n        - name: fail\n          image: busybox:<span class=\"hljs-number\">1.36<\/span>\n          command:\n            - \/bin\/sh\n            - -c\n            - |\n              <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"This job will fail\"<\/span>\n              <span class=\"hljs-keyword\">exit<\/span> <span class=\"hljs-number\">1<\/span>\nEOF\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-16\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Apply:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-17\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">kubectl<\/span> <span class=\"hljs-selector-tag\">apply<\/span> <span class=\"hljs-selector-tag\">-f<\/span> <span class=\"hljs-selector-tag\">job-fail<\/span><span class=\"hljs-selector-class\">.yaml<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-17\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Watch:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-18\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">kubectl <span class=\"hljs-keyword\">get<\/span> jobs,pods -w\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-18\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">You will see multiple failed Pods because <code>backoffLimit: 3<\/code> allows retries before the Job is marked failed.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Check Job details:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">kubectl describe job fail-job\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check failed Pods:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-19\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">kubectl <span class=\"hljs-keyword\">get<\/span> pods -l job-name=fail-job\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-19\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check logs from one failed Pod:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">kubectl logs -l job-name=fail-job\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">This job will fail\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Clean up:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-20\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">kubectl <span class=\"hljs-keyword\">delete<\/span> job fail-job\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-20\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">10. <code>backoffLimit<\/code> \u2014 Retry Control<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\"><code>backoffLimit<\/code> controls how many failures are allowed before Kubernetes marks the Job as failed. The default is <code>6<\/code>, unless <code>backoffLimitPerIndex<\/code> is configured for an Indexed Job.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">spec:\n  backoffLimit: 3\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Meaning:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Kubernetes retries failed Pods.\nAfter retry limit is reached, Job becomes Failed.\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Use low values when:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-21\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Failure means a real bug\nYou <span class=\"hljs-keyword\">do<\/span> not want wasteful retries\nThe task is expensive\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-21\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Use higher values when:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Failures may be temporary\nNetwork dependencies are unstable\nExternal API may recover\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">11. <code>activeDeadlineSeconds<\/code> \u2014 Maximum Runtime<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\"><code>activeDeadlineSeconds<\/code> limits the total runtime of the Job. Once the Job exceeds this duration, Kubernetes terminates running Pods and marks the Job as failed with reason <code>DeadlineExceeded<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-22\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">cat &gt; job-deadline.yaml &lt;&lt;<span class=\"hljs-string\">'EOF'<\/span>\napiVersion: batch\/v1\nkind: Job\nmetadata:\n  name: deadline-job\nspec:\n  activeDeadlineSeconds: <span class=\"hljs-number\">20<\/span>\n  template:\n    spec:\n      restartPolicy: Never\n      containers:\n        - name: slow-task\n          image: busybox:<span class=\"hljs-number\">1.36<\/span>\n          command:\n            - \/bin\/sh\n            - -c\n            - |\n              <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Starting long task\"<\/span>\n              sleep <span class=\"hljs-number\">60<\/span>\n              <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"This line may never run\"<\/span>\nEOF\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-22\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Apply:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-23\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">kubectl<\/span> <span class=\"hljs-selector-tag\">apply<\/span> <span class=\"hljs-selector-tag\">-f<\/span> <span class=\"hljs-selector-tag\">job-deadline<\/span><span class=\"hljs-selector-class\">.yaml<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-23\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Watch:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-24\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">kubectl <span class=\"hljs-keyword\">get<\/span> job deadline-job -w\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-24\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Describe:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">kubectl describe job deadline-job\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected reason:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">DeadlineExceeded\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Clean up:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-25\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">kubectl <span class=\"hljs-keyword\">delete<\/span> job deadline-job\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-25\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">12. Auto-Cleanup Finished Jobs with TTL<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">By default, finished Jobs and their Pods may stay in the cluster. For production, you should clean them up.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Kubernetes provides <code>ttlSecondsAfterFinished<\/code> for automatic cleanup of completed or failed Jobs. The TTL-after-finished controller is stable and removes the Job and its dependent objects after the configured TTL.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-26\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">cat &gt; job-ttl.yaml &lt;&lt;<span class=\"hljs-string\">'EOF'<\/span>\n<span class=\"hljs-attr\">apiVersion<\/span>: batch\/v1\n<span class=\"hljs-attr\">kind<\/span>: Job\n<span class=\"hljs-attr\">metadata<\/span>:\n  name: ttl-job\n<span class=\"hljs-attr\">spec<\/span>:\n  ttlSecondsAfterFinished: <span class=\"hljs-number\">60<\/span>\n  <span class=\"hljs-attr\">template<\/span>:\n    spec:\n      restartPolicy: Never\n      <span class=\"hljs-attr\">containers<\/span>:\n        - name: task\n          <span class=\"hljs-attr\">image<\/span>: busybox:<span class=\"hljs-number\">1.36<\/span>\n          <span class=\"hljs-attr\">command<\/span>:\n            - <span class=\"hljs-regexp\">\/bin\/<\/span>sh\n            - -c\n            - |\n              echo <span class=\"hljs-string\">\"This Job will be cleaned up after 60 seconds\"<\/span>\n              date\nEOF\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-26\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Apply:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-27\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">kubectl<\/span> <span class=\"hljs-selector-tag\">apply<\/span> <span class=\"hljs-selector-tag\">-f<\/span> <span class=\"hljs-selector-tag\">job-ttl<\/span><span class=\"hljs-selector-class\">.yaml<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-27\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-28\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">kubectl <span class=\"hljs-keyword\">get<\/span> jobs,pods\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-28\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">After about 60 seconds from completion, Kubernetes becomes eligible to delete the Job and its Pods.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">13. Parallel Jobs<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Some tasks can run in parallel.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example use cases:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Process 100 files\nSend 10,000 emails\nRun 50 test cases\nProcess data partitions\nRun simulations\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Kubernetes supports parallel Jobs using:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-29\" data-shcb-language-name=\"HTTP\" data-shcb-language-slug=\"http\"><span><code class=\"hljs language-http\"><span class=\"hljs-attribute\">completions<\/span>: 6\n<span class=\"hljs-attribute\">parallelism<\/span>: 2\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-29\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTTP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">http<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Meaning:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Need 6 successful Pods total.\nRun maximum 2 Pods at a time.\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Create:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-30\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">cat &gt; job-parallel.yaml &lt;&lt;<span class=\"hljs-string\">'EOF'<\/span>\napiVersion: batch\/v1\nkind: Job\nmetadata:\n  name: parallel-job\nspec:\n  completions: <span class=\"hljs-number\">6<\/span>\n  parallelism: <span class=\"hljs-number\">2<\/span>\n  template:\n    spec:\n      restartPolicy: Never\n      containers:\n        - name: worker\n          image: busybox:<span class=\"hljs-number\">1.36<\/span>\n          command:\n            - \/bin\/sh\n            - -c\n            - |\n              <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Worker started on $(hostname)\"<\/span>\n              sleep <span class=\"hljs-number\">10<\/span>\n              <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Worker completed on $(hostname)\"<\/span>\nEOF\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-30\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Apply:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-31\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">kubectl<\/span> <span class=\"hljs-selector-tag\">apply<\/span> <span class=\"hljs-selector-tag\">-f<\/span> <span class=\"hljs-selector-tag\">job-parallel<\/span><span class=\"hljs-selector-class\">.yaml<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-31\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Watch:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-32\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">kubectl <span class=\"hljs-keyword\">get<\/span> pods -l job-name=parallel-job -w\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-32\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check Job:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-33\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">kubectl <span class=\"hljs-keyword\">get<\/span> job parallel-job\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-33\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">COMPLETIONS\n6\/6\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Kubernetes documentation states that <code>.spec.parallelism<\/code> controls the requested number of Pods running at any instant, and <code>.spec.completions<\/code> controls how many successful Pods are required for fixed-completion Jobs.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">14. Indexed Jobs<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">An Indexed Job gives each Pod a unique completion index.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This is useful when each Pod must process a specific shard or partition:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Pod index 0 processes file group 0\nPod index 1 processes file group 1\nPod index 2 processes file group 2\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Kubernetes supports <code>completionMode: Indexed<\/code>. For Indexed Jobs, each Pod gets an index from <code>0<\/code> to <code>.spec.completions - 1<\/code>, and the Job is complete when one Pod succeeds for every index. The index is available through mechanisms including annotation, label, hostname, and the <code>JOB_COMPLETION_INDEX<\/code> environment variable.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Create:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-34\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">cat &gt; job-indexed.yaml &lt;&lt;<span class=\"hljs-string\">'EOF'<\/span>\napiVersion: batch\/v1\nkind: Job\nmetadata:\n  name: indexed-job\nspec:\n  completions: <span class=\"hljs-number\">5<\/span>\n  parallelism: <span class=\"hljs-number\">2<\/span>\n  completionMode: Indexed\n  template:\n    spec:\n      restartPolicy: Never\n      containers:\n        - name: indexed-worker\n          image: busybox:<span class=\"hljs-number\">1.36<\/span>\n          command:\n            - \/bin\/sh\n            - -c\n            - |\n              <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"This is worker index: ${JOB_COMPLETION_INDEX}\"<\/span>\n              <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Hostname: $(hostname)\"<\/span>\n              sleep <span class=\"hljs-number\">5<\/span>\n              <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Completed index: ${JOB_COMPLETION_INDEX}\"<\/span>\nEOF\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-34\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Apply:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-35\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">kubectl<\/span> <span class=\"hljs-selector-tag\">apply<\/span> <span class=\"hljs-selector-tag\">-f<\/span> <span class=\"hljs-selector-tag\">job-indexed<\/span><span class=\"hljs-selector-class\">.yaml<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-35\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check Pods:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-36\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">kubectl <span class=\"hljs-keyword\">get<\/span> pods -l job-name=indexed-job\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-36\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check logs:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-37\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">kubectl logs -l job-name=indexed-job --prefix=<span class=\"hljs-literal\">true<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-37\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected style:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-38\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-attr\">&#91;pod\/indexed-job-0-xxxxx\/indexed-worker]<\/span> <span class=\"hljs-selector-tag\">This<\/span> <span class=\"hljs-selector-tag\">is<\/span> <span class=\"hljs-selector-tag\">worker<\/span> <span class=\"hljs-selector-tag\">index<\/span>: 0\n<span class=\"hljs-selector-attr\">&#91;pod\/indexed-job-1-yyyyy\/indexed-worker]<\/span> <span class=\"hljs-selector-tag\">This<\/span> <span class=\"hljs-selector-tag\">is<\/span> <span class=\"hljs-selector-tag\">worker<\/span> <span class=\"hljs-selector-tag\">index<\/span>: 1\n<span class=\"hljs-selector-attr\">&#91;pod\/indexed-job-2-zzzzz\/indexed-worker]<\/span> <span class=\"hljs-selector-tag\">This<\/span> <span class=\"hljs-selector-tag\">is<\/span> <span class=\"hljs-selector-tag\">worker<\/span> <span class=\"hljs-selector-tag\">index<\/span>: 2\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-38\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">15. Per-Index Retry with <code>backoffLimitPerIndex<\/code><\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">For Indexed Jobs, Kubernetes supports <code>backoffLimitPerIndex<\/code>. This lets each index have its own retry budget. The Job API says this field can only be used when <code>completionMode: Indexed<\/code> and the Pod restart policy is <code>Never<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-39\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">cat &gt; job-backoff-per-index.yaml &lt;&lt;<span class=\"hljs-string\">'EOF'<\/span>\napiVersion: batch\/v1\nkind: Job\nmetadata:\n  name: backoff-per-index-job\nspec:\n  completions: <span class=\"hljs-number\">4<\/span>\n  parallelism: <span class=\"hljs-number\">2<\/span>\n  completionMode: Indexed\n  backoffLimitPerIndex: <span class=\"hljs-number\">1<\/span>\n  maxFailedIndexes: <span class=\"hljs-number\">2<\/span>\n  template:\n    spec:\n      restartPolicy: Never\n      containers:\n        - name: worker\n          image: busybox:<span class=\"hljs-number\">1.36<\/span>\n          command:\n            - \/bin\/sh\n            - -c\n            - |\n              <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Running index: ${JOB_COMPLETION_INDEX}\"<\/span>\n              <span class=\"hljs-keyword\">if<\/span> &#91; <span class=\"hljs-string\">\"${JOB_COMPLETION_INDEX}\"<\/span> = <span class=\"hljs-string\">\"0\"<\/span> ]; then\n                <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Index 0 fails intentionally\"<\/span>\n                <span class=\"hljs-keyword\">exit<\/span> <span class=\"hljs-number\">1<\/span>\n              fi\n              <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Index ${JOB_COMPLETION_INDEX} completed\"<\/span>\nEOF\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-39\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Apply:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-40\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">kubectl<\/span> <span class=\"hljs-selector-tag\">apply<\/span> <span class=\"hljs-selector-tag\">-f<\/span> <span class=\"hljs-selector-tag\">job-backoff-per-index<\/span><span class=\"hljs-selector-class\">.yaml<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-40\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-41\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">kubectl <span class=\"hljs-keyword\">get<\/span> job backoff-per-index-job -o yaml\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-41\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Useful fields:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-42\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">kubectl get job backoff-per-index-job \\\n  -o jsonpath=<span class=\"hljs-string\">'{.status.completedIndexes}{\"\\n\"}{.status.failedIndexes}{\"\\n\"}'<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-42\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">16. Suspend and Resume a Job<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A Job can be created in suspended mode. When suspended, the Job controller does not create Pods. If a running Job is suspended, Kubernetes deletes active Pods associated with that Job. The API docs also state that suspending a Job resets the Job start time and effectively resets the <code>activeDeadlineSeconds<\/code> timer.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Create suspended Job:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-43\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">cat &gt; job-suspend.yaml &lt;&lt;<span class=\"hljs-string\">'EOF'<\/span>\n<span class=\"hljs-attr\">apiVersion<\/span>: batch\/v1\n<span class=\"hljs-attr\">kind<\/span>: Job\n<span class=\"hljs-attr\">metadata<\/span>:\n  name: suspended-job\n<span class=\"hljs-attr\">spec<\/span>:\n  suspend: <span class=\"hljs-literal\">true<\/span>\n  <span class=\"hljs-attr\">template<\/span>:\n    spec:\n      restartPolicy: Never\n      <span class=\"hljs-attr\">containers<\/span>:\n        - name: task\n          <span class=\"hljs-attr\">image<\/span>: busybox:<span class=\"hljs-number\">1.36<\/span>\n          <span class=\"hljs-attr\">command<\/span>:\n            - <span class=\"hljs-regexp\">\/bin\/<\/span>sh\n            - -c\n            - |\n              echo <span class=\"hljs-string\">\"This starts only after resume\"<\/span>\n              date\nEOF\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-43\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Apply:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-44\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">kubectl<\/span> <span class=\"hljs-selector-tag\">apply<\/span> <span class=\"hljs-selector-tag\">-f<\/span> <span class=\"hljs-selector-tag\">job-suspend<\/span><span class=\"hljs-selector-class\">.yaml<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-44\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-45\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">kubectl <span class=\"hljs-keyword\">get<\/span> jobs,pods\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-45\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">No Pod should be created yet.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Resume:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-46\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">kubectl patch job suspended-job -p <span class=\"hljs-string\">'{\"spec\":{\"suspend\":false}}'<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-46\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Watch:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-47\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">kubectl <span class=\"hljs-keyword\">get<\/span> pods -l job-name=suspended-job -w\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-47\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">17. Create a Job Quickly Using Command Line<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">You can create a Job without writing YAML.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-48\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">kubectl create job quick-job \\\n  --image=busybox:<span class=\"hljs-number\">1.36<\/span> \\\n  -- <span class=\"hljs-regexp\">\/bin\/<\/span>sh -c <span class=\"hljs-string\">'echo \"Quick Job\"; date'<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-48\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-49\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">kubectl <span class=\"hljs-keyword\">get<\/span> jobs\nkubectl logs job\/quick-job\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-49\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">For OpenShift:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-50\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc create job quick-job \\\n  --image=busybox:<span class=\"hljs-number\">1.36<\/span> \\\n  -- <span class=\"hljs-regexp\">\/bin\/<\/span>sh -c <span class=\"hljs-string\">'echo \"Quick Job\"; date'<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-50\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">18. CronJob Schedule Syntax<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">CronJob uses standard cron-style syntax:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-51\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 minute        0 - 59<\/span>\n<span class=\"hljs-comment\"># \u2502 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 hour        0 - 23<\/span>\n<span class=\"hljs-comment\"># \u2502 \u2502 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 day       1 - 31<\/span>\n<span class=\"hljs-comment\"># \u2502 \u2502 \u2502 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 month   1 - 12<\/span>\n<span class=\"hljs-comment\"># \u2502 \u2502 \u2502 \u2502 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 week  0 - 6, Sunday to Saturday<\/span>\n<span class=\"hljs-comment\"># \u2502 \u2502 \u2502 \u2502 \u2502<\/span>\n<span class=\"hljs-comment\"># * * * * *<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-51\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Examples:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Schedule<\/th><th>Meaning<\/th><\/tr><\/thead><tbody><tr><td><code>* * * * *<\/code><\/td><td>Every minute<\/td><\/tr><tr><td><code>*\/5 * * * *<\/code><\/td><td>Every 5 minutes<\/td><\/tr><tr><td><code>0 * * * *<\/code><\/td><td>Every hour<\/td><\/tr><tr><td><code>0 2 * * *<\/code><\/td><td>Every day at 2 AM<\/td><\/tr><tr><td><code>0 3 * * 1<\/code><\/td><td>Every Monday at 3 AM<\/td><\/tr><tr><td><code>0 0 1 * *<\/code><\/td><td>First day of every month<\/td><\/tr><tr><td><code>@hourly<\/code><\/td><td>Once per hour<\/td><\/tr><tr><td><code>@daily<\/code><\/td><td>Once per day<\/td><\/tr><tr><td><code>@weekly<\/code><\/td><td>Once per week<\/td><\/tr><tr><td><code>@monthly<\/code><\/td><td>Once per month<\/td><\/tr><tr><td><code>@yearly<\/code><\/td><td>Once per year<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Kubernetes CronJob requires <code>.spec.schedule<\/code> and supports standard cron syntax, step values such as <code>*\/2<\/code>, and macros such as <code>@hourly<\/code>, <code>@daily<\/code>, <code>@weekly<\/code>, and <code>@monthly<\/code>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">19. Basic CronJob Example<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Create a CronJob that runs every minute.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-52\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">cat &gt; cronjob-hello.yaml &lt;&lt;<span class=\"hljs-string\">'EOF'<\/span>\napiVersion: batch\/v1\nkind: CronJob\nmetadata:\n  name: hello-cronjob\nspec:\n  schedule: <span class=\"hljs-string\">\"* * * * *\"<\/span>\n  jobTemplate:\n    spec:\n      template:\n        spec:\n          restartPolicy: OnFailure\n          containers:\n            - name: hello\n              image: busybox:<span class=\"hljs-number\">1.36<\/span>\n              command:\n                - \/bin\/sh\n                - -c\n                - |\n                  <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Hello from Kubernetes CronJob\"<\/span>\n                  <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Run time:\"<\/span>\n                  date\nEOF\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-52\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Apply:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-53\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">kubectl<\/span> <span class=\"hljs-selector-tag\">apply<\/span> <span class=\"hljs-selector-tag\">-f<\/span> <span class=\"hljs-selector-tag\">cronjob-hello<\/span><span class=\"hljs-selector-class\">.yaml<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-53\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check CronJob:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-54\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">kubectl <span class=\"hljs-keyword\">get<\/span> cronjobs\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-54\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-55\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">NAME            SCHEDULE    SUSPEND   ACTIVE   LAST SCHEDULE   AGE\nhello-cronjob   * * * * *   False     0        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">none<\/span>&gt;<\/span>          10s\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-55\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Wait one minute, then check Jobs:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-56\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">kubectl <span class=\"hljs-keyword\">get<\/span> jobs\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-56\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">NAME                       STATUS     COMPLETIONS   DURATION   AGE\nhello-cronjob-xxxxxxxx     Complete   1\/1           3s         30s\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check Pods:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-57\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">kubectl <span class=\"hljs-keyword\">get<\/span> pods\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-57\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check logs:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-58\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">kubectl logs job\/$(kubectl get jobs --sort-by=.metadata.creationTimestamp -o jsonpath=<span class=\"hljs-string\">'{.items&#91;-1:].metadata.name}'<\/span>)\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-58\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">For OpenShift:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-59\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">oc logs job\/$(oc get jobs --sort-by=.metadata.creationTimestamp -o jsonpath=<span class=\"hljs-string\">'{.items&#91;-1:].metadata.name}'<\/span>)\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-59\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">20. Important CronJob Fields<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Field<\/th><th>Meaning<\/th><\/tr><\/thead><tbody><tr><td><code>schedule<\/code><\/td><td>Required cron schedule<\/td><\/tr><tr><td><code>jobTemplate<\/code><\/td><td>Required Job template<\/td><\/tr><tr><td><code>timeZone<\/code><\/td><td>Time zone for schedule<\/td><\/tr><tr><td><code>concurrencyPolicy<\/code><\/td><td>Allow, Forbid, or Replace overlapping Jobs<\/td><\/tr><tr><td><code>startingDeadlineSeconds<\/code><\/td><td>Deadline for starting missed Jobs<\/td><\/tr><tr><td><code>suspend<\/code><\/td><td>Pause future schedules<\/td><\/tr><tr><td><code>successfulJobsHistoryLimit<\/code><\/td><td>Number of successful Jobs to keep<\/td><\/tr><tr><td><code>failedJobsHistoryLimit<\/code><\/td><td>Number of failed Jobs to keep<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The CronJob API documents <code>concurrencyPolicy<\/code>, <code>failedJobsHistoryLimit<\/code>, <code>jobTemplate<\/code>, <code>schedule<\/code>, <code>startingDeadlineSeconds<\/code>, <code>successfulJobsHistoryLimit<\/code>, <code>suspend<\/code>, and <code>timeZone<\/code>. The defaults include <code>concurrencyPolicy: Allow<\/code>, <code>successfulJobsHistoryLimit: 3<\/code>, <code>failedJobsHistoryLimit: 1<\/code>, and <code>suspend: false<\/code>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">21. CronJob with Time Zone<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Kubernetes CronJobs support <code>.spec.timeZone<\/code>, stable since Kubernetes v1.27. If no time zone is specified, the controller interprets schedules relative to the local time zone of <code>kube-controller-manager<\/code>. Kubernetes recommends using the <code>timeZone<\/code> field rather than putting <code>TZ<\/code> or <code>CRON_TZ<\/code> inside the schedule.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example: run at 9 AM Tokyo time.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-60\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">cat &gt; cronjob-timezone.yaml &lt;&lt;<span class=\"hljs-string\">'EOF'<\/span>\n<span class=\"hljs-attr\">apiVersion<\/span>: batch\/v1\n<span class=\"hljs-attr\">kind<\/span>: CronJob\n<span class=\"hljs-attr\">metadata<\/span>:\n  name: tokyo-cronjob\n<span class=\"hljs-attr\">spec<\/span>:\n  schedule: <span class=\"hljs-string\">\"0 9 * * *\"<\/span>\n  <span class=\"hljs-attr\">timeZone<\/span>: <span class=\"hljs-string\">\"Asia\/Tokyo\"<\/span>\n  <span class=\"hljs-attr\">jobTemplate<\/span>:\n    spec:\n      template:\n        spec:\n          restartPolicy: OnFailure\n          <span class=\"hljs-attr\">containers<\/span>:\n            - name: tokyo-task\n              <span class=\"hljs-attr\">image<\/span>: busybox:<span class=\"hljs-number\">1.36<\/span>\n              <span class=\"hljs-attr\">command<\/span>:\n                - <span class=\"hljs-regexp\">\/bin\/<\/span>sh\n                - -c\n                - |\n                  echo <span class=\"hljs-string\">\"This runs daily at 9 AM Asia\/Tokyo\"<\/span>\n                  date\nEOF\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-60\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Apply:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-61\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">kubectl<\/span> <span class=\"hljs-selector-tag\">apply<\/span> <span class=\"hljs-selector-tag\">-f<\/span> <span class=\"hljs-selector-tag\">cronjob-timezone<\/span><span class=\"hljs-selector-class\">.yaml<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-61\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-62\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">kubectl <span class=\"hljs-keyword\">get<\/span> cronjob tokyo-cronjob -o yaml\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-62\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">22. CronJob Concurrency Policy<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Sometimes a scheduled task takes longer than the interval between runs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">CronJob runs every minute.\nEach Job takes 5 minutes.\nShould Kubernetes start overlapping Jobs?\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This is controlled by:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-63\" data-shcb-language-name=\"HTTP\" data-shcb-language-slug=\"http\"><span><code class=\"hljs language-http\"><span class=\"hljs-attribute\">concurrencyPolicy<\/span>: Allow\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-63\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTTP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">http<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Available values:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Policy<\/th><th>Meaning<\/th><\/tr><\/thead><tbody><tr><td><code>Allow<\/code><\/td><td>Default. Allows overlapping Jobs<\/td><\/tr><tr><td><code>Forbid<\/code><\/td><td>Skips new run if previous run is still active<\/td><\/tr><tr><td><code>Replace<\/code><\/td><td>Cancels currently running Job and starts a new one<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Kubernetes documentation says <code>Allow<\/code> permits concurrent Jobs, <code>Forbid<\/code> skips a new run if the previous one is still running, and <code>Replace<\/code> cancels the current run and replaces it with a new run. This policy applies only to Jobs created by the same CronJob.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">22.1 Example: <code>concurrencyPolicy: Forbid<\/code><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This CronJob runs every minute, but each Job sleeps for 90 seconds. With <code>Forbid<\/code>, Kubernetes will skip overlapping executions.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-64\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">cat &gt; cronjob-forbid.yaml &lt;&lt;<span class=\"hljs-string\">'EOF'<\/span>\napiVersion: batch\/v1\nkind: CronJob\nmetadata:\n  name: forbid-cronjob\nspec:\n  schedule: <span class=\"hljs-string\">\"* * * * *\"<\/span>\n  concurrencyPolicy: Forbid\n  jobTemplate:\n    spec:\n      template:\n        spec:\n          restartPolicy: Never\n          containers:\n            - name: slow-task\n              image: busybox:<span class=\"hljs-number\">1.36<\/span>\n              command:\n                - \/bin\/sh\n                - -c\n                - |\n                  <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Started at:\"<\/span>\n                  date\n                  sleep <span class=\"hljs-number\">90<\/span>\n                  <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Finished at:\"<\/span>\n                  date\nEOF\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-64\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Apply:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-65\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">kubectl<\/span> <span class=\"hljs-selector-tag\">apply<\/span> <span class=\"hljs-selector-tag\">-f<\/span> <span class=\"hljs-selector-tag\">cronjob-forbid<\/span><span class=\"hljs-selector-class\">.yaml<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-65\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Watch:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-66\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">kubectl <span class=\"hljs-keyword\">get<\/span> cronjob forbid-cronjob -w\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-66\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check Jobs:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-67\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">kubectl <span class=\"hljs-keyword\">get<\/span> jobs --sort-by=.metadata.creationTimestamp\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-67\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">You should see fewer Jobs than one per minute because overlapping runs are forbidden.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">22.2 Example: <code>concurrencyPolicy: Replace<\/code><\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-68\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">cat &gt; cronjob-replace.yaml &lt;&lt;<span class=\"hljs-string\">'EOF'<\/span>\napiVersion: batch\/v1\nkind: CronJob\nmetadata:\n  name: replace-cronjob\nspec:\n  schedule: <span class=\"hljs-string\">\"* * * * *\"<\/span>\n  concurrencyPolicy: Replace\n  jobTemplate:\n    spec:\n      template:\n        spec:\n          restartPolicy: Never\n          containers:\n            - name: replace-task\n              image: busybox:<span class=\"hljs-number\">1.36<\/span>\n              command:\n                - \/bin\/sh\n                - -c\n                - |\n                  <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Started at:\"<\/span>\n                  date\n                  sleep <span class=\"hljs-number\">120<\/span>\n                  <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Finished at:\"<\/span>\n                  date\nEOF\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-68\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Apply:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-69\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">kubectl<\/span> <span class=\"hljs-selector-tag\">apply<\/span> <span class=\"hljs-selector-tag\">-f<\/span> <span class=\"hljs-selector-tag\">cronjob-replace<\/span><span class=\"hljs-selector-class\">.yaml<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-69\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Watch Jobs:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-70\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">kubectl <span class=\"hljs-keyword\">get<\/span> jobs,pods -w\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-70\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Every new scheduled run can replace the currently running one.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">23. <code>startingDeadlineSeconds<\/code><\/h1>\n\n\n\n<p class=\"wp-block-paragraph\"><code>startingDeadlineSeconds<\/code> tells Kubernetes how late a missed CronJob run may start. If the delay is greater than the configured deadline, Kubernetes skips that occurrence. Kubernetes treats missed Jobs beyond the deadline as failed Jobs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-71\" data-shcb-language-name=\"HTTP\" data-shcb-language-slug=\"http\"><span><code class=\"hljs language-http\"><span class=\"hljs-attribute\">startingDeadlineSeconds<\/span>: 300\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-71\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTTP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">http<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Meaning:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">If the Job cannot start within 300 seconds of scheduled time,\nskip that occurrence.\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Example manifest:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-72\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">cat &gt; cronjob-deadline.yaml &lt;&lt;<span class=\"hljs-string\">'EOF'<\/span>\n<span class=\"hljs-attr\">apiVersion<\/span>: batch\/v1\n<span class=\"hljs-attr\">kind<\/span>: CronJob\n<span class=\"hljs-attr\">metadata<\/span>:\n  name: deadline-cronjob\n<span class=\"hljs-attr\">spec<\/span>:\n  schedule: <span class=\"hljs-string\">\"*\/5 * * * *\"<\/span>\n  <span class=\"hljs-attr\">startingDeadlineSeconds<\/span>: <span class=\"hljs-number\">120<\/span>\n  <span class=\"hljs-attr\">concurrencyPolicy<\/span>: Forbid\n  <span class=\"hljs-attr\">jobTemplate<\/span>:\n    spec:\n      template:\n        spec:\n          restartPolicy: OnFailure\n          <span class=\"hljs-attr\">containers<\/span>:\n            - name: deadline-task\n              <span class=\"hljs-attr\">image<\/span>: busybox:<span class=\"hljs-number\">1.36<\/span>\n              <span class=\"hljs-attr\">command<\/span>:\n                - <span class=\"hljs-regexp\">\/bin\/<\/span>sh\n                - -c\n                - |\n                  echo <span class=\"hljs-string\">\"CronJob with startingDeadlineSeconds\"<\/span>\n                  date\nEOF\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-72\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Apply:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-73\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">kubectl<\/span> <span class=\"hljs-selector-tag\">apply<\/span> <span class=\"hljs-selector-tag\">-f<\/span> <span class=\"hljs-selector-tag\">cronjob-deadline<\/span><span class=\"hljs-selector-class\">.yaml<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-73\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">24. Suspend and Resume CronJob<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">You can pause future CronJob executions using:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-74\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">suspend: <span class=\"hljs-literal\">true<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-74\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This does not stop already started Jobs. Kubernetes documentation states that <code>suspend<\/code> affects subsequent executions, not Jobs already started. It also warns that suspended executions count as missed Jobs, and when unsuspended without a starting deadline, missed Jobs may be scheduled immediately.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Suspend:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-75\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">kubectl patch cronjob hello-cronjob -p <span class=\"hljs-string\">'{\"spec\":{\"suspend\":true}}'<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-75\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-76\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">kubectl <span class=\"hljs-keyword\">get<\/span> cronjob hello-cronjob\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-76\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Resume:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-77\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">kubectl patch cronjob hello-cronjob -p <span class=\"hljs-string\">'{\"spec\":{\"suspend\":false}}'<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-77\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Better production pattern:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-78\" data-shcb-language-name=\"HTTP\" data-shcb-language-slug=\"http\"><span><code class=\"hljs language-http\"><span class=\"hljs-attribute\">startingDeadlineSeconds<\/span>: 300\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-78\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTTP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">http<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Use this with suspend\/resume to avoid accidental burst execution after long suspension.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">25. CronJob History Limits<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">CronJobs can keep old successful and failed Jobs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Defaults:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-79\" data-shcb-language-name=\"HTTP\" data-shcb-language-slug=\"http\"><span><code class=\"hljs language-http\"><span class=\"hljs-attribute\">successfulJobsHistoryLimit<\/span>: 3\n<span class=\"hljs-attribute\">failedJobsHistoryLimit<\/span>: 1\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-79\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTTP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">http<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Set to lower values to avoid clutter.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-80\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">cat &gt; cronjob-history.yaml &lt;&lt;<span class=\"hljs-string\">'EOF'<\/span>\n<span class=\"hljs-attr\">apiVersion<\/span>: batch\/v1\n<span class=\"hljs-attr\">kind<\/span>: CronJob\n<span class=\"hljs-attr\">metadata<\/span>:\n  name: history-cronjob\n<span class=\"hljs-attr\">spec<\/span>:\n  schedule: <span class=\"hljs-string\">\"* * * * *\"<\/span>\n  <span class=\"hljs-attr\">successfulJobsHistoryLimit<\/span>: <span class=\"hljs-number\">2<\/span>\n  <span class=\"hljs-attr\">failedJobsHistoryLimit<\/span>: <span class=\"hljs-number\">1<\/span>\n  <span class=\"hljs-attr\">jobTemplate<\/span>:\n    spec:\n      template:\n        spec:\n          restartPolicy: OnFailure\n          <span class=\"hljs-attr\">containers<\/span>:\n            - name: task\n              <span class=\"hljs-attr\">image<\/span>: busybox:<span class=\"hljs-number\">1.36<\/span>\n              <span class=\"hljs-attr\">command<\/span>:\n                - <span class=\"hljs-regexp\">\/bin\/<\/span>sh\n                - -c\n                - |\n                  echo <span class=\"hljs-string\">\"CronJob history demo\"<\/span>\n                  date\nEOF\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-80\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Apply:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-81\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">kubectl<\/span> <span class=\"hljs-selector-tag\">apply<\/span> <span class=\"hljs-selector-tag\">-f<\/span> <span class=\"hljs-selector-tag\">cronjob-history<\/span><span class=\"hljs-selector-class\">.yaml<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-81\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Kubernetes documentation says <code>successfulJobsHistoryLimit<\/code> controls how many successful Jobs are kept and defaults to <code>3<\/code>; <code>failedJobsHistoryLimit<\/code> controls failed Jobs and defaults to <code>1<\/code>. Setting either to <code>0<\/code> keeps none of that type.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">26. Manually Trigger a CronJob Immediately<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">A CronJob runs on schedule, but sometimes you want to run it now.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Use:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-82\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">kubectl create job manual-run<span class=\"hljs-number\">-1<\/span> --<span class=\"hljs-keyword\">from<\/span>=cronjob\/hello-cronjob\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-82\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-83\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">kubectl <span class=\"hljs-keyword\">get<\/span> jobs\nkubectl logs job\/manual-run-1\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-83\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">For OpenShift:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-84\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc create job manual-run<span class=\"hljs-number\">-1<\/span> --<span class=\"hljs-keyword\">from<\/span>=cronjob\/hello-cronjob\noc logs job\/manual-run<span class=\"hljs-number\">-1<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-84\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This is very useful for testing backup CronJobs without waiting for the real schedule.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">27. Real-World Use Case 1: Database Backup CronJob<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">This example uses <code>busybox<\/code> for demonstration. In production, use a database-specific image such as PostgreSQL, MySQL, MongoDB, or your internal backup image.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Create Secret:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-85\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">kubectl create secret generic db-backup-secret \\\n  --<span class=\"hljs-keyword\">from<\/span>-literal=DB_HOST=<span class=\"hljs-string\">'mysql.default.svc.cluster.local'<\/span> \\\n  --<span class=\"hljs-keyword\">from<\/span>-literal=DB_USER=<span class=\"hljs-string\">'backup_user'<\/span> \\\n  --<span class=\"hljs-keyword\">from<\/span>-literal=DB_PASSWORD=<span class=\"hljs-string\">'backup_password'<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-85\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Create CronJob:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-86\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">cat &gt; cronjob-db-backup.yaml &lt;&lt;<span class=\"hljs-string\">'EOF'<\/span>\napiVersion: batch\/v1\nkind: CronJob\nmetadata:\n  name: db-backup\nspec:\n  schedule: <span class=\"hljs-string\">\"0 2 * * *\"<\/span>\n  timeZone: <span class=\"hljs-string\">\"Etc\/UTC\"<\/span>\n  concurrencyPolicy: Forbid\n  startingDeadlineSeconds: <span class=\"hljs-number\">1800<\/span>\n  successfulJobsHistoryLimit: <span class=\"hljs-number\">3<\/span>\n  failedJobsHistoryLimit: <span class=\"hljs-number\">3<\/span>\n  jobTemplate:\n    spec:\n      backoffLimit: <span class=\"hljs-number\">2<\/span>\n      ttlSecondsAfterFinished: <span class=\"hljs-number\">86400<\/span>\n      template:\n        spec:\n          restartPolicy: Never\n          containers:\n            - name: backup\n              image: busybox:<span class=\"hljs-number\">1.36<\/span>\n              env:\n                - name: DB_HOST\n                  valueFrom:\n                    secretKeyRef:\n                      name: db-backup-secret\n                      key: DB_HOST\n                - name: DB_USER\n                  valueFrom:\n                    secretKeyRef:\n                      name: db-backup-secret\n                      key: DB_USER\n                - name: DB_PASSWORD\n                  valueFrom:\n                    secretKeyRef:\n                      name: db-backup-secret\n                      key: DB_PASSWORD\n              command:\n                - \/bin\/sh\n                - -c\n                - |\n                  <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Starting DB backup\"<\/span>\n                  <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"DB_HOST=${DB_HOST}\"<\/span>\n                  <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Backup user=${DB_USER}\"<\/span>\n                  <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Never print real password in production\"<\/span>\n                  date\n                  <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Backup completed\"<\/span>\nEOF\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-86\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Apply:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-87\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">kubectl<\/span> <span class=\"hljs-selector-tag\">apply<\/span> <span class=\"hljs-selector-tag\">-f<\/span> <span class=\"hljs-selector-tag\">cronjob-db-backup<\/span><span class=\"hljs-selector-class\">.yaml<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-87\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Test now:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-88\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">kubectl create job db-backup-manual --<span class=\"hljs-keyword\">from<\/span>=cronjob\/db-backup\nkubectl logs job\/db-backup-manual\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-88\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Production notes:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-89\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">Do<\/span> not <span class=\"hljs-keyword\">print<\/span> secrets in logs.\nStore backups in object storage.\n<span class=\"hljs-keyword\">Use<\/span> <span class=\"hljs-title\">Workload<\/span> <span class=\"hljs-title\">Identity<\/span> <span class=\"hljs-title\">or<\/span> <span class=\"hljs-title\">IAM<\/span> <span class=\"hljs-title\">roles<\/span> <span class=\"hljs-title\">where<\/span> <span class=\"hljs-title\">possible<\/span>.\n<span class=\"hljs-title\">Use<\/span> <span class=\"hljs-title\">encryption<\/span> <span class=\"hljs-title\">for<\/span> <span class=\"hljs-title\">backups<\/span>.\n<span class=\"hljs-title\">Use<\/span> <span class=\"hljs-title\">concurrencyPolicy<\/span>: <span class=\"hljs-title\">Forbid<\/span> <span class=\"hljs-title\">for<\/span> <span class=\"hljs-title\">backups<\/span>.\n<span class=\"hljs-title\">Use<\/span> <span class=\"hljs-title\">startingDeadlineSeconds<\/span> <span class=\"hljs-title\">to<\/span> <span class=\"hljs-title\">prevent<\/span> <span class=\"hljs-title\">stale<\/span> <span class=\"hljs-title\">backups<\/span>.\n<span class=\"hljs-title\">Use<\/span> <span class=\"hljs-title\">resource<\/span> <span class=\"hljs-title\">requests<\/span> <span class=\"hljs-title\">and<\/span> <span class=\"hljs-title\">limits<\/span>.\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-89\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">28. Real-World Use Case 2: Report Generation CronJob<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-90\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">cat &gt; cronjob-report.yaml &lt;&lt;<span class=\"hljs-string\">'EOF'<\/span>\napiVersion: batch\/v1\nkind: CronJob\nmetadata:\n  name: daily-report\nspec:\n  schedule: <span class=\"hljs-string\">\"30 6 * * *\"<\/span>\n  timeZone: <span class=\"hljs-string\">\"Asia\/Tokyo\"<\/span>\n  concurrencyPolicy: Forbid\n  successfulJobsHistoryLimit: <span class=\"hljs-number\">5<\/span>\n  failedJobsHistoryLimit: <span class=\"hljs-number\">2<\/span>\n  jobTemplate:\n    spec:\n      backoffLimit: <span class=\"hljs-number\">3<\/span>\n      ttlSecondsAfterFinished: <span class=\"hljs-number\">172800<\/span>\n      template:\n        spec:\n          restartPolicy: Never\n          containers:\n            - name: report\n              image: busybox:<span class=\"hljs-number\">1.36<\/span>\n              command:\n                - \/bin\/sh\n                - -c\n                - |\n                  <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Generating daily report\"<\/span>\n                  date\n                  sleep <span class=\"hljs-number\">10<\/span>\n                  <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Report generated successfully\"<\/span>\nEOF\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-90\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Apply:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-91\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">kubectl<\/span> <span class=\"hljs-selector-tag\">apply<\/span> <span class=\"hljs-selector-tag\">-f<\/span> <span class=\"hljs-selector-tag\">cronjob-report<\/span><span class=\"hljs-selector-class\">.yaml<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-91\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-92\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">kubectl <span class=\"hljs-keyword\">get<\/span> cronjob daily-report\nkubectl describe cronjob daily-report\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-92\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Manual run:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-93\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">kubectl create job daily-report-test --<span class=\"hljs-keyword\">from<\/span>=cronjob\/daily-report\nkubectl logs job\/daily-report-test\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-93\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">29. Real-World Use Case 3: Cleanup Job<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Use a Job for one-time cleanup.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-94\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">cat &gt; job-cleanup.yaml &lt;&lt;<span class=\"hljs-string\">'EOF'<\/span>\napiVersion: batch\/v1\nkind: Job\nmetadata:\n  name: one-time-cleanup\nspec:\n  ttlSecondsAfterFinished: <span class=\"hljs-number\">300<\/span>\n  backoffLimit: <span class=\"hljs-number\">1<\/span>\n  template:\n    spec:\n      restartPolicy: Never\n      containers:\n        - name: cleanup\n          image: busybox:<span class=\"hljs-number\">1.36<\/span>\n          command:\n            - \/bin\/sh\n            - -c\n            - |\n              <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Running one-time cleanup\"<\/span>\n              date\n              <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Cleanup completed\"<\/span>\nEOF\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-94\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Apply:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-95\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">kubectl<\/span> <span class=\"hljs-selector-tag\">apply<\/span> <span class=\"hljs-selector-tag\">-f<\/span> <span class=\"hljs-selector-tag\">job-cleanup<\/span><span class=\"hljs-selector-class\">.yaml<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-95\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-96\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">kubectl <span class=\"hljs-keyword\">get<\/span> job one-time-cleanup\nkubectl logs job\/one-time-cleanup\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-96\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">30. Real-World Use Case 4: Parallel File Processing<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-97\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">cat &gt; job-file-processing.yaml &lt;&lt;<span class=\"hljs-string\">'EOF'<\/span>\napiVersion: batch\/v1\nkind: Job\nmetadata:\n  name: file-processing\nspec:\n  completions: <span class=\"hljs-number\">10<\/span>\n  parallelism: <span class=\"hljs-number\">3<\/span>\n  completionMode: Indexed\n  backoffLimitPerIndex: <span class=\"hljs-number\">2<\/span>\n  maxFailedIndexes: <span class=\"hljs-number\">3<\/span>\n  template:\n    spec:\n      restartPolicy: Never\n      containers:\n        - name: processor\n          image: busybox:<span class=\"hljs-number\">1.36<\/span>\n          command:\n            - \/bin\/sh\n            - -c\n            - |\n              <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Processing file partition: ${JOB_COMPLETION_INDEX}\"<\/span>\n              sleep <span class=\"hljs-number\">5<\/span>\n              <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Completed partition: ${JOB_COMPLETION_INDEX}\"<\/span>\nEOF\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-97\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Apply:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-98\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">kubectl<\/span> <span class=\"hljs-selector-tag\">apply<\/span> <span class=\"hljs-selector-tag\">-f<\/span> <span class=\"hljs-selector-tag\">job-file-processing<\/span><span class=\"hljs-selector-class\">.yaml<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-98\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Watch:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-99\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">kubectl <span class=\"hljs-keyword\">get<\/span> pods -l job-name=file-processing -w\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-99\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Logs:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-100\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">kubectl logs -l job-name=file-processing --prefix=<span class=\"hljs-literal\">true<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-100\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">31. Advanced: Pod Failure Policy<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\"><code>podFailurePolicy<\/code> gives more precise control over failures than only using <code>backoffLimit<\/code>. Kubernetes documentation says Pod failure policy became stable in Kubernetes v1.31 and lets the Job handle failures based on container exit codes and Pod conditions.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example: fail the whole Job immediately if the container exits with code <code>42<\/code>.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-101\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">cat &gt; job-pod-failure-policy.yaml &lt;&lt;<span class=\"hljs-string\">'EOF'<\/span>\napiVersion: batch\/v1\nkind: Job\nmetadata:\n  name: pod-failure-policy-job\nspec:\n  completions: <span class=\"hljs-number\">3<\/span>\n  parallelism: <span class=\"hljs-number\">1<\/span>\n  backoffLimit: <span class=\"hljs-number\">6<\/span>\n  podFailurePolicy:\n    rules:\n      - action: FailJob\n        onExitCodes:\n          containerName: main\n          operator: In\n          values: &#91;<span class=\"hljs-number\">42<\/span>]\n  template:\n    spec:\n      restartPolicy: Never\n      containers:\n        - name: main\n          image: busybox:<span class=\"hljs-number\">1.36<\/span>\n          command:\n            - \/bin\/sh\n            - -c\n            - |\n              <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Simulating non-retriable application bug\"<\/span>\n              <span class=\"hljs-keyword\">exit<\/span> <span class=\"hljs-number\">42<\/span>\nEOF\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-101\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Apply:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-102\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">kubectl<\/span> <span class=\"hljs-selector-tag\">apply<\/span> <span class=\"hljs-selector-tag\">-f<\/span> <span class=\"hljs-selector-tag\">job-pod-failure-policy<\/span><span class=\"hljs-selector-class\">.yaml<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-102\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">kubectl describe job pod-failure-policy-job\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Expected: the Job fails quickly instead of wasting retries.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Important limitation: the Job API says <code>podFailurePolicy<\/code> cannot be used together with <code>restartPolicy: OnFailure<\/code>. Use <code>restartPolicy: Never<\/code>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">32. Advanced: Success Policy for Indexed Jobs<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">For some batch workloads, not every Pod must succeed. For example:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Run 10 simulations.\nIf any 3 important simulations succeed, mark the Job successful.\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Kubernetes supports <code>successPolicy<\/code> for Indexed Jobs. The documentation says success policy lets you declare a Job successful based on succeeded indexes or succeeded count, and after the policy is met, lingering Pods are terminated.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-103\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">cat &gt; job-success-policy.yaml &lt;&lt;<span class=\"hljs-string\">'EOF'<\/span>\napiVersion: batch\/v1\nkind: Job\nmetadata:\n  name: success-policy-job\nspec:\n  parallelism: <span class=\"hljs-number\">5<\/span>\n  completions: <span class=\"hljs-number\">5<\/span>\n  completionMode: Indexed\n  successPolicy:\n    rules:\n      - succeededIndexes: <span class=\"hljs-number\">0<\/span><span class=\"hljs-number\">-4<\/span>\n        succeededCount: <span class=\"hljs-number\">3<\/span>\n  template:\n    spec:\n      restartPolicy: Never\n      containers:\n        - name: worker\n          image: busybox:<span class=\"hljs-number\">1.36<\/span>\n          command:\n            - \/bin\/sh\n            - -c\n            - |\n              <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Worker index: ${JOB_COMPLETION_INDEX}\"<\/span>\n              sleep <span class=\"hljs-number\">5<\/span>\n              <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Success from index ${JOB_COMPLETION_INDEX}\"<\/span>\nEOF\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-103\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Apply:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-104\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">kubectl<\/span> <span class=\"hljs-selector-tag\">apply<\/span> <span class=\"hljs-selector-tag\">-f<\/span> <span class=\"hljs-selector-tag\">job-success-policy<\/span><span class=\"hljs-selector-class\">.yaml<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-104\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Watch:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-105\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">kubectl <span class=\"hljs-keyword\">get<\/span> job success-policy-job -w\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-105\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">33. Debugging Jobs and CronJobs<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Check Jobs<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-106\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">kubectl get jobs\nkubectl describe job <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">job-name<\/span>&gt;<\/span>\nkubectl get job <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">job-name<\/span>&gt;<\/span> -o yaml\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-106\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Check Pods created by a Job<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-107\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">kubectl get pods -l job-name=<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">job-name<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-107\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">View logs<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-108\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">kubectl logs job\/<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">job-name<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-108\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">If multiple Pods exist:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-109\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">kubectl logs -l job-name=<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">job-name<\/span>&gt;<\/span> --prefix=true\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-109\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Check CronJobs<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-110\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">kubectl get cronjobs\nkubectl describe cronjob <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">cronjob-name<\/span>&gt;<\/span>\nkubectl get cronjob <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">cronjob-name<\/span>&gt;<\/span> -o yaml\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-110\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Check Jobs created by CronJob<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-111\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">kubectl <span class=\"hljs-keyword\">get<\/span> jobs --sort-by=.metadata.creationTimestamp\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-111\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Watch everything<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-112\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">kubectl <span class=\"hljs-keyword\">get<\/span> cronjobs,jobs,pods -w\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-112\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Check events<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-113\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">kubectl <span class=\"hljs-keyword\">get<\/span> events --sort-by=.lastTimestamp\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-113\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">For OpenShift:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-114\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">oc get cronjobs,jobs,pods\noc describe cronjob <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">cronjob-name<\/span>&gt;<\/span>\noc logs job\/<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">job-name<\/span>&gt;<\/span>\noc get events --sort-by=.lastTimestamp\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-114\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">34. Troubleshooting Common Problems<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Problem 1: Job keeps failing<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Check:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-115\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">kubectl describe job <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">job-name<\/span>&gt;<\/span>\nkubectl get pods -l job-name=<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">job-name<\/span>&gt;<\/span>\nkubectl logs -l job-name=<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">job-name<\/span>&gt;<\/span> --prefix=true\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-115\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Common causes:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-116\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Application exits <span class=\"hljs-keyword\">with<\/span> non-zero code\nWrong command or args\nMissing ConfigMap or Secret\nImagePullBackOff\nPermission issue\nNetwork dependency unavailable\nResource limit too low\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-116\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Problem 2: CronJob is not creating Jobs<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Check:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-117\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">kubectl describe cronjob <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">cronjob-name<\/span>&gt;<\/span>\nkubectl get events --sort-by=.lastTimestamp\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-117\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Possible reasons:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">CronJob is suspended\nSchedule is wrong\nTime zone is wrong\nstartingDeadlineSeconds skipped the run\nController manager issue\nRBAC\/admission issue\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check suspend:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-118\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">kubectl get cronjob <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">cronjob-name<\/span>&gt;<\/span> -o jsonpath='{.spec.suspend}{\"\\n\"}'\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-118\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Resume:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-119\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">kubectl patch cronjob <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">cronjob-name<\/span>&gt;<\/span> -p '{\"spec\":{\"suspend\":false}}'\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-119\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Problem 3: Too many old Jobs<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use history limits:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-120\" data-shcb-language-name=\"HTTP\" data-shcb-language-slug=\"http\"><span><code class=\"hljs language-http\"><span class=\"hljs-attribute\">successfulJobsHistoryLimit<\/span>: 2\n<span class=\"hljs-attribute\">failedJobsHistoryLimit<\/span>: 1\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-120\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTTP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">http<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Or Job TTL:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-121\" data-shcb-language-name=\"HTTP\" data-shcb-language-slug=\"http\"><span><code class=\"hljs language-http\"><span class=\"hljs-attribute\">ttlSecondsAfterFinished<\/span>: 3600\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-121\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTTP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">http<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Kubernetes TTL cleanup applies to Jobs and can delete finished Jobs and their dependent objects after the TTL expires.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Problem 4: CronJob creates overlapping Jobs<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-122\" data-shcb-language-name=\"HTTP\" data-shcb-language-slug=\"http\"><span><code class=\"hljs language-http\"><span class=\"hljs-attribute\">concurrencyPolicy<\/span>: Forbid\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-122\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTTP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">http<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">For backups, cleanup tasks, and reports, <code>Forbid<\/code> is usually safer than <code>Allow<\/code>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Problem 5: CronJob runs in wrong time zone<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-123\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">timeZone: <span class=\"hljs-string\">\"Asia\/Tokyo\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-123\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Do not use:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-124\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">schedule: <span class=\"hljs-string\">\"CRON_TZ=Asia\/Tokyo 0 9 * * *\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-124\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Kubernetes documentation says <code>CRON_TZ<\/code> and <code>TZ<\/code> inside <code>.spec.schedule<\/code> are not officially supported and should not be used; use <code>.spec.timeZone<\/code> instead.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">35. Production Best Practices<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">35.1 Make Jobs idempotent<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A Job might run more than once due to retries, node failures, or controller behavior. Kubernetes documentation explicitly notes that even with <code>parallelism: 1<\/code>, <code>completions: 1<\/code>, and <code>restartPolicy: Never<\/code>, the same program may sometimes be started twice.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Design your task so repeated execution does not corrupt data.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Good patterns:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-125\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">Use<\/span> <span class=\"hljs-title\">unique<\/span> <span class=\"hljs-title\">transaction<\/span> <span class=\"hljs-title\">IDs<\/span>\n<span class=\"hljs-title\">Use<\/span> <span class=\"hljs-title\">locks<\/span> <span class=\"hljs-title\">carefully<\/span>\n<span class=\"hljs-title\">Check<\/span> <span class=\"hljs-title\">whether<\/span> <span class=\"hljs-title\">work<\/span> <span class=\"hljs-title\">is<\/span> <span class=\"hljs-title\">already<\/span> <span class=\"hljs-title\">completed<\/span>\n<span class=\"hljs-title\">Write<\/span> <span class=\"hljs-title\">output<\/span> <span class=\"hljs-title\">atomically<\/span>\n<span class=\"hljs-title\">Use<\/span> <span class=\"hljs-title\">checkpoints<\/span>\n<span class=\"hljs-title\">Use<\/span> <span class=\"hljs-title\">idempotent<\/span> <span class=\"hljs-title\">database<\/span> <span class=\"hljs-title\">operations<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-125\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">35.2 Avoid using <code>latest<\/code> image tag in production<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Bad:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-126\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">image<\/span>: <span class=\"hljs-selector-tag\">myapp<\/span><span class=\"hljs-selector-pseudo\">:latest<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-126\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Better:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-127\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">image<\/span>: <span class=\"hljs-selector-tag\">myapp<\/span><span class=\"hljs-selector-pseudo\">:1.2.3<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-127\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Best:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-128\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">image: myapp@sha256:<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">digest<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-128\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">35.3 Always set resource requests and limits<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-129\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">resources:\n  requests:\n    cpu: <span class=\"hljs-string\">\"100m\"<\/span>\n    <span class=\"hljs-attr\">memory<\/span>: <span class=\"hljs-string\">\"128Mi\"<\/span>\n  <span class=\"hljs-attr\">limits<\/span>:\n    cpu: <span class=\"hljs-string\">\"500m\"<\/span>\n    <span class=\"hljs-attr\">memory<\/span>: <span class=\"hljs-string\">\"512Mi\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-129\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">35.4 Use <code>concurrencyPolicy: Forbid<\/code> for critical CronJobs<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">For backups, financial reports, cleanup tasks, or data processing, overlapping Jobs can create corruption.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Recommended:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-130\" data-shcb-language-name=\"HTTP\" data-shcb-language-slug=\"http\"><span><code class=\"hljs language-http\"><span class=\"hljs-attribute\">concurrencyPolicy<\/span>: Forbid\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-130\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTTP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">http<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">35.5 Use <code>startingDeadlineSeconds<\/code><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This avoids very stale missed runs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-131\" data-shcb-language-name=\"HTTP\" data-shcb-language-slug=\"http\"><span><code class=\"hljs language-http\"><span class=\"hljs-attribute\">startingDeadlineSeconds<\/span>: 1800\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-131\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTTP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">http<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Meaning:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Start only if the missed run is less than 30 minutes late.\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">35.6 Use history limits and TTL<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Recommended CronJob:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-132\" data-shcb-language-name=\"HTTP\" data-shcb-language-slug=\"http\"><span><code class=\"hljs language-http\"><span class=\"hljs-attribute\">successfulJobsHistoryLimit<\/span>: 3\n<span class=\"hljs-attribute\">failedJobsHistoryLimit<\/span>: 3\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-132\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTTP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">http<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Recommended Job template:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-133\" data-shcb-language-name=\"HTTP\" data-shcb-language-slug=\"http\"><span><code class=\"hljs language-http\"><span class=\"hljs-attribute\">ttlSecondsAfterFinished<\/span>: 86400\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-133\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTTP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">http<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">35.7 Do not print secrets in logs<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Bad:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-134\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">echo<\/span> $DB_PASSWORD\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-134\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Good:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-135\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Using DB credentials from Secret\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-135\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">35.8 Use ServiceAccount with least privilege<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-136\" data-shcb-language-name=\"HTTP\" data-shcb-language-slug=\"http\"><span><code class=\"hljs language-http\"><span class=\"hljs-attribute\">serviceAccountName<\/span>: backup-runner\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-136\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTTP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">http<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Give the ServiceAccount only the permissions required by the Job.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">35.9 Use <code>restartPolicy: Never<\/code> for clear failure tracking<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">For most batch jobs:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-137\" data-shcb-language-name=\"HTTP\" data-shcb-language-slug=\"http\"><span><code class=\"hljs language-http\"><span class=\"hljs-attribute\">restartPolicy<\/span>: Never\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-137\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTTP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">http<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This makes retries easier to observe because each retry creates a separate Pod.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">35.10 Add labels<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">metadata:\n  labels:\n    app: reporting\n    workload-type: cronjob\n    owner: platform-team\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">This helps with:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Monitoring\nCost tracking\nLog filtering\nTroubleshooting\nCleanup\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">36. Complete Production-Style CronJob Template<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-138\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">cat &gt; cronjob-production-template.yaml &lt;&lt;<span class=\"hljs-string\">'EOF'<\/span>\napiVersion: batch\/v1\nkind: CronJob\nmetadata:\n  name: production-cronjob\n  labels:\n    app: production-cronjob\n    owner: platform-team\nspec:\n  schedule: <span class=\"hljs-string\">\"0 2 * * *\"<\/span>\n  timeZone: <span class=\"hljs-string\">\"Etc\/UTC\"<\/span>\n  concurrencyPolicy: Forbid\n  startingDeadlineSeconds: <span class=\"hljs-number\">1800<\/span>\n  successfulJobsHistoryLimit: <span class=\"hljs-number\">3<\/span>\n  failedJobsHistoryLimit: <span class=\"hljs-number\">3<\/span>\n  suspend: <span class=\"hljs-keyword\">false<\/span>\n  jobTemplate:\n    metadata:\n      labels:\n        app: production-cronjob\n        workload-type: batch\n    spec:\n      backoffLimit: <span class=\"hljs-number\">2<\/span>\n      activeDeadlineSeconds: <span class=\"hljs-number\">3600<\/span>\n      ttlSecondsAfterFinished: <span class=\"hljs-number\">86400<\/span>\n      template:\n        metadata:\n          labels:\n            app: production-cronjob\n        spec:\n          restartPolicy: Never\n          containers:\n            - name: task\n              image: busybox:<span class=\"hljs-number\">1.36<\/span>\n              imagePullPolicy: IfNotPresent\n              resources:\n                requests:\n                  cpu: <span class=\"hljs-string\">\"100m\"<\/span>\n                  memory: <span class=\"hljs-string\">\"128Mi\"<\/span>\n                limits:\n                  cpu: <span class=\"hljs-string\">\"500m\"<\/span>\n                  memory: <span class=\"hljs-string\">\"512Mi\"<\/span>\n              command:\n                - \/bin\/sh\n                - -c\n                - |\n                  <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Starting production batch task\"<\/span>\n                  date\n                  <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Do real work here\"<\/span>\n                  <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Completed production batch task\"<\/span>\nEOF\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-138\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Apply:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-139\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">kubectl<\/span> <span class=\"hljs-selector-tag\">apply<\/span> <span class=\"hljs-selector-tag\">-f<\/span> <span class=\"hljs-selector-tag\">cronjob-production-template<\/span><span class=\"hljs-selector-class\">.yaml<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-139\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Test manually:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-140\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">kubectl create job production-cronjob-test --<span class=\"hljs-keyword\">from<\/span>=cronjob\/production-cronjob\nkubectl logs job\/production-cronjob-test\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-140\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">37. Complete Production-Style Job Template<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-141\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">cat &gt; job-production-template.yaml &lt;&lt;<span class=\"hljs-string\">'EOF'<\/span>\napiVersion: batch\/v1\nkind: Job\nmetadata:\n  name: production-job\n  labels:\n    app: production-job\n    owner: platform-team\nspec:\n  backoffLimit: <span class=\"hljs-number\">2<\/span>\n  activeDeadlineSeconds: <span class=\"hljs-number\">1800<\/span>\n  ttlSecondsAfterFinished: <span class=\"hljs-number\">3600<\/span>\n  template:\n    metadata:\n      labels:\n        app: production-job\n    spec:\n      restartPolicy: Never\n      containers:\n        - name: task\n          image: busybox:<span class=\"hljs-number\">1.36<\/span>\n          imagePullPolicy: IfNotPresent\n          resources:\n            requests:\n              cpu: <span class=\"hljs-string\">\"100m\"<\/span>\n              memory: <span class=\"hljs-string\">\"128Mi\"<\/span>\n            limits:\n              cpu: <span class=\"hljs-string\">\"500m\"<\/span>\n              memory: <span class=\"hljs-string\">\"512Mi\"<\/span>\n          command:\n            - \/bin\/sh\n            - -c\n            - |\n              <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Starting one-time production job\"<\/span>\n              date\n              <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Do real work here\"<\/span>\n              <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"Completed one-time production job\"<\/span>\nEOF\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-141\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Apply:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-142\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">kubectl<\/span> <span class=\"hljs-selector-tag\">apply<\/span> <span class=\"hljs-selector-tag\">-f<\/span> <span class=\"hljs-selector-tag\">job-production-template<\/span><span class=\"hljs-selector-class\">.yaml<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-142\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Check:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-143\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">kubectl <span class=\"hljs-keyword\">get<\/span> job production-job\nkubectl logs job\/production-job\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-143\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">38. Job and CronJob Commands Cheat Sheet<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Jobs<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-144\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">kubectl get jobs\nkubectl describe job <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">job-name<\/span>&gt;<\/span>\nkubectl get job <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">job-name<\/span>&gt;<\/span> -o yaml\nkubectl delete job <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">job-name<\/span>&gt;<\/span>\nkubectl logs job\/<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">job-name<\/span>&gt;<\/span>\nkubectl get pods -l job-name=<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">job-name<\/span>&gt;<\/span>\nkubectl logs -l job-name=<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">job-name<\/span>&gt;<\/span> --prefix=true\nkubectl create job <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">job-name<\/span>&gt;<\/span> --image=<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">image<\/span>&gt;<\/span> -- <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">command<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-144\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">CronJobs<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-145\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">kubectl get cronjobs\nkubectl describe cronjob <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">cronjob-name<\/span>&gt;<\/span>\nkubectl get cronjob <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">cronjob-name<\/span>&gt;<\/span> -o yaml\nkubectl delete cronjob <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">cronjob-name<\/span>&gt;<\/span>\nkubectl create job <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">manual-job-name<\/span>&gt;<\/span> --from=cronjob\/<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">cronjob-name<\/span>&gt;<\/span>\nkubectl patch cronjob <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">cronjob-name<\/span>&gt;<\/span> -p '{\"spec\":{\"suspend\":true}}'\nkubectl patch cronjob <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">cronjob-name<\/span>&gt;<\/span> -p '{\"spec\":{\"suspend\":false}}'\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-145\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Events<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-146\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">kubectl <span class=\"hljs-keyword\">get<\/span> events --sort-by=.lastTimestamp\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-146\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Watch<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-147\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">kubectl <span class=\"hljs-keyword\">get<\/span> cronjobs,jobs,pods -w\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-147\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">39. OpenShift <code>oc<\/code> Cheat Sheet<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Everything works similarly with <code>oc<\/code>.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-148\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">oc get jobs\noc describe job <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">job-name<\/span>&gt;<\/span>\noc logs job\/<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">job-name<\/span>&gt;<\/span>\noc get cronjobs\noc describe cronjob <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">cronjob-name<\/span>&gt;<\/span>\noc create job manual-run --from=cronjob\/<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">cronjob-name<\/span>&gt;<\/span>\noc patch cronjob <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">cronjob-name<\/span>&gt;<\/span> -p '{\"spec\":{\"suspend\":true}}'\noc patch cronjob <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">cronjob-name<\/span>&gt;<\/span> -p '{\"spec\":{\"suspend\":false}}'\noc get events --sort-by=.lastTimestamp\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-148\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Create project:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-149\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">new<\/span>-project jobs-demo\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-149\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Apply YAML:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-150\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">oc<\/span> <span class=\"hljs-selector-tag\">apply<\/span> <span class=\"hljs-selector-tag\">-f<\/span> <span class=\"hljs-selector-tag\">job-hello<\/span><span class=\"hljs-selector-class\">.yaml<\/span>\n<span class=\"hljs-selector-tag\">oc<\/span> <span class=\"hljs-selector-tag\">apply<\/span> <span class=\"hljs-selector-tag\">-f<\/span> <span class=\"hljs-selector-tag\">cronjob-hello<\/span><span class=\"hljs-selector-class\">.yaml<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-150\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">40. Cleanup All Tutorial Resources<\/h1>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-151\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">kubectl <span class=\"hljs-keyword\">delete<\/span> namespace jobs-demo\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-151\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">For OpenShift:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-152\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">oc <span class=\"hljs-keyword\">delete<\/span> project jobs-demo\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-152\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Or delete individual resources:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-153\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">kubectl <span class=\"hljs-keyword\">delete<\/span> job --all\nkubectl <span class=\"hljs-keyword\">delete<\/span> cronjob --all\nkubectl <span class=\"hljs-keyword\">delete<\/span> secret db-backup-secret\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-153\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">41. Final Summary<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Kubernetes Jobs and CronJobs are essential for running batch workloads.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Use a <strong>Job<\/strong> when:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">You need to run a task once.\nYou need a migration.\nYou need a one-time cleanup.\nYou need batch processing.\nYou need parallel workers.\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Use a <strong>CronJob<\/strong> when:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">You need scheduled execution.\nYou need periodic backups.\nYou need daily reports.\nYou need weekly cleanup.\nYou need recurring sync tasks.\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The simplest Job:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-154\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">apiVersion: batch\/v1\n<span class=\"hljs-attr\">kind<\/span>: Job\n<span class=\"hljs-attr\">metadata<\/span>:\n  name: hello-job\n<span class=\"hljs-attr\">spec<\/span>:\n  template:\n    spec:\n      restartPolicy: Never\n      <span class=\"hljs-attr\">containers<\/span>:\n        - name: hello\n          <span class=\"hljs-attr\">image<\/span>: busybox:<span class=\"hljs-number\">1.36<\/span>\n          <span class=\"hljs-attr\">command<\/span>: &#91;<span class=\"hljs-string\">\"\/bin\/sh\"<\/span>, <span class=\"hljs-string\">\"-c\"<\/span>, <span class=\"hljs-string\">\"echo Hello from Job\"<\/span>]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-154\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The simplest CronJob:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-155\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">apiVersion: batch\/v1\n<span class=\"hljs-attr\">kind<\/span>: CronJob\n<span class=\"hljs-attr\">metadata<\/span>:\n  name: hello-cronjob\n<span class=\"hljs-attr\">spec<\/span>:\n  schedule: <span class=\"hljs-string\">\"* * * * *\"<\/span>\n  <span class=\"hljs-attr\">jobTemplate<\/span>:\n    spec:\n      template:\n        spec:\n          restartPolicy: OnFailure\n          <span class=\"hljs-attr\">containers<\/span>:\n            - name: hello\n              <span class=\"hljs-attr\">image<\/span>: busybox:<span class=\"hljs-number\">1.36<\/span>\n              <span class=\"hljs-attr\">command<\/span>: &#91;<span class=\"hljs-string\">\"\/bin\/sh\"<\/span>, <span class=\"hljs-string\">\"-c\"<\/span>, <span class=\"hljs-string\">\"date; echo Hello from CronJob\"<\/span>]\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-155\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The most important production lesson:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Jobs and CronJobs must be idempotent, observable, resource-limited, retry-controlled, and cleaned up automatically.\n<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The golden rule:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Deployment runs forever.\nJob runs once.\nCronJob runs Jobs on a schedule.\n<\/code><\/span><\/pre>","protected":false},"excerpt":{"rendered":"<p>Kubernetes Jobs and CronJobs Explained with Examples: Complete Hands-on Guide for DevOps Engineer Keywords 1. Introduction In Kubernetes, not every workload is a long-running application like a&#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[4859,25688],"tags":[],"class_list":["post-20595","post","type-post","status-publish","format-standard","hentry","category-kubernetes","category-kubernetes-api-resources"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/20595","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=20595"}],"version-history":[{"count":6,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/20595\/revisions"}],"predecessor-version":[{"id":77371,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/20595\/revisions\/77371"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=20595"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=20595"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=20595"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}