Kubernetes - DaemonSet, Job, CronJob

현시기얌·2022년 1월 13일
0

Kubernetes

목록 보기
8/23
post-thumbnail

DaemonSet, Job, CronJob

DaemonSet

Node들이 있고 각각의 Node들에 자원이 각각 다르게 남아 있는 상황에서 ReplicaSet의 경우
Pod를 스케줄링을 통해 배치하기 하기 때문에 자원이 많이 남아 있는 쪽에 많이 배치가 될 가능성이 높다.

DaemonSet은 Node의 자원상태와 상관없이 모든 Node에 Pod가 1개씩 생긴다는 특징이 있다.
ex) 성능 수집, 로그 수집, Storage

DaemonSet은 selector와 template이 있어서 모든 Node에 template으로 Pod를 만들고 selector와 Label로 DaemonSet과 연결된다.
그런데 만약 Node들의 OS 종류가 달라서 Label들이 붙어있다고 가정해보자.
이 DaemonSet에 있는 Pod는 Ubuntu 환경에서는 작동되기 않는다고 하면 nodeSelector를 통해 특정 Label에만 DaemonSet을 생성할 수 있게 할 수 있다.
이렇게 DaemonSet은 한 Node에 하나를 초과해서 Pod를 만들 수는 없지만 Node에 Pod를 안만들 수는 있다.
hostPort를 설정하면 직접 Node에 있는 Port가 Pod로 연결되서 Service의 externalTrafficPolicy: Local과 똑같은 역할을 할 수 있다.

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: daemonset-1
spec:
  selector:
    matchLabels:
      type: app
  template:
    metadata:
      labels:
        type:app
    spec:
      nodeSelector:
        os: centos
      containers:
        - name: container
          image: nginx:1.14
          ports:
            - containerPort: 8080
              hostPort: 18080

template안에 nodeSelector를 지정하면 해당 Label이 있는 Node에만 Pod가 생성된다.
hostPort(18080)로 들어온 요청은 컨테이너의 Port(8080)로만 연결된다.

Job, CronJob

직접 만든 Pod, ReplicaSet으로 만들어지는 Pod, Job으로 만들어지는 Pod가 있다고 가정해보자.
Pod들이 Node1에서 돌아가고 있는 상태에서 Node가 다운된다면?
-->
1. 직접 만든 Pod도 Down이 되서 서비스가 다운된다.
2. Controller에 의해 만들어진 Pod들은 장애가 감지가 되면 다른 Node에 재생성되므로 서비스가 계속 유지된다.
3. ReplicaSet으로 만든 Pod는 일을 하지 않으면 다시 Pod를 ReStart해주기 때문에 무슨 일이 있어도 서비스가 유지된다.
4. Job으로 만든 Pod는 프로세스가 일을 하지 않으면 Pod가 종료된다. 이 때 종료의 의미는 Pod가 삭제된다는 의미가 아니라 자원을 사용하지 않는 상태로 멈춰있다는 것을 의미한다.

CronJob은 이런 Job들을 주기적인 시간에 따라서 생성하는 역할을 하는데 보통 Job을 하나 만들어서 사용하지 않고 CronJob을 만들어서 특정 시간에 반복적으로 실행할 목적으로 사용한다.
ex) BackUp, Checking, Messaging

Job도 마찬가지로 template과 selector가 있는데 template에는 특정 작업만하고 종료하는 Pod의 정보가 담겨져 있고 selector에는 직접 만들지 않아도 Job이 알아서 만들어준다.

completions 라는 옵션을 주면 해당하는 숫자 만큼 Job들이 하나씩 순차적으로 실행시켜서 모두 작업을 마쳐야지만 Job이 종료 된다.

parallelism 라는 옵션을 주면 해당 숫자 만큼 Job들이 병렬적으로 실행된다.

activeDeadlineSeconds 라는 옵션을 주면 해당 시간 후에 기능이 정지된다. 그리고 실행되고 있는 모든 Pod들은 삭제가 된다. 또한 아직 실행하지 못한 Pod들도 실행되지 못하고 삭제된다.
즉 Job의 예상시간보다 오래 걸리는 경우 문제가 발생했다는 것임으로 Pod들을 삭제하여 자원을 Release하고 더이상 작업을 작업을 진행하지 않도록 설정할 때 사용한다.

apiVersion: batch/v1
kind: Job
metadata:
  name: job-1
spec:
  completions: 6
  parallelism: 2
  activeDeadlineSeconds: 39
  template:
    spec:
      restartPolicy: Never
      containers:
        - name: container
          image: nginx:1.14

restartPolicy 설정 : Never, OnFailure

CronJob은 JobTemplate이 있어서 이 내용을 통해서 Job을 만들어 주고 Schedule이 있어서 해당 시간 마다 Job을 만들어준다.
CronJob Schedule: "0 3 1 * *"
- Minutes (from 0 to 59)
- Hours (from 0 to 23)
- Day of the month (from 1 to 31)
- Month (from 1 to 12)
- Day of the week (from 0 to 6)

concurrencyPolicy라는 기능이 있는데 Allow, Forbid, Replace 옵션이있다.
일반적으로 Policy를 설정하지 않으먼 Allow가 Default다.

Allow는 1분 간격으로 Job을 실행한다고 가정했을 때 1분이 됬을 때 Job이 만들어지고 Pod가 생성된다.
그리고 1분이 지나면 이전의 Job이 실행이 완료되었던 진행중이던 문제가 생겼던 상관없이 새로운 Job이 생성된다.

Forbid는 1분이 되었을 때 Job이 생성되지만 2분이 되었을 때도 이전의 Job이 계속 실행되고 있으면 2분째 생겨야 하는 Job이 생략되고 계속 이전의 Job이 실행되게 한다.
그리고 나서 이전의 Job이 끝나는 즉시 다음 스케줄 타임에 있는 Job이 실행된다.

Replace는 1분에 Job이 만들어졌고 2분 되었을 때 이전의 Job이 계속 실행중이면 새로운 Pod를 만들면서 Job의 연결을 새로운 Pod로 교체시킨다.
그렇기 때문에 2분이 되었을 때 새로운 Job은 생기지 않기만 새로운 Pod는 생기먼서 이전 스케줄때 만들었던 Job이 연결된다.

Suspend: 실행 중인 Job을 일시정지

apiVersion: batch/v1
kind: CronJob
metadata:
  name: cron-job
spec:
  scheduler: "*/1 * * * *"
  concurrencyPolicy: Allow
  jobTemplates:
    spec:
      template:
        spec:
          restartPolicy: Never
          containers:
            - name: container
              image: nginx:1.14
profile
현시깁니다

0개의 댓글