-
[K8s] 크론잡 기본활용_Cronjob쿠버네티스 2024. 7. 15. 20:03
🙌 개요
현 서비스 중 리눅스의 Crontab을 사용하고 있는 어플리케이션을 쿠버네티스 환경으로 전환하기쿠버네티스에 대한 전반적인 지식은 공식 Document와 "컨테이너 인프라 환경 구축을 위한 쿠버네티스/도커" 도서에서 공부하였습니다.
구성환경
서버 : Local (Minikube)참고 : https://minikube.sigs.k8s.io/docs/start/?arch=%2Fmacos%2Fx86-64%2Fstable%2Fbinary+download
minikube start
minikube is local Kubernetes, focusing on making it easy to learn and develop for Kubernetes. All you need is Docker (or similarly compatible) container or a Virtual Machine environment, and Kubernetes is a single command away: minikube start What you’ll
minikube.sigs.k8s.io
➡️ kubectl 업그레이드 필요
기본개념

Cronjob 실행 과정 (출처 : 무신사 테크) 
Cronjob workflow, Deployment와 비교 (출처 : 무신사 테크) Cronjob Manifest 파일 구조
# -------------------------------- Cronjob 부분 apiVersion : batch/v1 kind: Cronjob # 유형 지정 metadata: # ... spec: schedule: "*/1 * * * *" #1분마다 실행 # ... # --------------------------- Job 부분 jobTemplate: # ... # ----------------------- Pod 부분 template: metadata: # ... containers: - name: image: <docker image>
Test
사용파일 : System.out.println("Hello Docker!"); 여러개로 구성된 간단한 Java 어플리케이션
1. DockerFile 작성
FROM maven:3.6.3-jdk-8-slim AS build COPY ../.. /root/sources WORKDIR /root/sources RUN mvn package FROM openjdk:8-jdk-alpine RUN mkdir /app COPY --from=build /root/sources/target/dockerTest-1.0-SNAPSHOT.jar /app/dockerTest.jar # ----2-3. JAR 파일 실행 CMD ["java", "-jar", "/app/dockerTest.jar"]2. docker-compose 작성
version: '3' services: bpe-test: image: baektothefuture98/test:0.0.1 build: context: . dockerfile: ./Dockerfile ports: - "80:8080"3. pom.xml 설정
➡️ maven project를 docker 이미지로 묶는 과정에서 오류 발생-해결 : shade dependency plugin 적용
<!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-shade-plugin --> <dependency> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.6.0</version> </dependency> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.6.0</version> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass> 실행할 main 클래스 위치 지정(Source 파일 기준) </mainClass> </transformer> </transformers> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> </execution> </executions> </plugin> </plugins> </build>4. docker hub에 올리기 (혹은 Harbor)
docker-compose build ➡️ docker-compose up (local에 올리기) ➡️ docker-compose push (docker hub에 배포)
5. Cronjob YAML 파일 작성하여 배포
Cronjob.yaml
apiVersion: batch/v1 kind: CronJob metadata: name: bpe-test namespace: default spec: schedule: "*/1 * * * *" concurrencyPolicy: Forbid successfulJobsHistoryLimit: 3 failedJobsHistoryLimit: 3 jobTemplate: spec: ttlSecondsAfterFinished: 30 backoffLimit: 0 template: spec: containers: - name: bpe-test image: <도커 허브 아이디 : baektothefuture98>/test:0.0.1 restartPolicy: NeverCronjob YAML 파헤치기
metadata.namespace : 쿠버네티스 클러스터내의 논리적 분리 단위
→ 이름으로 구분하며 namespace.yaml 파일에서 명시가 되어있어야 사용 가능
spec.schedule : 시간 설정spec.concurrencyPolicy
- Allow : old Job, new Job 병렬처리 가능
- Replace : 새로운 Job이 발생 시 이전 Job 종료
- Forbid : 이전 Job이 완료되지 않았다면 새로운 Job 건너뛰기
spec.successfulJobsHistoryLimit : 성공한 Job 기록을 N개 남기기
spec.failedJobsHistoryLimit : 실패한 Job 기록을 N개 남기기
JOB
ttlSecondAfterFinished : 완료된 Job 자동 정리
→ 완료된 Job은 자동으로 사라지지 않기 때문에 리소스를 차지하므로 정리 필요
backoffLimit : 재시도 횟수
→ 몇 회의 재시도 이후에 잡이 실패되도록 만들어야 하는 경우
https://kubernetes.io/ko/docs/concepts/workloads/controllers/job/#파드-백오프-backoff-실패-정책
Pod
container.image : 도커 이미지 지정
restartPolicy :
Always : 항상 재시작
OnFailure : 비정상 종료 시 재시작
Never : 컨테이너를 재시작 하지 않음
매우매우 간단한 파일로 docker image, docker-compose를 구성하여 크론잡을 구성해 보았습니다.
저처럼 쿠버네티스에 대한 지식이 부족한 분들에게 조금이나마 도움이 되길 바랍니다,,,!
'쿠버네티스' 카테고리의 다른 글
Kafka + HPA 테스트 (3) 2024.08.04