[K8S] Kubernetes Job에 대한 실행/관리를 도와주는 Furiko 간단 사용기

NewNewDaddy·2024년 3월 20일
0

DOCKER-KUBERNETES

목록 보기
8/10
post-thumbnail

0. INTRO

  • Kubernetes에서 특정 스크립트나 코드를 Pod 단위로 실행시키고 싶을 때 Job 혹은 CronJob 리소스를 사용한다.
  • Job은 한 번만 실행되고 완료되는 일회성 작업을 정의하는 리소스 유형으로 성공적으로 완료되면 Pod가 Completed 상태로 바뀌면서 종료된다.
  • Furiko는 Job 리소스를 조금 더 커스텀하게 잘 관리할 수 있도록 도와주는 Tool로 이번 글에서는 Furiko를 설치하고 사용해본 느낌을 간단히 적어볼까한다.

1. Furiko Install

  • 공식문서인 Furiko Docs를 참고하면 설치부터 샘플 작업 실행까지 어렵지 않게 설정해나갈 수 있다.

1. 리소스 배포

kubectl apply -f https://github.com/furiko-io/furiko/releases/latest/download/furiko-execution.yaml
> kubectl -n furiko-system get all

    NAME                                        READY   STATUS      RESTARTS   AGE
    pod/execution-controller-6d78b46c6c-67j5s   2/2     Running     0          101m
    pod/execution-webhook-6f66d5f75c-5bjwz      2/2     Running     0          101m
    pod/execution-webhook-certgen-4pnz5         0/2     Completed   0          9s

    NAME                                        TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
    service/execution-webhook-metrics-service   ClusterIP   10.96.240.36   <none>        8443/TCP   101m
    service/execution-webhook-service           ClusterIP   10.96.83.234   <none>        443/TCP    101m

    NAME                                   READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/execution-controller   1/1     1            1           101m
    deployment.apps/execution-webhook      1/1     1            1           101m

    NAME                                              DESIRED   CURRENT   READY   AGE
    replicaset.apps/execution-controller-6d78b46c6c   1         1         1       101m
    replicaset.apps/execution-webhook-6f66d5f75c      1         1         1       101m

    NAME                                  COMPLETIONS   DURATION   AGE
    job.batch/execution-webhook-certgen   1/1           2s         9s

2. CLI tool 설치

  • 현재 OS가 Ubuntu 22.04 버전이 아니라면 Furiko 최신 버전(v0.2.1)을 설치했을 때 에러가 날 수 있으므로 하나 이전 버전인 v0.2.0을 설치해주도록 한다.
wget https://github.com/furiko-io/furiko/releases/download/v0.2.0/furiko_linux_amd64
sudo mv furiko_linux_amd64 /usr/local/bin/furiko
sudo chmod +x /usr/local/bin/furiko

3. CLI Download Check

> furiko --help

    Command-line utility to manage Furiko.

    Usage:
      furiko [command]

    Available Commands:
      completion  generate the autocompletion script for the specified shell
      disable     Disable automatic scheduling for a JobConfig.
      enable      Enable automatic scheduling for a JobConfig.
      get         Get one or more resources by name.
      help        Help about any command
      kill        Kill an ongoing Job.
      list        List all resources by kind.
      run         Run a new Job.

    Flags:
          --dynamic-config-name string        Overrides the name of the dynamic cluster config. (default "execution-dynamic-config")
          --dynamic-config-namespace string   Overrides the namespace of the dynamic cluster config. (default "furiko-system")
      -h, --help                              help for furiko
          --kubeconfig string                 Path to the kubeconfig file to use for CLI requests.
      -n, --namespace string                  If present, the namespace scope for this CLI request.
      -v, --v int                             Sets the log level verbosity.

    Use "furiko [command] --help" for more information about a command.

