ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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: Never

    Cronjob 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
Designed by Tistory.