MSA 등 분산 시스템 구조에서 application.yaml 등 config 정보를 애플리케이션 외부에서 관리하는 기능.
쿠버네티스는 외부에서 파라메터를 가져와서 사용하는 ConfigMap 을 제공한다.
구현 시나리오
간단한 스프링 부트 어플리케이션 구성
profiles 가 local 일 때는 application.yaml 에 정의 되어있는 local message 를 읽고
profiles 가 stg 일 때는 kubernetes configmap 에 정의 되어 있는 configmap 에 정의 되어 있는 데이터를 읽는다
application.yaml
server:
port: 8090
spring:
profiles: local
sample:
message: "Local message"
---
spring:
profiles: stg
sample:
message: ${MESSAGE}
./gradlew bootJar
FROM openjdk:8-jdk-alpine
ARG JAR_FILE=build/libs/*.jar
ENV SPRING_PROFILE=stg
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-Dspring.profiles.active=${SPRING_PROFILE}", "-jar", "/app.jar"]
도커 이미지 생성
docker build -t {도커아이디}/kube-config:2.0 .
테깅
docker image tag {도커아이디}/kube-config:2.0 yoonkwon23/kube-config:2.1
configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: sample-configmap
data:
message: "kubernetes configmap message"
kubectl apply -f configmap.yaml
pods.yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: app-sample
name: app-sample
spec:
containers:
- image: yoonkwon23/kube-config:2.1
name: app-sample
ports:
- containerPort: 8090
resources: {}
env:
- name: MESSAGE
valueFrom:
configMapKeyRef:
name: sample-configmap
key: message
dnsPolicy: ClusterFirst
restartPolicy: Always
kubectl apply -f pods.yaml
metallb 세팅 : web page에 접근을 위해서 - 세팅 과정 생략
apiVersion: v1
kind: Service
metadata:
name: sample-service
spec:
type: LoadBalancer
selector:
run: app-sample
ports:
# 기본적으로 그리고 편의상 `targetPort` 는 `port` 필드와 동일한 값으로 설정된다.
- port: 80
targetPort: 8080
status:
loadBalancer:
ingress:
- ip: 192.168.137.97
kubectl apply -f service.yaml
configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: sample-configmap
data:
message: "kubernetes configmap message!! I was changed"
kubectl apply -f configmap.yaml
그리고 파드를 재부팅해준다.
Spring cloud config 만 사용할 경우
장점:
단점
모든 application config 를 configmap 으로 처리할 경우
장점 :
전부 configmap으로 처리할 경우 컨피그 서버가 필요 없음. eks 내부에서 작업 처리 가능
비용 절감. (서버비 필요 없음)
컨피그 서버 중단으로 인한 장애 발생 예방 가능
보안적으로 우수, 중요 유출 가능성이 적어짐
단점 :
중요 부분만 configmap 으로 서리할 경우 ( 보안에 관련된 key 값 등 )
장점
단점
application.yaml
server:
port: 8090
spring:
profiles: local
sample:
message: "Local message"
secret-message: "Local secret message"
---
spring:
profiles: stg
sample:
message: ${MESSAGE}
secret-message: ${SECRET-MESSAGE}
이미지 생성 후 pods 적용
secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: sample-secret
data:
secretmassage: dGhpcyBpcyBzZWNyZXQgbWVzc2FnZSE=
base64 로 메시지가 암호화 됬음
kubectl apply -f secret.yaml
pods.yaml
kind: Pod
metadata:
creationTimestamp: null
labels:
run: app-sample
name: app-sample
spec:
containers:
- image: yoonkwon23/kube-config:v2.4
name: app-sample
ports:
- containerPort: 8090
resources: {}
env:
- name: MESSAGE
valueFrom:
configMapKeyRef:
name: sample-configmap
key: message
- name: SECRET-MESSAGE
valueFrom:
secretKeyRef:
name: sample-secret
key: secretmassage
dnsPolicy: ClusterFirst
restartPolicy: Always
kubectl delete -f pods.yaml
kubectl apply -f pods.yaml