CronJob으로 deployment 주기적 재시작 설정하기

Jisu·2024년 1월 21일

Kubernetes

목록 보기
10/12
post-thumbnail

배경

특정 어플리케이션에서 out of memory 현상이 관측되었습니다. (oom) 개발팀에서 근본원인 트러블 슈팅까지 시간이 걸린다고 판단되었고, 인프라팀에서는 임시 방편으로 파드를 주기적으로 재부팅시켜 누적 메모리 사용량을 초기화하기로 했습니다. 기능 구현에 CronJob을 사용하였고, 그 개념과 yaml에 대해서 소개합니다.


CronJob 이란?

반복 스케줄링 작업을 만드는 쿠버네티스 공식 워크로드 리소스입니다.


CronJob의 원리

CronJob의 원리는 이렇습니다.

  1. 반복적으로 특정 명령을 수행하는 파드를 하나 만듭니다.
  2. 그 파드가 ServiceAccount를 사용해서 Control Plane의 API 서버에 특정 명령을 내려달라고 요청합니다.
  3. Control Plane API 서버는 명령을 요청한 주체가 그럴 권한이 있는지 확인하고 명령을 수행합니다.

권한 체크가 필요한 이유는 클러스터 내 자원을 마음대로 바꿀 수 없기 때문입니다.


RBAC (Role Based Access Control)

쿠버네티스는 RBAC라는 역할 기반 엑세스 제어를 사용하고 있습니다. Control Plane API서버는 이 RBAC를 기반으로 요청을 받고 명령을 수행합니다.

AWS에서 정책을 만들고, 그룹에 할당하듯이 쿠버네티스 내에서 역할을 정의하고 그 역할을 특정 리소스에 바인딩하는 형태로 이루어집니다. 관련 리소스로 Role과 RoleBinding이 있습니다.


CronJob 명세 Example

10분 주기 마다 특정 deployment 파드를 재시작하는 CronJob을 만드는 yaml 명세서입니다. 여기에는 ServiceAccount, Role, RoleBinding, CronJob이 같이 명세됩니다.

우리가 반복하려는 명령은 파드를 재시작하는 것으로 'kubectl rollout restart deployment ’ 입니다. 그래서 bitnami에서 제공하는 kubectl이 설치된 베이스 이미지를 사용합니다.

# control plane 통신에 사용되는 service account
kind: ServiceAccount
apiVersion: v1
metadata:
  name: selenium-chrome-restart
  namespace: selenium-grid

---
# deployment의 selenium-node-chrome 대한 get,patch,list,watch 권한을 부여
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: selenium-chrome-restart-role
  namespace: selenium-grid
rules:
  - apiGroups: ["apps", "extensions"]
    resources: ["deployments"]
    resourceNames: ["selenium-node-chrome"]
    verbs: ["get", "patch", "list", "watch"]

---
# selenium-chrome-restart role을 ServiceAccount에 binding
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: selenium-chrome-restart-rolebinding
  namespace: selenium-grid
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: selenium-chrome-restart-role
subjects:
  - kind: ServiceAccount
    name: selenium-chrome-restart-sa
    namespace: selenium-grid

---
# CronJob 명세, API 요청에 필요한 Service Account 할당
apiVersion: batch/v1
kind: CronJob
metadata:
  name: selenium-chrome-restart
  namespace: selenium-grid
spec:
  successfulJobsHistoryLimit: 1
  failedJobsHistoryLimit: 2
  concurrencyPolicy: Forbid
  schedule: '*/10 * * * *' # batch 주기 설정 (테스트 용으로 10분)
  jobTemplate:
    spec:
      backoffLimit: 2
      activeDeadlineSeconds: 600
      template:
        spec:
          serviceAccountName: selenium-chrome-restart-sa
          restartPolicy: Never
          containers:
            - name: kubectl
              image: bitnami/kubectl
              command:
                - 'kubectl'
                - 'rollout'
                - 'restart'
                - 'deployment/selenium-node-chrome'

**❗️주의점 : schedule시 시간은 UTC 기준입니다.


시연 영상

일정주기가 되어 자동으로 파드 재생성이되는 것을 볼 수 있습니다

업로드중..


Reference

CronJob

CronJob

RBAC

Using RBAC Authorization

Schedule expression 생성 사이트

Crontab.guru - The cron schedule expression editor

profile
기술 공유를 즐기는 DevOps Engineer 장지수입니다.

0개의 댓글