처음에는 Spring Cloud를 통해 MSA 서비스를 개발하였습니다. 이후에 auto scaling, 무중단 배포, 컨테이너 관리를 간편하게 하고자 쿠버네티스를 저희 서비스에 적용해 보기로 하였습니다.
spring cloud로 된 프로젝트를 쿠버네티스로 마이그레이션 하면서 겪었던 시행착오를 기록하고자 합니다.
제일 고민이 많았던 부분으로는 각 서비스간의 통신 방법을 어떻게 하면 좋을지 고민이었습니다.
이슈 : Spring Cloud에서 Kubernetes 마이그레이션 중 서비스 탐색
처음 Spring cloud 프로젝트에서는 Spring Cloud Eureka를 통해 각 마이크로 서비스를 등록하고 서비스의 주소를 Eureka 서버를 통해 등록된 이름으로 찾을 수 있었습니다.
하지만, Spring cloud에서 Kubernetes로 마이그레이션 하는 과정에서 Gateway의 라우팅 주소, 각 서비스의 Open feign url 경로, config server의 위치를 어떻게 탐색할 수 있는지 궁금하였습니다.
저희는 Spring Cloud Gateway를 그대로 Kubernetes에서 로드밸런서로 사용하고, 기존의 Spring Cloud 코드에서 최소한의 코드 변경을 하는 것을 목표로 하였습니다.
여러 자료를 검색해 본 결과, 쿠버네티스에서 지원해주는 dns 주소를 사용하여 통신할 수 있음을 알 수 있었습니다.
문제 : Kubernets Pod, Service 간 통신 방법 이해
쿠버네티스에서는 클러스터 내부에서만 사용 가능한 DNS 주소를 제공합니다. 그래서 Pod간 통신을 할 때 IP가 아닌 도메인을 설정해 두고 사용할 수 있습니다.
클러스터 내부의 실행되는 Spring project의 yaml 파일에 IP 주소가 아닌 dns 주소로 설정하여, 재배포되어 Pod의 IP주소가 계속해서 바뀌는 경우에 일일이 변경할 필요 없이 dns 주소를 통해 통신을 할 수 있습니다.!!!
저희는 Spring Cloud에서 Kubernetes로 마이그레이션 하면서 여러 방법 중 Spring Cloud Discovery Server를 이용하지 않고 K8S의 dns 기능을 사용하여 각 서비스를 연결하였습니다.
다시 정리:
특정 Pod들에 접근할때 dns을 통해서 접근하도록 설정되어 있다면,
Pod에 문제가 생겨서 재생성되거나 배포때문에 재생성 되어 IP가 변경 되더라도 설정 파일을 수정할 필요가 없습니다.
자동으로 dns에 변경된 Pod의 IP가 등록되기 때문에 새로 생서된 Pod쪽으로 연결되어 통신이 이루어집니다.
해결 : Spirng cloud에 Kuberenets service name을 통한 Pod 통신 해결
쿠버네티스 클러스터 내에서 제공하는 dns 사용하기
쿠버네티스에서 제공하는 DNS 서버가 있습니다. Service 이름을 도메인 주소로 사용하여 통신할 수 있으며, 쿠버네티스에서 사용하는 내부 도메인은 Service와 Pod에 대해서 사용할 수 있고 일정한 패턴을 가지고 있습니다.
쿠버네티스 DNS 기능
- kube-system namespace 내에 kube-dns라는 Pod가 존재합니다.
- kube-dns Pod는 dns 서버를 실행하며, 클러스터에서 실행 중인 다른 모든 Pod는 자동으로 이를 사용하도록 구성되어 있습니다.
- 쿠버네티스는 각 컨테이너의 /etc/resolv.conf 파일을 수정하여 위 기능을 수행합니다.
- /etc/resolv.conf 파일은 DNS 서버 설정에 관한 파일입니다.
- Pod에서 실행 중인 프로세스에서 수행된 모든 dns 쿼리는 시스템에서 실행 중인 모든 서비스를 알고 있는 쿠버네티스의 자체 dns 서버가 처리해 줍니다.
kube-dns Pod 확인하기
kubectl get svc kube-dns -n kube-system --show-labels
kube-app=kube-dns 라벨 정보를 이용하여 어떤 Pod가 매핑되었는지 확인하기
kubectl get pod -n kube-system -l k8s-app=kube-dns
예시 : Spring Cloud에서 Kubernetes로 마이그레이션 한 코드 예시
glue-service라는 namespace가 있고, 해당 namespace에 속하는 glue-config 서비스가 있다고 했을 때,
이 서비스에 접근할 수 있는 dns 주소는 glue-config.glue-service.svc.cluster.local입니다.
앞에서부터 순서대로 ‘service name’.’namespace name’. svc.cluster.local을 작성하면 됩니다.
http://glue-config.glue-service.svc.cluster.local:8888
기존 application.yml
spring:
application:
name: discovery
profiles:
active: dev
config:
import: optional:configserver:http://localhost:8888
변경된 application.yml
spring:
application:
name: gateway
profiles:
active: prod
config:
import: optional:configserver:http://glue-config.glue-service.svc.cluster.local:8888
참고레퍼런스
'Infra > Kubernetes' 카테고리의 다른 글
GitOps 기반 Kubernetes 배포 자동화: Argo CD & GitHub 활용법 (0) | 2024.05.20 |
---|---|
[K8S] Kubernetes deployment, service.yaml 코드 분석 및 작성하기 - 쿠버네티스 yaml (0) | 2024.05.20 |
[Kubernetes] 쿠버네티스 클러스터란, kubernetes cluster 이해하기- kakao kubernetes cluster 실습 (0) | 2024.05.20 |
[Kubernetes] 쿠버네티스 컨테이너 동작 흐름 이해하기 - 마스터 노드, 워커 노드 (0) | 2024.04.02 |
[Kubernetes] Kubernetes란, 컨테이너 오케스트레이션이란 - k8s 설명 및 기본 명령어 (0) | 2024.03.08 |
처음에는 Spring Cloud를 통해 MSA 서비스를 개발하였습니다. 이후에 auto scaling, 무중단 배포, 컨테이너 관리를 간편하게 하고자 쿠버네티스를 저희 서비스에 적용해 보기로 하였습니다.
spring cloud로 된 프로젝트를 쿠버네티스로 마이그레이션 하면서 겪었던 시행착오를 기록하고자 합니다.
제일 고민이 많았던 부분으로는 각 서비스간의 통신 방법을 어떻게 하면 좋을지 고민이었습니다.
이슈 : Spring Cloud에서 Kubernetes 마이그레이션 중 서비스 탐색
처음 Spring cloud 프로젝트에서는 Spring Cloud Eureka를 통해 각 마이크로 서비스를 등록하고 서비스의 주소를 Eureka 서버를 통해 등록된 이름으로 찾을 수 있었습니다.
하지만, Spring cloud에서 Kubernetes로 마이그레이션 하는 과정에서 Gateway의 라우팅 주소, 각 서비스의 Open feign url 경로, config server의 위치를 어떻게 탐색할 수 있는지 궁금하였습니다.
저희는 Spring Cloud Gateway를 그대로 Kubernetes에서 로드밸런서로 사용하고, 기존의 Spring Cloud 코드에서 최소한의 코드 변경을 하는 것을 목표로 하였습니다.
여러 자료를 검색해 본 결과, 쿠버네티스에서 지원해주는 dns 주소를 사용하여 통신할 수 있음을 알 수 있었습니다.
문제 : Kubernets Pod, Service 간 통신 방법 이해
쿠버네티스에서는 클러스터 내부에서만 사용 가능한 DNS 주소를 제공합니다. 그래서 Pod간 통신을 할 때 IP가 아닌 도메인을 설정해 두고 사용할 수 있습니다.
클러스터 내부의 실행되는 Spring project의 yaml 파일에 IP 주소가 아닌 dns 주소로 설정하여, 재배포되어 Pod의 IP주소가 계속해서 바뀌는 경우에 일일이 변경할 필요 없이 dns 주소를 통해 통신을 할 수 있습니다.!!!
저희는 Spring Cloud에서 Kubernetes로 마이그레이션 하면서 여러 방법 중 Spring Cloud Discovery Server를 이용하지 않고 K8S의 dns 기능을 사용하여 각 서비스를 연결하였습니다.
다시 정리:
특정 Pod들에 접근할때 dns을 통해서 접근하도록 설정되어 있다면,
Pod에 문제가 생겨서 재생성되거나 배포때문에 재생성 되어 IP가 변경 되더라도 설정 파일을 수정할 필요가 없습니다.
자동으로 dns에 변경된 Pod의 IP가 등록되기 때문에 새로 생서된 Pod쪽으로 연결되어 통신이 이루어집니다.
해결 : Spirng cloud에 Kuberenets service name을 통한 Pod 통신 해결
쿠버네티스 클러스터 내에서 제공하는 dns 사용하기
쿠버네티스에서 제공하는 DNS 서버가 있습니다. Service 이름을 도메인 주소로 사용하여 통신할 수 있으며, 쿠버네티스에서 사용하는 내부 도메인은 Service와 Pod에 대해서 사용할 수 있고 일정한 패턴을 가지고 있습니다.
쿠버네티스 DNS 기능
- kube-system namespace 내에 kube-dns라는 Pod가 존재합니다.
- kube-dns Pod는 dns 서버를 실행하며, 클러스터에서 실행 중인 다른 모든 Pod는 자동으로 이를 사용하도록 구성되어 있습니다.
- 쿠버네티스는 각 컨테이너의 /etc/resolv.conf 파일을 수정하여 위 기능을 수행합니다.
- /etc/resolv.conf 파일은 DNS 서버 설정에 관한 파일입니다.
- Pod에서 실행 중인 프로세스에서 수행된 모든 dns 쿼리는 시스템에서 실행 중인 모든 서비스를 알고 있는 쿠버네티스의 자체 dns 서버가 처리해 줍니다.
kube-dns Pod 확인하기
kubectl get svc kube-dns -n kube-system --show-labels
kube-app=kube-dns 라벨 정보를 이용하여 어떤 Pod가 매핑되었는지 확인하기
kubectl get pod -n kube-system -l k8s-app=kube-dns
예시 : Spring Cloud에서 Kubernetes로 마이그레이션 한 코드 예시
glue-service라는 namespace가 있고, 해당 namespace에 속하는 glue-config 서비스가 있다고 했을 때,
이 서비스에 접근할 수 있는 dns 주소는 glue-config.glue-service.svc.cluster.local입니다.
앞에서부터 순서대로 ‘service name’.’namespace name’. svc.cluster.local을 작성하면 됩니다.
http://glue-config.glue-service.svc.cluster.local:8888
기존 application.yml
spring:
application:
name: discovery
profiles:
active: dev
config:
import: optional:configserver:http://localhost:8888
변경된 application.yml
spring:
application:
name: gateway
profiles:
active: prod
config:
import: optional:configserver:http://glue-config.glue-service.svc.cluster.local:8888
참고레퍼런스
'Infra > Kubernetes' 카테고리의 다른 글
GitOps 기반 Kubernetes 배포 자동화: Argo CD & GitHub 활용법 (0) | 2024.05.20 |
---|---|
[K8S] Kubernetes deployment, service.yaml 코드 분석 및 작성하기 - 쿠버네티스 yaml (0) | 2024.05.20 |
[Kubernetes] 쿠버네티스 클러스터란, kubernetes cluster 이해하기- kakao kubernetes cluster 실습 (0) | 2024.05.20 |
[Kubernetes] 쿠버네티스 컨테이너 동작 흐름 이해하기 - 마스터 노드, 워커 노드 (0) | 2024.04.02 |
[Kubernetes] Kubernetes란, 컨테이너 오케스트레이션이란 - k8s 설명 및 기본 명령어 (0) | 2024.03.08 |