Kubernetes Job

jaeyeon ha·2026년 3월 7일

[교육] Kubernetes

목록 보기
21/34

작업 스케줄러

날짜와 시간을 예약해놓고 특정 시간에 작업이 진행되도록 설정

  • at : 절대적인 날짜와 시간을 정해놓고 작업 동작시킴
    e.g) 2025년 3월 25일 대규모 업데이트
  • cron : 주기적인 스케줄을 정해놓고 작업 동작시킴
    e.g) 매주 목요일 새별 01시에 정기 점검

Jobs

linux의 at과 유사

[root@master ~/kube/07/job]# kubectl api-resources | grep job
cronjobs                          cj           batch/v1                               true         CronJob
jobs                                           batch/v1                               true         Job
[root@master ~/kube/07/job]# vi job-test.yaml
[root@master ~/kube/07/job]# cat job-test.yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: job-test
spec:
  template:
    spec:
      containers:
      - name: centos-container
        image: centos:7
        command: ["bash"]
        args:
        - "-c"
        - "echo 'Hello Kubernetes'; sleep 60; ls -l /tmp ; echo 'Bye Kubernetes'"
      restartPolicy: Never

▶ 단발적으로 해당 명령을 수행하는 Job으로 작업 완료 후 종료됨

[root@master ~/kube/07/job]# kubectl get pod -o wide
NAME             READY   STATUS    RESTARTS   AGE   IP             NODE    NOMINATED NODE   READINESS GATES
job-test-6x5l7   1/1     Running   0          26s   10.233.75.43   node2   <none>           <none>
[root@master ~/kube/07/job]# kubectl describe pod job-test-6x5l7
	···
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  32s   default-scheduler  Successfully assigned default/job-test-6x5l7 to node2
  Normal  Pulling    31s   kubelet            Pulling image "centos:7"
  Normal  Pulled     18s   kubelet            Successfully pulled image "centos:7" in 12.734789704s (12.734795997s including waiting)
  Normal  Created    18s   kubelet            Created container centos-container
  Normal  Started    18s   kubelet            Started container centos-container
[root@master ~/kube/07/job]# kubectl get pod
NAME             READY   STATUS      RESTARTS   AGE
job-test-6x5l7   0/1     Completed   0          89s
[root@master ~/kube/07/job]# kubectl logs job-test-6x5l7
Hello Kubernetes
total 4
-rwx------. 1 root root 836 Nov 13  2020 ks-script-DrRL8A
-rw-------. 1 root root   0 Nov 13  2020 yum.log
Bye Kubernetes

▶ 작업 수행 후 Completed 확인

CronJobs

linux의 cron 과 유사 : 주기적인 배치 작업 시 사용

  • 스케줄 설정
```
분	시	일	월	요일
*   *   *   *    *
```

CronJob TEST

[root@master ~/kube/07/cronjob]# vi cronjob-test.yaml
[root@master ~/kube/07/cronjob]# cat cronjob-test.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
  name: cronjob-test
spec:
  schedule: "* * * * *"
  startingDeadlineSeconds: 500
  concurrencyPolicy: Forbid
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - echo Hello Kubernetes; sleep 10; ls -l /tmp ; echo Bye Kubernetes
          restartPolicy: Never
[root@master ~/kube/07/cronjob]# kubectl apply -f cronjob-test.yaml
cronjob.batch/cronjob-test created
[root@master ~/kube/07/cronjob]# kubectl get pod
NAME                          READY   STATUS      RESTARTS   AGE
cronjob-test-29024977-cvr75   0/1     Completed   0          25s
[root@master ~/kube/07/cronjob]# watch kubectl get pod
Every 2.0s: kubectl get pod                                                                     master: Sun Mar  9 14:37:51 2025

NAME                          READY   STATUS      RESTARTS   AGE
cronjob-test-29024977-cvr75   0/1     Completed   0          51s
-----
Every 2.0s: kubectl get pod                                                                     master: Sun Mar  9 14:38:00 2025

