쿠버네티스환경에 Config Server 없이 중앙 집중형 설정 관리 방법
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에 익숙한 경우 |