전공공부
Jobs & Cronjob 본문
우선 Job을 현실 세계에서 이해하려면, pod가 보고서를 만들고 그것을 job이 이메일을 보내 주는 행위를 상상해보자
실제로는 batch job을 많이 사용한다.
RestartPolicy
K8S의 RestartPolicy는 기본적으로 Always이다. 그래서, 내부 컨테이너의 명령어가 실행 되어지는 명령어가 필요하다면 매번 Pod Restart하면서 명령어를 재시작한다.
이를 막기 위해서 아래와 같이 설정 할 수 잇다.
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
lables:
app: app1
function: Front-end
spec:
containers:
- name: math-add
image: ubuntu
command: ['expr', '3','+','2']
restartPolicy: Never
Kubernetes Job
ReplicaSet이 사용되어 특정 Pod를 실행하고 Jobs은 Pod의 작업을 정의 할 수 있습니다.
pod-definition.yaml
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
lables:
app: app1
function: Front-end
spec:
containers:
- name: math-add
image: ubuntu
command: ['expr', '3','+','2']
restartPolicy: Never
job-definition.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: math-add-job
spec:
template:
spec: #위의 Pod 내용의 Spec을 그대로 template 하부로 가져온다.
containers:
- name: math-add
image: ubuntu
command: ['expr', '3','+','2']
restartPolicy: Never
이와 같이 실행하면 job 기반으로 pod가 생성이 되어집니다.
kubectl create -f job-definition.yaml # 잡 생성
kubectl get job # job 확인 가능
kubectl get pod #job 기반으로 만들어진 pod 확인 가능
kubectl logs <job-created-pod-name> #expr 3+2의 답인 5를 출력함
kubectl delete job <job-name> # job 삭제 가능, pod도 같이 삭제 됨
Multiple Pods with Job
job-definition.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: math-add-job
spec:
completions: 3 #multiple pod 3개를 만듦
template:
spec: #위의 Pod 내용의 Spec을 그대로 template 하부로 가져온다.
containers:
- name: math-add
image: ubuntu
command: ['expr', '3','+','2']
restartPolicy: Never
하지만 위와 같이 생성 시 하나 하나 씩 Pod가 만들어져서 병렬적으로 행동하지 못합니다.
따라서, 특정 Pod 갯수 만큼은 최소한 병렬적으로 만들 수 있게 지정하려면
apiVersion: batch/v1
kind: Job
metadata:
name: math-add-job
spec:
completions: 3 #multiple pod 3개를 만듦
perallelism: 3
template:
spec: #위의 Pod 내용의 Spec을 그대로 template 하부로 가져온다.
containers:
- name: math-add
image: ubuntu
command: ['expr', '3','+','2']
restartPolicy: Never
이러면 한 번의 3개의 Pod를 생성한다.
CronJobs
cronjob > job > pod
크론잡은 리눅스 크론잡과 같은 기능을 한다. 특정 시간에 특정 행위를 하게 끔 하는 것
cron-job-definition.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: reporting-cron-job
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec: #job-definition.yaml의 spec을 그대로 가져온다.
completions: 3
parallelism: 3
template:
spec: #pod-definition.yaml의 spec을 그대로 가져온다.
containers:
- name: math-add
image: ubuntu
command: ['expr', '3','+','2']
restartPolicy: Never
문제상황
dice 라는 cronjob을 1분 마다 돌아가게 만들어라, pod templete은 /root/throw-a-dice의 throw-dice image를 가져와서써랑 그리고, 이 job은 non-parallel 방식으로 task를 종료하여야 하며 backoffLimit은 25번만 가능하다. 그리고, 20초 안에 job이 끝나지 않으면 job은 실패하고 pod는 종료되어야 한다.
apiVersion: batch/v1
kind: CronJob
metadata:
name: dice
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
backoffLimit: 25 #backOffLimit
activeDeadlineSeconds: 20 #20초가 지나면 끝난다.
template:
spec:
containers:
- image: kodekloud/throw-dice
name: throw-dice
restartPolicy: OnFailure
위 코드에서 지정되지 않은 것은 비병렬 방식의 명시화인데 비 병렬 방식은 우선 기본 모드라서
.spec.completions , .spec.parallelism 을 각각 1로 설정하여도 되고 아예 위 코드처럼 설정을 하지 않아도 비 병렬 방식이다.
'Study > K8S' 카테고리의 다른 글
Ingress (0) | 2023.04.02 |
---|---|
Services (0) | 2023.04.01 |
Rollout Update (0) | 2023.03.27 |
Labels, Selectors (0) | 2023.03.27 |
Logging (0) | 2023.03.26 |