본문 바로가기

EKS/Kubernetes Intro

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만 수정한 후 파드만 재시작하면 됩니다.