Nubes et Stella

Kubernetis #06 (Namespace/(Cron)Job) 본문

DevOps/Kubernetis

Kubernetis #06 (Namespace/(Cron)Job)

SeongYeong Han 2023. 10. 24. 16:52

01. Kubernetis Namespace란?

쿠버네티스 상의 API 오브젝트들을 논리적으로 구분하여 관리하기 위한 작업공간이다. 단순 분류뿐만 아니라 해당 논리적인 그룹에 대하여 권한 관리, CPU & Memory 등 리소스 제한 등을 할수도 있다.

 

** 네임스페이스 특징

- 리소스를 논리적으로 나누기 위한 방법 제공 (논리적 그룹)

- 네임스페이스의 단위는 사용자 목적에 맞추어 결정

 

  • 팀 단위 네임스페이스
  • 환경 단위 네임스페이스
  • 서비스 단위 네임스페이스

네임스페이스 범위 API 리소스

- 네임스페이스에 속할 수 있는 리소스를 네임스페이스 범위 API리소스라고 함

Ex.) Pod, Deployment, Service, Ingress, Secret, ConfigMap, ServiceAccount, Role, RoleBinding 등

클러스터 범위 API 리소스

Ex.) Node, Namespace, IngressClass, PriorityClass, ClusterRole, ClusterRoleBinding 등

클러스터 기본 Namespace

쿠버네티스 클러스터를 생성하고 나면 기본적으로 만들어져 있는 네임스페이스

 

default

- 네임스페이스를 지정하지 않은 경우에 기본적으로 할당되는 네임스페이스

kube-system

- 쿠버네티스 시스템에 의해 생성되는 API 오브젝트들을 관리하기 위한 네임스페이스

kube-public

- 클러스터 내 모든 사용자로부터 접근 가능하고 읽을 수 있는 오브젝트들을 관리하기 위한 네임스페이스

kube-node-lease

- 쿠버네티스 클러스터 내 노드의 연결 정보를 관리하기 위한 네임스페이스

쿠버네티스의 Domain Search

다른 네임스페이스의 서비스와 통신하기 위해서는 서비스명뿐만 아니라 네임스페이스명이 필요하다. 실제 다른 서비스와 통신할 경우 쿠버네티스의 DNS는 다른 네임스페이스에 대해서도 질의하게 된다.

$ curl ${service}.${namespace}.svc.cluster.local
$ curl ${service}.${namespace}.svc
$ curl ${service}.${namespace}
$ curl ${service}

 

$ kubectl create namespace alpha

  • "alpha" 라는 이름의 네임스페이스를 생성한다.

$ kubectl apply -f . -n alpha

  • 전체 yaml 파일에 대해서 리소스를 생성하는데, -n 옵션으로 네임스페이스를 지정한다. 

  • DNS에 의해 다른 네임스페이스의 Pod끼리 통신이 되는 것을 볼 수있다.

ResourceQuota와 LimitRange

- 네임스페이스 단위의 자원 사용량을 관리할 수 있는 기능을 제공한다.

 

ResourceQuota

  • 할당할 수 있는 자원(CPU, Memory, Volume 등)의 총합 제한
  • 생성할 수 있는 리소스(Pod, Service, Deployment 등)의 개수 제한

LimitRange

  • 파드 혹은 컨테이너에 대하여 자원 기본 할당량 설정, 혹은 최대 / 최소 할당량을 설정

 

  • 네임스페이스를 생성 한다.

 

  • 특정 네임스페이스(syhan)에 대한 "limit-range / resource-quota yaml" 파일을 생성 후 apply 한다.

 

  • "limit-range / resource-quota yaml" 가 적용된 네임스페이스를 확인한다.

 

  • "limit-range" 값을 초과하는 Pod를 생성하려고 할 경우 "Error" 메시지를 출력한다.

 

 

02. Kubernetis (Cron)Job이란?

가. Job

  • 특정 동작을 수행하고 종료하는 작업을 정의하기 위한 리소스
  • 내부적으로 파드를 생성하여 작업을 수행
  • Pod의 상태가 Running이 아닌 Completed가 되는 것이 최종 상태
  • 실패시 재시작 옵션, 작업 수행 회수, 동시 실행 수 등 세부 옵션 제공

 

나. CronJob

  • 주기적으로 특정 동작을 수행하고 종료하는 작업을 정의하기 위한 리소스
  • 리눅스의 크론(Cron) 스케줄링 방법을 그대로 사용
  • 내부적으로 잡을 생성하여 작업을 수행
  • 주기적으로 데이터를 백업하거나 데이터 점검 및 알림 전송 등의 목적으로 사용

Job 구현

  • line 2 : kind 인자에 "Job"을 넣는다.
  • line 8 : "restartPolicy" 인자는 해당 Pod를 계속 재시작 하는지를 결정한다. (job는 한번만 실행하기 때문에 Never)

 

  • 위의 Job을 apply해서 Pod를 성공적으로 생성시키면 "Completed" 상태의 Pod가 생성된다.

 

  • 실행한 Job의 로그를 확인하면($kubectl logs...), 실행된 명령어의 결과가 표기된다.

 

  • Job을 실행할 경우 총 실행 성공 횟수(completions)와, 최대 동시 실행 횟수(parallelism)를 설정할 수 있다.
  • 아래의 코드는 2개의 Pod를 동시실행 시켜 총 10개의 Pod를 실행시킨다.

 

  • Job으로 생성된 Pod의 실행 시간을 제한할 수 있다.
  • activeDeadlineSeconds 인자를 통해서 최대 실행을 3초로 설정한다.

CronJob 구현

  • line 6 : spec.schedule 인자에 리눅스와 동일한 Cron Expression이 적용 된다. (1분 단위로 실행)
  • line 7 : successfulJobsHistoryLimit 옵션을 통해서 Job 실행 기록을 최대 5개까지 생성
  • line 8 : CronJob은 Job오브젝트를 생성하기 때문에  jobTemplate 인자가 존재

 

  • CronJob은 스케줄에 지정된 시간마다 Job을 실행하기 때문에 아래와 같이 Job이 1분 단위로 생성된다.

 

  • Cronjob이 생성한 Job이 최종적으로 Pod를 생성한다.

 

- END -

'DevOps > Kubernetis' 카테고리의 다른 글

Kubernetis #07 (DaemonSet)  (0) 2023.10.28
Kubernetis #05 (ConfigMap/Secret)  (0) 2023.10.19
Kubernetis #04 (Deployment/Service)  (0) 2023.10.15
Kubernetis #03 (Pod/ReplicaSet)  (0) 2023.10.14
Kubernetis #02 (Install)  (0) 2023.10.14