본문 바로가기

Programming/프로그래밍 내용 정리

[쿠버네티스] cronjob.yaml - error converting YAML to JSON 에러 해결하기

 

회사 개발 프로젝트에서 

쿠버네티스 크론잡을 이용해

포인트를 만료시키는 스프링 배치 코드를 실행시키고 있었다.

 

 

[ 개발 환경 ] 

- 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 * * * *"은 특수문자인 */가 포함되어 있어서 큰따옴표로 감싸야 한다.