2. Sample Job

  • CLI까지 설치가 완료되었으면 Furiko를 이용해 샘플 작업을 실행해본다.(Docs for Sample Job)
  • Furiko는 자체적으로 만든 JobConfigJob 이렇게 두 개의 리소스가 존재한다. JobConfig를 통해 실행할 Job에 대한 Plan이 먼저 배포가 되어야 이후에 Job을 실행할 수 있는 구조로 되어있다.
  • JobConfig가 배포된 이후에는 해당 Plan을 기반으로 Job 리소스를 따로 실행하여 작업을 할 수도 있지만 JobConfig에서도 정의된 Job에 대해 실행을 시킬 수 있으므로 사실상 JobConfig 리소스 하나만으로도 필요한 커스텀이 대부분 가능하다.

1. JobConfig 리소스 구조

sample-job.yaml

apiVersion: execution.furiko.io/v1alpha1
kind: JobConfig
metadata:
  name: [작업명]
spec:
  # 실행될 작업에 대한 스케쥴 설정
  schedule:
    cron:
      expression: "*/5 * * * *"
    disabled: true

  # Prevents multiple executions of the same JobConfig.
  concurrency:
    policy: Forbid

  # 작업에 대한 정의
  template:
    spec:
      taskTemplate:
        pod:
          spec:
            containers:
              - name: container
                image: alpine
                command:
                  - echo
                  - "Hello World"

2. JobConfig 배포 및 작업 실행

  • kubectl apply를 통해 위의 리소스를 배포한 후 furiko run 명령어를 통해 정의된 작업을 실행한다.
1. JobConfig 리소스 배포  >>  kubectl apply -f sample-job.yaml

2. 정의된 작업 실행  >>  furiko run [작업명]

3. 작업 스케쥴링 실행

  • spec.schedule.disabled가 true로 되어 있으면 정의한 작업 스케쥴링이 적용되지 않은 상태이므로 아래 명령어를 통해 스케쥴링을 enable 시켜준다.
> furiko enable [작업명]

4. 실행 작업 리스트 보기

  • 배포된 JobConfig를 통해 실행된 Job의 내역을 볼 수 있다.
> furiko list job --for=[작업명]

    NAME                  PHASE       START TIME   RUN TIME   FINISH TIME
    test-pipeline-gjqp9   Succeeded   29m                     29m        
    test-pipeline-qg8nq   Succeeded   26m                     26m        
    test-pipeline-rmcx9   Succeeded   27m                     27m        
    test-pipeline-s9tc9   Succeeded   2m                      2m         
    test-pipeline-wp8gl   Failed      30m                     30m   

5. 특정 시간에 작업되도록 설정

  • cli 명령을 통해 JobConfig 작업에 대해 특정 시간에 작업이 일어나도록 설정할 수 있다.
# 2024-03-31 14시에 해당 작업이 실행될 수 있도록 설정한 것이다.

> furiko run [작업명] --at 2024-03-31T14:00:00Z

3. Custom Job

  • 공식문서를 참고하면 Adhoc Execution, 병렬실행, 재시작, Option 설정 등 Job에 대한 다양한 설정들이 가능하다.
  • 그 중에서 병렬실행 내용을 적용하여 JobConfig에서 계획된 Job이 실행될 때 병렬로 실행될 수 있도록 설정해볼 것이다.
  • Furiko에서 지원하는 병렬실행 옵션은 withCount, withKeys, withMatrix 이렇게 세가지이다.
    1. withCount : 병렬로 실행할 작업의 수를 전달한다.
      spec:
        parallelism:
          withCount: 3
    2. withKeys : Key List를 전달하여 병렬 작업에 해당하는 Key를 지정한다. (Key의 수만큼 작업이 실행됨)
      spec:
        parallelism:
          withKeys:
            - golang
            - python
            - nodejs
    3. withMatrix : 각 행렬 조합이 각 병렬 작업에 해당하도록 키-값 쌍의 행렬을 지정한다. 아래와 같은 조합일 경우 3x2로 총 6개의 Job이 실행된다.
      spec:
        parallelism:
          withMatrix:
            goos:
              - linux
              - ubuntu
              - darwin
            goarch:
              - amd64
              - arm64
  • 아래는 withKeys 병렬 옵션 및 env, volume mount 인자들이 추가된 JobConfig 포맷이다.

