Kubernetes - ConfigMap & Secret / Spring Boot 연동
우리나라는 그래도 자바공화국이니 Spring Boot를 기준으로 ConfigMap, Secret을 활용하는 법을 알아보겠습니다.
Kubernetes의 ConfigMap과 Secret은 컨테이너 환경 변수를 통해
어플리케이션에 Key Value 형태로 데이터를 매핑하여 사용할 수 있습니다.
가장 쉬운 예로 Database URL / User / Password 같은 값들을 변경하거나 직접 코드에 입력하는 것이 보안상의 이유로 불가능 하거나,
이러한 설정값을 변경을 한 후 배포하게 되어 수 많은 CICD Pipeline을 타야 할 경우 상당히 번거로울 수 있습니다.
따라서 코드에 작성할 부분들과, 쿠버네티스에서 관리할 수 있는 부분들을 나눠 운영하게 되면 서비스 운영에 효율성을 높일 수 있습니다.
먼저 ConfigMap의 예시입니다.
apiVersion: v1
kind: ConfigMap
metadata:
name: spring-info
namespace: phh-test-bo
data:
db-host: RDS.ap-northeast-2.rds.amazonaws.com
fluentd-sever-ip: 10.xxx.xxx.xxx
Data 아래에 실제 사용하고자 하는 데이터를 Key Value 값으로 매핑하여 사용할 수 있습니다.
Secret은 아래와 같으며 아래 들어가는 Value는 반드시 base64 인코딩을 거쳐야 합니다.
apiVersion: v1
kind: Secret
metadata:
name: spring-secret
namespace: phh-test-bo
type: Opaque
data:
username: YWRtaW4=
password: YWRtaW4xMjM0
이제 Deployment.yaml에서 위의 세팅 값을 가져오도록 하겠습니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: phh-bo
namespace: phh-test-bo
spec:
selector:
matchLabels:
app: phh-bo
replicas: 1
template:
metadata:
labels:
app: phh-bo
spec:
containers:
- image: {ECR_URL}
imagePullPolicy: Always
name: phh-bo
ports:
- containerPort: 9090
env:
- name: DB_HOST
valueFrom:
configMapKeyRef:
name: spring-info
key: db-host
- name: FULENTD_SERVER_IP
valueFrom:
configMapKeyRef:
name: spring-info
key: fluentd-sever-ip
- name: DB_USERNAME
valueFrom:
secretKeyRef:
name: spring-secret
key: username
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: spring-secret
key: password
이제 흐름이 보이실 거라 생각합니다.
ConfigMap Name = confgMapKeyRef / name
ConfigMap Data Key = confgMapKeyRef / name / key
Secret도 똑같이 매핑하여 사용하시면 됩니다.
이제 마지막으로 Spring Boot에서 Application.yaml을 보도록 하겠습니다.
아래와 같이 yaml, xml을 가리지 않고 Deployment에서 세팅한 env 변수 값을 모두 받을 수 있습니다.
이렇게 세팅하여 구성하시면, 어플리케이션의 설정을 바꿔야 하더라도, 굳이 코드 수정부터 배포를 다하는것이 아니라,
쿠버네티스에서 ConfigMap / Secret만 수정한 후 파드만 재시작하면 됩니다.