-
[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가 뜰 때 에러를 발생시킬 것이다.
따라서 아래와 같은 작업을 추가로 진행해야한다.
OKDDeployments 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'개발기록' 카테고리의 다른 글
[OKD + SpringBoot gradle 프로젝트] ConfigMaps와 Secrets에 환경변수 선언 후 사용하기 (0) 2023.06.05 [구글 번역 API] Google Cloud Translation API 사용하기 (0) 2023.04.13 [멀티모듈] Spring Boot gradle프로젝트 멀티모듈구조에서 모듈추가하기 (0) 2023.04.06 [에러] gradle 프로젝트에서 모듈 추가 후 삭제 시 마주친 에러 (0) 2023.04.06 [RSA] Java와 C# 간 RSA 공개키 호환 코드 (0) 2023.03.07