custom-jobconfig.yaml

apiVersion: execution.furiko.io/v1alpha1
kind: JobConfig
metadata:
  name: custom-jobconfig
  namespace: [namespace 이름]
spec:
  # Job에 대한 스케쥴 설정
  schedule:
    cron:
      expression: "*/5 * * * *"
      timezone: Asia/Seoul
    disabled: true
    # 특정 시간 이전, 이후에는 작동하지 않도록 스케쥴링 제약 설정
    constraints:
      notBefore: "2022-01-01T00:00:00-03:00"
      notAfter: "2023-01-01T00:00:00-03:00"

  # 동일한 JobConfig가 여러 번 실행되는 것을 방지
  concurrency:
    policy: Forbid

  # 실행될 Job에 대한 정의
  template:
    spec:
      # 병렬 작업 설정
      parallelism:
        # APPLE과 BANANA에 대한 Job이 각각 하나씩 생성된다.
        withKeys:
          - APPLE
          - BANANA
        completionStrategy: AllSuccessful
      taskTemplate:
        pod:
          spec:
            containers:
              - name: sample-job
                image: alpine
                command: ["printenv"]
                # Container 내부로 전달할 환경변수 설정
                env:
                  - name: KEY_NAME
                    value: ${task.index_key}
                # Container 내부 볼륨 마운트 설정
                volumeMounts:
                  - mountPath: /mnt
                    name: [Volume 이름]
            restartPolicy: Never
            # 내부 볼륨과 매칭될 외부 볼륨 설정
            volumes:
              - name: [Volume 이름]
                persistentVolumeClaim:
                  claimName: [Volume에 대한 PVC 이름]
  • JobConfig 배포 및 작업 시작

    ## 배포
    > kubectl apply -f custom-jobconfig.yaml
    
    	jobconfig.execution.furiko.io/test-jobconfig created
      
    ## 확인
    > kubectl get jobconfig
    
        NAME              AGE   STATE          ACTIVE   QUEUED   CRON SCHEDULE   TIMEZONE     LAST SCHEDULE TIME
        custom-jobconfig  48s   ReadyDisabled  0        0        */1 * * * *     Asia/Seoul
      
    
    ## Job 시작
    > furiko run custom-jobconfig
    
    	Job spark/custom-jobconfig-mmnfs created
    
    ## Job 조회
    > kubectl get pod
    
      NAME                            READY   STATUS      RESTARTS   AGE
      custom-jobconfig-mmnfs-ge2tan-0   0/1     Completed   0          18s
      custom-jobconfig-mmnfs-haydmm-0   0/1     Completed   0          18s

4. OUTRO

  • 조금은 생소한 툴인 Furiko를 사용해보았다. 현재 하려는 Job에 대해서는 그다지 많은 커스텀 작업이 필요하지 않아 병렬처리 정도만 적용하여 사용해보았는데 생각보다 간단히 적용하고 실행할 수 있었다.
  • 물론 Kubernetes의 Job 리소스에서도 spec.parallelism 옵션을 통해 병렬처리를 할 수 있지만 Furiko에서는 Key값이나 Key-Value의 조합으로 옵션을 줄 수 있어 응용성이 더 높은 느낌이었다.
  • furiko list job 명령을 통해 특정 JobConfig로 지금까지 실행된 Job의 이력들을 확인해볼 수도 있어서 여러가지 배치성 Job들을 실행하고자 할 때 확인 및 관리가 더 편해질 것이라 생각한다.
  • Kubernetes의 Job을 커스텀하고 관리할 수 있게 도와주는 툴은 많이 없는데 Furiko를 활용한다면 확실히 더 효율적으로 Job 관리가 가능할 것이라는 느낌이다.
profile
데이터 엔지니어의 작업공간 / #PYTHON #CLOUD #SPARK #AWS #GCP #NCLOUD

0개의 댓글