날짜와 시간을 예약해놓고 특정 시간에 작업이 진행되도록 설정
- at : 절대적인 날짜와 시간을 정해놓고 작업 동작시킴
e.g) 2025년 3월 25일 대규모 업데이트- cron : 주기적인 스케줄을 정해놓고 작업 동작시킴
e.g) 매주 목요일 새별 01시에 정기 점검
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 확인
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 파일 생성해주는 사이트