Spring Cloud vs ConfigMap

bo-yoon·2021년 10월 9일
0

springcloud

목록 보기
1/1

Spring Cloud Config 란?

MSA 등 분산 시스템 구조에서 application.yaml 등 config 정보를 애플리케이션 외부에서 관리하는 기능.




스프링 클라우드 with ConfigMap

쿠버네티스는 외부에서 파라메터를 가져와서 사용하는 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}

configmap(stg) 실행

  • jar 파일 생성
./gradlew bootJar
  • Dockerfile 생성
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

  • push
    docker image push {도커아이디}/kube-config:2.1


message 가 들어 있는 configmap 생성

configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: sample-configmap
data:
  message: "kubernetes configmap message"

kubectl apply -f configmap.yaml




이미지를 띄울 컨테이너가 들어있는 파드 생성

  • 파드에 env 설정에 아까 만들었던 configmap 정보를 집어 넣어준다.

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



  • 화면접근

config 변경시

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 만 사용할 경우

장점:

  1. 간단한 구성

단점

  1. 보안적으로 취약함

모든 application config 를 configmap 으로 처리할 경우

장점 :

  1. 전부 configmap으로 처리할 경우 컨피그 서버가 필요 없음. eks 내부에서 작업 처리 가능

  2. 비용 절감. (서버비 필요 없음)

  3. 컨피그 서버 중단으로 인한 장애 발생 예방 가능

  4. 보안적으로 우수, 중요 유출 가능성이 적어짐

단점 :

  1. local 테스트는 따로 서버를 띄워서 혹은 또 로컬 yaml 파일을 가져와서 사용
    • yaml 파일을 local 을 다른 stg, prd 와 분리해서 관리해야함
    • 파일 관리에 어려움이 발생
  2. profile 변경시 어려움 .개발자가 직업 수정 하지 못하고 아키텍트에게 수정 요청할 가능성이 있음

중요 부분만 configmap 으로 서리할 경우 ( 보안에 관련된 key 값 등 )

장점

  1. 보안적으로 우수, 중요 정보 유출 가능성이 적어짐
  2. 개발환경 구성의 용이. develop, stg 등 config server 를 바라보고 개발가능

단점

  1. config server, configmap 두개 관리



번외 : secret 세팅 후 적용

  • springboot 에 소스 추가

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

  • 시크릿에서 데이터를 읽은 것을 확인

profile
개발 로그 🍎 🍎 🍎

0개의 댓글