
우리 프로젝트에서는 서비스 레지스트리와 디스커버리,
그리고 프로퍼티 파일을 Local 환경과 Kubernetes 환경에 따라 다르게 관리해야 한다.
그 이유는 Local 환경에서 서비스 레지스트리 및 디스커버리를 사용하기 위해
Spring Cloud에서 제공하는 Eureka 서버를 사용하기 위해서 아래의 의존성을 추가하였다.
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
그리고 쿠버네티스 상에서 서비스 레지스트리 및 디스커버리를 사용하기 위해서 아래의 의존성을 추가하였다.
implementation 'org.springframework.cloud:spring-cloud-starter-kubernetes-client-all'
implementation 'org.springframework.cloud:spring-cloud-starter-loadbalancer'
위에서 추가한 라이브러리들이 작게 나누어진 서비스들을 레지스트리 서버에 등록하거나 찾기 위해서는
@EnableDiscoveryClient 어노테이션을 붙여주어야 한다.
하지만, 이렇게 의존성과 어노테이션만 추가하고 나서 실행한다면, Local 환경에서도 동작하지 않고, 쿠버네티스 환경에서도 정상 작동하지 않을 것이다.
이를 위해서 환경 별로 Profile을 나누어 관리해야 한다.
로컬 환경에서는 Eureka Server를 통해서 서비스 레지스트리를 수행하고,
Config Server를 통해서 Configuration 파일들을 불러온다.
그렇기 때문에 Local 환경에서는 Eureka Client Registry와 Spring Cloud Config가 활성화 되어야 하고,
쿠버네티스 서비스 레지스트리, 서비스 디스커버리, Config 등 쿠버네티스와 관련된 설정들은 비활성화 되어야 한다.
이를 위해서 다음과 같이 작성하였다.
server:
port: 0
spring:
application:
name: auth-service
config:
activate:
on-profile: default
...
...
...
eureka:
instance:
instance-id: ${spring.application.name}:${spring.application.instance_id:${random.value}}
client:
fetch-registry: true
register-with-eureka: true
service-url:
defaultZone: http://127.0.0.1:8761/eureka
위에서 보는 것과 같이 application.yaml에서는 Local과 관련된 설정들이 입력되었다.
(인증/인가 서버에서 사용되는 값들이기 때문에 중요한 부분은 생략했다.)
자세히 보면 다음과 같다.
eureka.client.fetch-registry: true 와 eureka.client.register-with-eureka: true 로 설정하였다.spring:
config:
activate:
on-profile: default
cloud:
config:
uri: http://127.0.0.1:8888
name: auth-service
kubernetes:
enabled: false
config:
enabled: false
Spring Cloud에서 사용하는 프로퍼티 파일은 bootstrap.yaml 파일의 내용을 정리하자면 다음과 같다.
위에서 작성한 설정들은 구글에 검색해보면 대부분이 이렇게 알려준다.
그렇기에 이렇게만 보면 Local 환경에서 쿠버네티스 없이 동작할 것 같지만 그렇지 않다.
Local 환경에서 애플리케이션을 구동시켰음에도 불구하고 Kubernetes Client Discovery Error가 발생한다.
이를 해결하기 위해서는 spring.cloud.kubernetes.discovery.enabled: false 를 추가로 설정해주어야만 Local 환경에서 쿠버네티스 클라이언트 디스커버리를 수행하지 않다.
이에 최종적인 bootstrap.yaml 파일은 다음과 같다.
spring:
config:
activate:
on-profile: default
cloud:
config:
uri: http://127.0.0.1:8888
name: auth-service
kubernetes:
enabled: false
config:
enabled: false
discovery:
enabled: false # 쿠버네티스 디스커버리 설정 추가
위에서 로컬 환경에 대한 설정들을 보았다.
쿠버네티스에서 동작하는 것은 로컬과 정반대라고 생각하면 된다.
즉, 쿠버네티스 환경에서는 Eureka 서버와 Config Server를 비활성화 하고,
쿠버네티스와 관련된 설정들이 활성화되어야 한다.
spring:
application:
name: auth-service
config:
activate:
on-profile: kubernetes
...
...
...
eureka:
client:
fetch-registry: false
register-with-eureka: false
자세하게 설명할 것도 없이 쿠버네티스에 대한 프로퍼티 파일은 상당히 간편해진다.
그저 Eureka 서버에 대한 것을 모두 비활성화 해주면 되는 것이기 때문이다.
Local에서와 같이 Eureka 서버와 관련된 정보들을 비활성화 하는 데에 있어서
구글에 검색해보면 위와 같이 작성하라고 가장 많이 나온다.
(구글에 나오는 답변들은 본인들이 구동해본 것인지 의심스럽다...)
하지만 Local 때와 마찬가지로 위의 설정만으로 Kubernetes 상에 배포한다면
Local 때와는 반대로 Eureka에 계속 클라이언트 등록을 하려고 한다.
이를 해결하기 위해서는 eureka.client.enabled: false를 추가로 설정해주어야 한다.
따라서, 최종적인 applicaiton-kubernetes.yaml은 다음과 같다.
spring:
application:
name: auth-service
config:
activate:
on-profile: kubernetes
...
...
...
eureka:
client:
fetch-registry: false
register-with-eureka: false
enabled: false # 설정 추가
spring:
config:
activate:
on-profile: kubernetes
cloud:
config:
enabled: false
kubernetes:
enabled: true
config:
enabled: true
name: auth-config
namespace: default
loadbalancer:
mode: service
Spring Cloud Kubernetes에 대한 정보가 정말 적어서
하나하나 직접 테스트 해보고 배포까지 하면서 깎아내었다...