쿠버네티스

쿠버네티스환경에 Config Server 없이 중앙 집중형 설정 관리 방법

ipxy 2025. 3. 27. 14:48
728x90

Spring Boot Config Server를 쿠버네티스 환경에서 대체하려는 경우, 일반적으로 Kubernetes ConfigMap과 Secret, 또는 External Configuration 시스템을 활용합니다. 이를 통해 Config Server 없이도 중앙 집중형 설정 관리가 가능합니다. 아래에 대표적인 접근 방식들을 설명드릴게요.


✅ 1. Kubernetes ConfigMap과 Secret 사용

구성 방법 요약

  • ConfigMap: 일반적인 설정 값 저장
  • Secret: 민감한 정보 (DB 비밀번호 등) 저장
  • 애플리케이션에서 application.yaml 혹은 application.properties 파일을 생성하지 않고, 설정 값을 외부에서 주입

예시: ConfigMap 생성

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  application.yaml: |
    server:
      port: 8080
    spring:
      datasource:
        url: jdbc:mysql://db:3306/mydb
        username: user

Secret 예시

apiVersion: v1
kind: Secret
metadata:
  name: app-secret
type: Opaque
stringData:
  application-secret.yaml: |
    spring:
      datasource:
        password: super-secret-pw

Pod에 마운트하는 방식

volumeMounts:
  - name: config-volume
    mountPath: /config
volumes:
  - name: config-volume
    configMap:
      name: app-config
  - name: secret-volume
    secret:
      secretName: app-secret

Spring Boot에서 외부 설정을 로드하도록 설정

application.yaml 또는 실행 시 파라미터에 아래 옵션 추가:

--spring.config.additional-location=file:/config/

✅ 2. Spring Cloud Kubernetes 사용

보다 Spring Cloud Config Server와 유사하게 쓰고 싶다면, spring-cloud-starter-kubernetes-config 사용을 고려할 수 있습니다.

특징

  • Kubernetes ConfigMap 및 Secret을 자동으로 로딩
  • 설정 변경 시 자동 reload (Hot Reload)

 spring.config.import=kubernetes: 방식은 Spring Cloud Kubernetes 3.x 이상에서 도입된 방식으로, Spring Boot 2.4+에서 지원하는 새로운 ConfigData API를 활용합니다. 이 방식은 기존보다 훨씬 유연하고, ConfigMap/Secret을 쉽게 import할 수 있습니다.


🎯 목표

  • application.yaml에 spring.config.import=kubernetes: 선언
  • ConfigMap/Secret을 자동으로 로드
  • Hot Reload 가능 (옵션)
  • 모듈화된 설정 관리

✅ 1. 의존성 추가

Gradle 기준:

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter'
    implementation 'org.springframework.cloud:spring-cloud-starter-kubernetes-client-config'
}

client-config는 Kubernetes API를 직접 호출하며, RBAC 권한 필요합니다.


✅ 2. RBAC 설정

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: config-reader
rules:
  - apiGroups: [""]
    resources: ["configmaps", "secrets"]
    verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: config-reader-binding
roleRef:
  kind: ClusterRole
  name: config-reader
  apiGroup: rbac.authorization.k8s.io
subjects:
  - kind: ServiceAccount
    name: default
    namespace: default

✅ 3. ConfigMap 생성 예시

apiVersion: v1
kind: ConfigMap
metadata:
  name: my-config
  namespace: default
data:
  application.yaml: |
    app:
      message: "Hello from ConfigMap"

✅ 4. Spring Boot 설정

application.yaml 또는 bootstrap.yaml:

spring:
  config:
    import: "kubernetes:"
  cloud:
    kubernetes:
      config:
        sources:
          - name: my-config
            namespace: default
      reload:
        enabled: true
        strategy: restart_context # or refresh

다른 유용한 설정

spring:
  cloud:
    kubernetes:
      config:
        sources:
          - name: my-config
            namespace: default
            optional: false
            labels:
              environment: dev
        enable-api: true
        enable-cache: true

✅ 5. Secret 사용 예시

Secret도 동일하게 import 가능:

spring:
  cloud:
    kubernetes:
      secrets:
        enabled: true
        sources:
          - name: my-secret
            namespace: default

Secret YAML 예:

apiVersion: v1
kind: Secret
metadata:
  name: my-secret
type: Opaque
stringData:
  application-secret.yaml: |
    secret:
      password: super-secret

🔁 Hot Reload 전략

Strategy 동작 방식

refresh @RefreshScope 빈만 다시 로딩
restart_context 전체 ApplicationContext 재시작
shutdown 애플리케이션 종료 후 재시작 필요 (k8s liveness에 의존)

spring-cloud-kubernetes-fabric8-config 대신 client-config를 사용해야 최신 기능 사용 가능.


🧪 확인 방법

kubectl edit configmap my-config

설정 변경 후:

  • refresh 전략이면 로그에 Refresh triggered 표시
  • restart_context 전략이면 Spring Context 재시작됨

📌 정리

  • spring.config.import=kubernetes:는 Spring Boot 2.4+에서 권장되는 ConfigData API 기반 설정
  • ConfigMap과 Secret을 유연하게 import
  • namespace, labels, optional 설정 가능
  • Hot reload를 통해 Config Server 수준의 유연성 확보 가능

 

방식  특징  권장 시점
ConfigMap + Secret 가장 단순, 표준적인 쿠버네티스 설정 방식 소규모 또는 초기
Spring Cloud Kubernetes Config Server에 가장 가까움, Hot reload 가능 Spring Cloud에 익숙한 경우

 

728x90