Completed
상태로 바뀌면서 종료된다.Furiko
는 Job 리소스를 조금 더 커스텀하게 잘 관리할 수 있도록 도와주는 Tool로 이번 글에서는 Furiko를 설치하고 사용해본 느낌을 간단히 적어볼까한다.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
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
> 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.
JobConfig
와 Job
이렇게 두 개의 리소스가 존재한다. JobConfig를 통해 실행할 Job에 대한 Plan이 먼저 배포가 되어야 이후에 Job을 실행할 수 있는 구조로 되어있다.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"
kubectl apply
를 통해 위의 리소스를 배포한 후 furiko run
명령어를 통해 정의된 작업을 실행한다.1. JobConfig 리소스 배포 >> kubectl apply -f sample-job.yaml
2. 정의된 작업 실행 >> furiko run [작업명]
true
로 되어 있으면 정의한 작업 스케쥴링이 적용되지 않은 상태이므로 아래 명령어를 통해 스케쥴링을 enable 시켜준다.> furiko enable [작업명]
> 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
# 2024-03-31 14시에 해당 작업이 실행될 수 있도록 설정한 것이다.
> furiko run [작업명] --at 2024-03-31T14:00:00Z
withCount
, withKeys
, withMatrix
이렇게 세가지이다.spec:
parallelism:
withCount: 3
spec:
parallelism:
withKeys:
- golang
- python
- nodejs
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
spec.parallelism
옵션을 통해 병렬처리를 할 수 있지만 Furiko에서는 Key값이나 Key-Value의 조합으로 옵션을 줄 수 있어 응용성이 더 높은 느낌이었다. furiko list job
명령을 통해 특정 JobConfig로 지금까지 실행된 Job의 이력들을 확인해볼 수도 있어서 여러가지 배치성 Job들을 실행하고자 할 때 확인 및 관리가 더 편해질 것이라 생각한다.