IT,프로그래밍/Devops

[K8S] 왜 다른종류의 pod를 같은 service에 두면 안될까?

오늘 회사에서 질문을 받았는데 너무나도 근원적인 질문이라서 답변을 시원하게 하지 못하였습니다.

상황은 아래와 같았습니다

 


wordpress + mysql을 사용하는 어플리케이션을 만든다고 가정해보겠습니다.

 

제가 알고있는 바로는

 

wordpress pod와 WP-svc라는 서비스가 있고,

mysql pod와 mysql-svc라는 서비스가 있어서

요청을 보낼때 mysql-svc에 요청을 보내는게 일반적으로 알고 있습니다.

 

하지만 오늘 받은 질문은이랬습니다

mysql pod를 WP-svc 로 함께 묶어서 쓰면되지,
왜 굳이 mysql-svc라는 서비스를 따로 만들어서 구조를 복잡하게 가져가냐?

 

이게 틀리다는걸 알면서도 명쾌한 답을 낼수가 없었어서 답답했습니다

 

따라서 저의 질문은 아래 3가지 항목으로 정리가 될것같습니다.

 

1. 서비스와 pod는 어떤 기준으로 묶는지

 

2. 위의 예제에서 왜 mysql과 wordpress가 같은 service에 있으면 안되는지

 

3. 저 구조가 복잡하다는 말이 왜 틀렸는지


위의 질문내용을 검색, 질문하며 정리했기에 적어두려고 합니다.

 

 

이제 하나씩 질문의 답변을 설명하겠습니다.


1. 서비스와 pod는 어떤 기준으로 묶는지

 

기본적으로 먼저 pod와 service의 개념에 대해서 알아야하는데, pod는 상황에 따라서

자동적으로 생성되기도, 삭제 되기도 합니다.

 

이때 마다 pod는 새로운 IP를 부여 받기 때문에 매번 추적을 하기가 힘듭니다.

따라서, Service를 이용해서 특정 pod에 추적이 되도록 합니다.

Service의 Ip는 고정이 되어있기 때문입니다.

 

여기에서, 서비스는 2가지 역할이 있습니다.

  1. 서비스 디스커버리 : 위에서 설명드린대로 생성되고 사라지는 pod를 service이름으로 자동으로 찾을수 있게 해줍니다
  2. 로드밸런싱 : 기본적으로 확률방식의 로드밸런싱을 제공합니다.

위의 이유로 서비스는 같은 역할(같은서비스)을 묶어서 로드밸런싱과 dns서비스를 같이 할때 묶습니다.

 

2. 위의 예제에서 왜 mysql과 wordpress가 같은 service에 있으면 안되는지

 

같은 word-svc라는 service에 mysql pod와 wordpress pod가 함께 존재한다고 가정해봅시다.

word-svc에 요청이 오게 될경우 로드밸런싱에 따라 한번은 mysql pod로, 한번은 wordpress pod로 요청이 가게 될겁니다.

 

만일, 운이 좋아서 wordpress로 간요청은 받아지겠지만 mysql로 가게된 요청은 작동을 아해서 문제를 일으킬겁니다.

또한, 1번에서 말한대로 같은 pod여야 하지만 Mysql과 Wordpress는 전혀 수평적으로 동일하지 않습니다.

 

따라서, 같은 service로 구현되면 안됩니다.

 

 

추가로 1개의 service에 다수의 pod를 묶는게 가능합니다

 

하지만 이것을 사용할때는 단일종류의 pod를 다수의 port를 사용하고자 할때 사용하는것이지

절대 다른 종류의 pod를 한개의 service에 연결하기 위함이 아닙니다

 

 

위의 이유들로 service에대해 정리를 해보자면 아래와 같이 정의될 수 있습니다.

 

  1. 1개의 endpoint 이다.
  2. 같은 pod를 묶어서 접근을 추상화 할수있는 방법이다.
  3. 생성되고 삭제되는 pod를 자동 디스커버리 해주기 위에 pod 앞단에 사용한다.
  4. 만일 다른 성격의 pod라고 한다면 다른 service로 분류하는것이 맞다.

3. 저 구조가 복잡하다는 말이 왜 틀렸는지

 

pod에 service를 붙이는것은 결합도를 느슨하게합니다(디커플링)

따라서 pod에 무슨일이 있던 (생성 및 삭제) 요청을 보내는 쪽은 service를 보게 되기 때문에 요청의 추상화가 가능해집니다.

 

하지만, 1개의 service에 다른 2개의 pod를 붙이게 되면 강결합이 되버립니다.

이때, 변화에 약해져서 취약하게 됩니다.

 

또 하나, 기본적으로 K8S는 MSA를 지향합니다.

 

따라서, pod를 전부다 묶어버리는 방법도 가능은 하지만 이것은 더 이상 MSA가 아닌 모놀리식 구조가 됩니다.

 

그렇기에 전부다 하나를 묶는다면 근본적으로 쿠버네티스를 사용할 이유가 없어지게 됩니다.


 

처음엔 다소 황당한 질문이었지만 덕분에 약했던 개념을 훨씬 단단하게 다질수 있었던 계기가 되었습니다!

 

공부하는 중이기에 틀린내용이 있을수도 있습니다!
관련된 태클 언제나 환영입니다! :)