ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [OKD + SpringBoot gradle 프로젝트] value.yaml에 ConfigMaps와 Secrets 선언 후 사용하기
    개발기록 2023. 8. 8. 15:43
    반응형
    728x90

     

    개요

    helm 배포 구조인 gradle 프로젝트에서 정적인 변수를 OKD(3버전대)에서 환경변수로 등록하고 사용하는 법을 기록한다.

    이번에 정리할 내용은 앞서 정리했던 OKD(4버전대)에서 방법과는 다른 방법으로, value.yaml에서 Secrets 변수를 등록하고 배포할 때 적용되는 방법이다.

    (cf. OKD(4버전대)에서 ConfigMaps와 Secrets를 등록해서 사용하는 방법은 아래 링크를 참고하자.

    2023.06.05 - [개발기록] - [OKD + SpringBoot gradle 프로젝트] ConfigMaps와 Secrets에 환경변수 선언 후 사용하기)

     

    Spring Boot

    application.properties

    아래와 같이 properties에 db정보를 secrets에 등록해서 사용하는 예제를 살펴보자.

    (cf. 운영일 경우 property를 분리하여 application-prd.properties로 작성하는 것을 추천한다.

    예시에서는 따로 분리하진 않았다.

    jasyptEncryptor를 통해 암호화하였기 때문에 jasyptEncryptor에 대한 config도 프로젝트 내에 존재해야한다.

    이 부분은 구글링하면 예제 코드도 많기때문에 이 부분까지는 해당 포스팅에선 다루지 않겠다.)

     

    jasypt.encryptor.bean=jasyptEncryptor
    jasypt.encryptor.password=${JASYPT_ENCRYPTOR_PASSWORD}
    
    # DB Connection Information
    spring.datasource.driver-class-name=org.postgresql.Driver
    spring.datasource.url=ENC(${DATASOURCE_URL})
    spring.datasource.username=ENC(${DATASOURCE_USERNAME})
    spring.datasource.password=ENC(${DATASOURCE_PASSWORD})

     

    프로젝트 내 파일들

    프로젝트명/devops/helm/프로젝트명/values.yaml

    values.yaml에서 secret 부분을 찾아가서 등록할 변수의 key와 value 쌍을 아래와 같이 선언한다.

    (cf. 아래에 있는 값들은 예시로 자신에게 맞는 값들을 입력한다.)

     

    ...(생략)...
    
    secret:
      enabled: true
      data:
        JASYPT_ENCRYPTOR_PASSWORD: tistory
        DATASOURCE_URL: Ytehlbhz1kN3+6M5K+YbtXi2zpVkEhZsEvhCI7VbTiY=
        DATASOURCE_USERNAME: qEh9DNGaggc0wXtWGGNMkQ1O5imvJ8+y4xdjV7xJZWBjOs5RxWzgaw==
        DATASOURCE_PASSWORD: aQfcEI6JSLWn8dDF/0jw1L3b9n056SkjQ7ufjvdsLOX/nYzfisUgew==
    
    ...(이하 생략)...

     

    프로젝트명/devops/helm/프로젝트명/templates/secret.yaml

     

    values.yaml에 등록했던 key 값을 secret.yaml에 등록한다.

    values.yaml의 key 값이 secret.yaml에선 value 값이 된다.

    secret.yaml에서의 key 값은 OKD deployments의 Yaml에서 value 값이 된다.

     

    Secrets에 등록하는 변수들은 base64 인코딩이 되어 등록된다.

    👉 base64 인코딩을 해주라는 구문으로 | b64enc 를 써준다.

     

    ❗❗ 값이 숫자로만 구성되어 있을 경우 문자열로 변환해주어야한다.

    (안 그러면 에러가 난다.. 이 부분에서 애 좀 먹었다..

    이 예시에는 숫자로만 구성된 값들이 없지만.. 애먹은 부분이라 공유해둔다.. 

    ex. datasource-port: "{{ .Values.secret.data.DATASOURCE_PORT | toString | b64enc }}")

    👉 | toString 을 써준다.

     

    (cf. if 구문 등은 프로젝트 별로 상이할 수 있으니 자신의 프로젝트에 맞게 수정하도록 하자.)

     

    {{- if .Values.secret.enabled -}}
    {{- $releaseName := .Release.Name -}}
    apiVersion: v1
    kind: Secret
    metadata:
      name: {{ $.Values.app }}-secret
    {{- if .Values.secret.data }}
    data:
      jasypt-encryptor-password: "{{ .Values.secret.data.JASYPT_ENCRYPTOR_PASSWORD | b64enc }}"
      datasource-url: "{{ .Values.secret.data.DATASOURCE_URL | b64enc }}"
      datasource-username: "{{ .Values.secret.data.DATASOURCE_USERNAME | b64enc }}"
      datasource-password: "{{ .Values.secret.data.DATASOURCE_PASSWORD | b64enc }}"
    {{- end }}
    
    {{- end }}

     

    이렇게 해서 helm 배포를 하면 OKD에 Secret이 생성된다.

    생성된 Secret 파일명은 values.yaml에서 app(key)에 대한 value 값과

    secret.yaml의

     

    metadata:
      name: {{ $.Values.app }}-secret

    해당 코드에 따라서 명명된다.

    (ex. app에 대한 value 값이 test-name일 경우, test-name-secret으로 생성된다.)

     

    현재 상태에서는 pod가 뜰 때 에러를 발생시킬 것이다.

    따라서 아래와 같은 작업을 추가로 진행해야한다.

     

    OKD

    Deployments YAML

    해당 프로젝트의 deployment에서 Edit YAML을 통해 YAML 파일을 수정한다.

    (cf. 아래 예시에서는 datasource-url에 대해서만 작성했다.)

     

    kind: Deployment
    apiVersion: apps/v1
    metadata:
      name: test-name
      namespace: test-namespace
    spec:
      selector:
        matchLabels:
          app: test-name
      template:
        metadata:
          labels:
            app: test-name
        spec:
          containers:
            ...(생략)...
                env:
                  - name: DATASOURCE_URL
                    valueFrom:
                      secretKeyRef:
                        key: datasource-url
                        name: test-name-secret
        ...(이하 생략)...

     

    cf) 추가 공부 필요(아래 내용은 검증 필요)
    pod에서 사용하는 경우, <프로젝트명/devops/helm/프로젝트명/templates/deployment.yaml> 파일이 secrets를 물고 pod를 띄운다.
    deployment.yaml은 pod에 대한 설정해주는 파일이다.
    결국 이 설정이 replicaset에 대한 설정이다.
    따라서 replicaset에서 pod 개수에 따라서 pod가 유지된다.

     

    여기까지 완료되면 pod가 정상적으로 뜨는 걸 확인할 수 있다.

    (cf. DB 연결이 아닌 자바 소스코드 내에서 가져다 쓸 때에는 아래 링크에서 확인하도록 하자.

    2023.06.05 - [개발기록] - [OKD + SpringBoot gradle 프로젝트] ConfigMaps와 Secrets에 환경변수 선언 후 사용하기)

     

    values.yaml  [23.10.23 수정]

    values.yaml파일에서 deployments로 시작하는 부분에 indentation을 맞춰서 아래와 같이 작성해주면 OKD에서 yaml 수정없이 해결할 수 있다.

    deployments:
      - spec:
          containers:
            ...(생략)...
                env:
                  - name: DATASOURCE_URL
                    valueFrom:
                      secretKeyRef:
                        key: datasource-url
                        name: test-name-secret

     

    추가로 공부해야할 부분

    그런데 이렇게 할 경우 환경변수가 많아지면 너무 비효율적일 것 같아서 다른 방법을 찾아보던 중,

    envFrom을 통해 이 고민을 해결할 수 있다고 해서 아래와 같이 작성 후 테스트 해보았다.

     

    deployments:
      - spec:
          containers:
            ...(생략)...
              envFrom:
              - secretRef:
                  name: genai-ai-secret

     

    indentation 레벨때문에 배포 시 에러가 몇 번 났었지만,

    위 코드처럼 작성하니 배포에는 성공했다.

     

    pod까지 정상적으로 뜬 걸 확인 후 기능테스트를 해보니, 기능은 작동을 안 했다,,

    secret 변수들을 물면서 pod가 떠야하는데,, 그게 안 되는 것 같다,,

    이 부분은 좀 더 찾아보고 차후에 업데이트하기로 하자,,

    728x90
Designed by Tistory.