회사 개발 프로젝트에서
쿠버네티스 크론잡을 이용해
포인트를 만료시키는 스프링 배치 코드를 실행시키고 있었다.
[ 개발 환경 ]
- JAVA : 17
- Spring framework : 3.1.5
- Cloud : Azure
나는 매일 오전 12시 01분에 도는 배치였고,
value.yaml 파일은 대략 다음과 같았다.
그리고 이렇게 내가 만든 포인트 만료 배치만 돌릴 때는 문제가 발생하지 않았다.
service: "batch"
image:
repository: 생략
pullPolicy: IfNotPresent
tag: ""
jobs:
- name: expire-point (1번 배치)
envFrom:
- configMapRef:
name: 생략
- secretRef:
name: 생략
- secretRef:
name: 생략
schedule: "1 0 * * *"
command:
- java
- -jar
- app.jar
- --job=expirePoint
그리고 동료 개발자가 다른 배치를 개발하는 상황이 있어서
아래와 같이 values.yaml 파일에 추가되었다
...(상동)
- name: card-fail (2번 배치)
envFrom:
- configMapRef:
name: 생략
- secretRef:
name: 생략
- secretRef:
name: 생략
schedule: "*/10 * * * *"
command:
- java
- -jar
- app.jar
- --job=cardFail
그런데 동료 개발자가 추가한 배치관련 설정파일을
Stage (개발계)에 코드를 푸시하는 과정 중
파이프라인 HelmDeploy 부분에서 아래와 같은 에러가 났다.
##[error]Error: UPGRADE FAILED:
YAML parse error on batch/templates/cronjob.yaml: error converting YAML to JSON:
yaml: line 7: did not find expected alphabetic or numeric character
일단 cronjob.yaml 파일에서 에러가 난다고 했으니 해당 파일로 가보았다.
{{- range $job := .Values.jobs }}
---
apiVersion: batch/v1
kind: CronJob
metadata:
name: "{{ $.Values.service}}-{{ $job.name }}"
spec:
timeZone: 'Asia/Seoul'
schedule: {{ $job.schedule }}
jobTemplate:
spec:
template:
spec:
containers:
- name: "{{ $.Values.service}}-{{ $job.name }}"
image: "{{ $.Values.image.repository }}:{{ $.Values.image.tag }}"
imagePullPolicy: IfNotPresent
envFrom:
{{- toYaml $job.envFrom | nindent 16 }}
command:
{{- range $job.command }}
- {{ . }}
{{- end }}
restartPolicy: OnFailure
{{- end }}
7번째 줄은 아래와 같았다.
spec 내용에서 사용하는 변수나 값을 검토해 보라는 의미같았다.
spec:
과연 어디가 문제였을까?
변경 전 cronjob.yaml 파일을 자세히 보면
schedule 부분은 따옴표로 감싸져 있지 않다.
spec:
schedule: {{ $job.schedule }}
그런데 내가 만든 1번 배치만 있을 때는 위와 같이 따옴표로 감싸지 않아도 문제가 되지 않았는데
2번 배치가 추가되니 문제가 발생했다.
* 내가 만든 1번 배치 schedule :
schedule: "1 0 * * *"
* 동료가 만든 2번 배치 schedule :
schedule: "*/10 * * * *"
따옴표가 없는 상황은 같은데,
왜 1번 배치에서는 문제가 없었지만 2번 배치에서는 문제가 발생했을까?
2번 배치를 보면 크론 표현식이 */10 이렇게 시작한다.
그러나 이 값은 숫자가 아닌 문자열로 처리되어야 했다.
Helm 템플릿에서는 */10와 같은 크론 표현식이 문자열로 취급되어야 하는데,
이를 따옴표로 감싸지 않으면 YAML 구문에서 다르게 해석되어 문제가 발생한 것이다.
Helm 템플릿에서 텍스트를 표현할 때 따옴표(")를 사용해야
Helm이 값으로 텍스트를 인식하고 해당 값에 대한 정확한 해석을 할 수 있다.
1번 배치와 같이 크론 표현식이 "1 0 * * * " 인 경우,
숫자와 공백으로 이루어진 문자열은 큰따옴표를 생략할 수 있다.
따라서 "1 0 * * * "은 크론 표현식이 숫자와 공백으로만 이루어져 있어
큰따옴표를 생략해도 유효한 YAML로 해석된 것이다.
반면 "*/10 * * * *"은 특수문자인 */가 포함되어 있어서 큰따옴표로 감싸야 한다.
'Programming > 프로그래밍 내용 정리' 카테고리의 다른 글
AWS Lightsail로 HTTPS 서버를 구축해보다. (1) | 2024.09.17 |
---|---|
[k8s] 모니터링 시스템을 구축했다. (Fluentd, Elasticsearch, Kibana) (1) | 2024.03.28 |
[Linux] top과 jstat -gc 명령어로 서버와 GC 살펴보기(with 챗지피티) (0) | 2023.06.21 |
[AWS야 제발 친해지자] VPC / 서브넷 / 인터넷 게이트웨이 / 라우팅 테이블 / 로드밸런싱 (0) | 2023.02.03 |
[보안] SQL Injection / PreparedStatement / Statement (1) | 2022.09.13 |