
특정 어플리케이션에서 out of memory 현상이 관측되었습니다. (oom) 개발팀에서 근본원인 트러블 슈팅까지 시간이 걸린다고 판단되었고, 인프라팀에서는 임시 방편으로 파드를 주기적으로 재부팅시켜 누적 메모리 사용량을 초기화하기로 했습니다. 기능 구현에 CronJob을 사용하였고, 그 개념과 yaml에 대해서 소개합니다.
반복 스케줄링 작업을 만드는 쿠버네티스 공식 워크로드 리소스입니다.
CronJob의 원리는 이렇습니다.
권한 체크가 필요한 이유는 클러스터 내 자원을 마음대로 바꿀 수 없기 때문입니다.
쿠버네티스는 RBAC라는 역할 기반 엑세스 제어를 사용하고 있습니다. Control Plane API서버는 이 RBAC를 기반으로 요청을 받고 명령을 수행합니다.
AWS에서 정책을 만들고, 그룹에 할당하듯이 쿠버네티스 내에서 역할을 정의하고 그 역할을 특정 리소스에 바인딩하는 형태로 이루어집니다. 관련 리소스로 Role과 RoleBinding이 있습니다.
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 기준입니다.
일정주기가 되어 자동으로 파드 재생성이되는 것을 볼 수 있습니다
CronJob
RBAC
Schedule expression 생성 사이트