NAME                          READY   STATUS              RESTARTS   AGE
cronjob-test-29024977-cvr75   0/1     Completed           0          60s
cronjob-test-29024978-m655m   0/1     ContainerCreating   0          0s

▶ 1분마다 동일한 동작하는 것 확인 가능

[root@master ~/kube/07/cronjob]# kubectl describe pod cronjob-test-2902497
Name:             cronjob-test-29024977-cvr75
Namespace:        default
Priority:         0
Service Account:  default
Node:             node2/192.168.2.62
Start Time:       Sun, 09 Mar 2025 14:37:00 +0900
Labels:           batch.kubernetes.io/controller-uid=dd160fd8-269a-45e6-8690-ed0eb1a65461
                  batch.kubernetes.io/job-name=cronjob-test-29024977
                  controller-uid=dd160fd8-269a-45e6-8690-ed0eb1a65461
                  job-name=cronjob-test-29024977
Annotations:      cni.projectcalico.org/containerID: 921f668aa9139cdae2010117e1375938448ab7f1325e44303e004168c8e0e2cf
                  cni.projectcalico.org/podIP:
                  cni.projectcalico.org/podIPs:
Status:           Succeeded
IP:               10.233.75.44
IPs:
  IP:           10.233.75.44
Controlled By:  Job/cronjob-test-29024977
Containers:
  hello:
    Container ID:  docker://ac343f1300db61e7f29dd0a1da41bac71331f4b2b3ecefe73aa0d0fb1ec916f4
    Image:         busybox
    Image ID:      docker-pullable://busybox@sha256:498a000f370d8c37927118ed80afe8adc38d1edcbfc071627d17b25c88efcab0
    Port:          <none>
    Host Port:     <none>
    Args:
      /bin/sh
      -c
      echo Hello Kubernetes; sleep 10; ls -l /tmp ; echo Bye Kubernetes
    State:          Terminated
      Reason:       Completed
      Exit Code:    0
      Started:      Sun, 09 Mar 2025 14:37:05 +0900
      Finished:     Sun, 09 Mar 2025 14:37:15 +0900
    Ready:          False
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-pp8js (ro)
Conditions:
  Type              Status
  Initialized       True
  Ready             False
  ContainersReady   False
  PodScheduled      True
Volumes:
  kube-api-access-pp8js:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       <nil>
    DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type    Reason     Age    From               Message
  ----    ------     ----   ----               -------
  Normal  Scheduled  2m24s  default-scheduler  Successfully assigned default/cronjob-test-29024977-cvr75 to node2
  Normal  Pulling    2m24s  kubelet            Pulling image "busybox"
  Normal  Pulled     2m19s  kubelet            Successfully pulled image "busybox" in 4.828453784s (4.828459738s including waiting)
  Normal  Created    2m19s  kubelet            Created container hello
  Normal  Started    2m19s  kubelet            Started container hello

Name:             cronjob-test-29024978-m655m
Namespace:        default
Priority:         0
Service Account:  default
Node:             node2/192.168.2.62
Start Time:       Sun, 09 Mar 2025 14:38:00 +0900
Labels:           batch.kubernetes.io/controller-uid=00ac7e26-1ca0-4975-8c3c-4279a529ddff
                  batch.kubernetes.io/job-name=cronjob-test-29024978
                  controller-uid=00ac7e26-1ca0-4975-8c3c-4279a529ddff
                  job-name=cronjob-test-29024978
Annotations:      cni.projectcalico.org/containerID: 40cadc45e4bcfd3585c54a520f7e7adfb1c85569f695b2bff8892a6885c24159
                  cni.projectcalico.org/podIP:
                  cni.projectcalico.org/podIPs:
Status:           Succeeded
IP:               10.233.75.45
IPs:
  IP:           10.233.75.45
