skarltjr / Memory_Write_Record

나의 모든 학습 기록
0 stars 0 forks source link

쿠버네티스 파드간 통신을 위한 DNS #66

Open skarltjr opened 2 years ago

skarltjr commented 2 years ago

상황 :

다음 프로젝트를 쿠버네티스로 배포해보고자 계획중
여기서 한가지 고민이 생겼는데
스프링부트 애플리케이션 deployment-replica 2 / 데이터베이스 deployment-replica 1를 구성한다고 했을 때
과연 스프링부트 애플리케이션에 datasource정보를 어떻게 전달할것인가?

- 3개의 워커노드를 활용한다고 했을 때 나는 데이터베이스파드가 어디에 생성될지 예측할 수 없다.
- 물론 무조건 데이터베이스를 먼저 띄우고 매번 수정해서 애플리케이션을 띄울 순 있겠지만.. 이는 근본적인 해결법이 아니라고 생각
- 추가로 db컨테이너가 어디에 뜰 지 지정해줄 수 있다면 데이터베이스 컨테이너가 스프링부트 애플리케이션보다 늦게 뜨는건 restart always를 통해 해결할 수 있다고 생각

해결법


예시

apiVersion: v1 kind: Service metadata: annotations: kompose.cmd: kompose convert kompose.version: 1.26.0 (HEAD) creationTimestamp: null labels: io.kompose.service: mongodb name: mongodb spec: ports:

ex)

  1. hostname을 my_mysql로 가지는 mysql service를 생성하고 ( metadata.name:my_mysql)
  2. application.yml에서 datasource 정보를 url: jdbc:mysql://{my_mysql}:3306/xxx처럼 사용하면
  3. 환경변수 사용없이 알아서 쿠버네티스 dns를 통해 반환된 mysql의 ip를 활용
    예상

    spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://{mysql}:3306/xxx

....


- 위처럼 yml설정 후 
- db 디플로이먼트 yaml에서 metadata.name을 mysql로 설정해준다면 기대하는 동작을 보일것이라고 생각
- 추후 직접 적용하며 이슈 마무리하기

참고 : 
https://kubernetes.io/ko/docs/concepts/services-networking/dns-pod-service/
https://github.com/ggingmin/kube-springboot-sampleapp
https://stackoverflow.com/questions/63069013/passing-external-application-property-values-to-kubernetes-deployments

- ![스크린샷 2022-02-08 오전 12 57 49](https://user-images.githubusercontent.com/62214428/152823987-1232ee98-9b64-42c8-aecc-6d865250ee59.png)