본문 바로가기
개발 이야기/Kubernetes

Kubernetes ConfigMap with Springboot

by 농개 2024. 4. 10.
반응형

현업에서 Kubernetes 환경에 서버를 띄운다면

Configuration외부화는 필수적입니다.

당장에 생각나는건 아래와 같은 측면에서 유리하다고 볼 수 있을 것 같습니다.

  • 민감 정보에 대한 보안 유지
  • 환경마다 다른 변수와 애플리케이션 코드 디커플링
  • 빠른 로컬 환경 구성

이번 포스팅에서는 쿠버네티스의 ConfigMap을 활용하여

애플리케이션의 환경변수를 외부화 하는 방법을 정리합니다.

 

목차

    1. 기본 사용법

    # configmap.yml
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: api-server-config
    data:
      DATASOURCE_USERNAME: "root"
      DATASOURCE_PASSWORD: "1234"

    먼저 ConfigMap은 위와 같이 구성해 볼 수 있습니다.

    적용 해봅시다.

     ~ kubectl apply -f configmap.yml

     

    그리고 아래와 같이 Deployment를 구성해봅시다.

    여기서는 Volume Mount를 추가로 사용하였습니다.

     

    # deployment.yml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: api-server
    spec:
      template:
        metadata:
          name: api-server
        spec:
          containers:
            - name: api-server
              image: api-exam:0.0.1
              ports:
                - containerPort: 8080
              env:
                - name: SPRING_PROFILES_ACTIVE
                  value: dev
              volumeMounts:
                - name: config-vol
                  mountPath: /etc/config
          restartPolicy: Always
          volumes:
            - name: config-vol
              configMap:
                name: api-server-config

     

    확인해봅시다.

     ~ kubectl exec -it [파드명] -n [네임스페이스] -- /bin/bash
    bash-4.2# cd /etc/config/
    bash-4.2# cat DATASOURCE_USERNAME
    root

    위와 같이 정상적으로 ConfigMap 오브젝트가 Pod에 정상적으로 마운팅 된 것을 확인 할 수 있습니다.

    이를 활용해서 Application에서 해당 값을 읽어 사용 할 수 있습니다.

     

    2. json 파일로 마운팅

    만약 json파일로 volume mount 및 사용하려면 아래와 같이 기입해주면 됩니다.

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: api-server-config
    data:
      config.json: |
        {
          "DATASOURCE_USERNAME": "root",
          "DATASOURCE_PASSWORD": "1234"
        }

     

    그러면 아래와 같이 json 파일로 mount되어 있는 것을 확인 할 수 있습니다.

    bash-4.2# cat config.json
    {
      "DATASOURCE_USERNAME": "root",
      "DATASOURCE_PASSWORD": "1234"
    }

     

     

     

    3. 환경변수로 사용

    Volume mount 없이 컨테이너 내에 환경변수로 만들어 사용 할 수도 있습니다.

    Springboot 어플리케이션은 아래와 같이 환경 변수의 값을 application.yml 에서 활용 할 수 있습니다.

    # application.yml
    k8sConfig:
      app:
        datasourceUsername: ${DATASOURCE_USERNAME}
        datasourcePassword: ${DATASOURCE_PASSWORD}

     

    테스트를 위해 아래와 같이 컨트롤러 코드를 추가해줬습니다.

    @RestController
    @RequestMapping("/api")
    class HelloController (
        @Value("\${k8sConfig.app.datasourceUsername}") val datasourceUsername: String,
    ) {
    
        @GetMapping("/test")
        fun test(): ResponseEntity<*> {
            return ResponseEntity.ok(datasourceUsername)
        }
    }

     

    ConfigMap은 아래와 같이 작성합니다.

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: api-server-config
    data:
      DATASOURCE_USERNAME: "root"
      DATASOURCE_PASSWORD: "1234"

     

    그리고 Deployment에서 아래와 같이 envFrom을 기입해줍니다.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: api-server
    spec:
      template:
        metadata:
          name: api-server
        spec:
          containers:
            - name: api-server
              image: api-exam:0.0.1
              ports:
                - containerPort: 8080
              envFrom:
                - configMapRef:
                    name: api-server-config

     

    아래와 같이 정상적으로 환경변수가 스프링 애플리케이션 프로퍼티에 의해 적용 되었음을 확인 할 수 있습니다.

    bash-4.2# curl localhost:8080/api/test
    root

     

     

     

    반응형

    '개발 이야기 > Kubernetes' 카테고리의 다른 글

    Telepresence 사용해보기  (0) 2024.04.03
    Kubernetes CronJob 실행 해보기  (0) 2024.03.30
    Kubernetes HPA 설정하기  (0) 2024.03.30
    Docker Image를 Minikube 로드하기  (0) 2024.03.24
    ArgoCD를 통해서 Application 배포  (0) 2024.03.24