Controlled By:  Job/cronjob-test-29024978
Containers:
  hello:
    Container ID:  docker://8ed662cc452d47d492d92f745b1b553e38808cf98ab63be6674e853d28652fb7
    Image:         busybox
    Image ID:      docker-pullable://busybox@sha256:498a000f370d8c37927118ed80afe8adc38d1edcbfc071627d17b25c88efcab0
    Port:          <none>
    Host Port:     <none>
    Args:
      /bin/sh
      -c
      echo Hello Kubernetes; sleep 10; ls -l /tmp ; echo Bye Kubernetes
    State:          Terminated
      Reason:       Completed
      Exit Code:    0
      Started:      Sun, 09 Mar 2025 14:38:03 +0900
      Finished:     Sun, 09 Mar 2025 14:38:13 +0900
    Ready:          False
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-w2h2x (ro)
Conditions:
  Type              Status
  Initialized       True
  Ready             False
  ContainersReady   False
  PodScheduled      True
Volumes:
  kube-api-access-w2h2x:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       <nil>
    DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  84s   default-scheduler  Successfully assigned default/cronjob-test-29024978-m655m to node2
  Normal  Pulling    84s   kubelet            Pulling image "busybox"
  Normal  Pulled     81s   kubelet            Successfully pulled image "busybox" in 2.267980539s (2.268003359s including waiting)
  Normal  Created    81s   kubelet            Created container hello
  Normal  Started    81s   kubelet            Started container hello

Name:             cronjob-test-29024979-254qk
Namespace:        default
Priority:         0
Service Account:  default
Node:             node2/192.168.2.62
Start Time:       Sun, 09 Mar 2025 14:39:00 +0900
Labels:           batch.kubernetes.io/controller-uid=6f909872-c3e3-4ee8-a669-ef4ac8ca4554
                  batch.kubernetes.io/job-name=cronjob-test-29024979
                  controller-uid=6f909872-c3e3-4ee8-a669-ef4ac8ca4554
                  job-name=cronjob-test-29024979
Annotations:      cni.projectcalico.org/containerID: 2910cccf9b0d9284bb80942651a2e6ba3ad9e7436df181f2da5251443dc8807e
                  cni.projectcalico.org/podIP:
                  cni.projectcalico.org/podIPs:
Status:           Succeeded
IP:               10.233.75.46
IPs:
  IP:           10.233.75.46
Controlled By:  Job/cronjob-test-29024979
Containers:
  hello:
    Container ID:  docker://db1b56dbc98c03369d9e4e6a7ec216a01865732c1ae19cab368f094d1e6ec82a
    Image:         busybox
    Image ID:      docker-pullable://busybox@sha256:498a000f370d8c37927118ed80afe8adc38d1edcbfc071627d17b25c88efcab0
    Port:          <none>
    Host Port:     <none>
    Args:
      /bin/sh
      -c
      echo Hello Kubernetes; sleep 10; ls -l /tmp ; echo Bye Kubernetes
    State:          Terminated
      Reason:       Completed
      Exit Code:    0
      Started:      Sun, 09 Mar 2025 14:39:03 +0900
      Finished:     Sun, 09 Mar 2025 14:39:13 +0900
    Ready:          False
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-sjllb (ro)
Conditions:
  Type              Status
  Initialized       True
  Ready             False
  ContainersReady   False
  PodScheduled      True
Volumes:
  kube-api-access-sjllb:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       <nil>
    DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  24s   default-scheduler  Successfully assigned default/cronjob-test-29024979-254qk to node2
  Normal  Pulling    24s   kubelet            Pulling image "busybox"
  Normal  Pulled     21s   kubelet            Successfully pulled image "busybox" in 2.312353967s (2.312360599s including waiting)
  Normal  Created    21s   kubelet            Created container hello
  Normal  Started    21s   kubelet            Started container hello
[root@master ~/kube/07/cronjob]# kubectl get pod
NAME                          READY   STATUS      RESTARTS   AGE
cronjob-test-29024978-m655m   0/1     Completed   0          2m17s
cronjob-test-29024979-254qk   0/1     Completed   0          77s
cronjob-test-29024980-dhlw2   0/1     Completed   0          17s

참고

Kubernetes YAML Generator ▶ yaml 파일 생성해주는 사이트

0개의 댓글