
이런 문제를 해결하기 위해 쿠버네티스가 제공하는 것이 바로 Service이다.
쿠버네티스 공식 홈페이지 (Service에 대한 설명)
“서비스는 외부와 접하는 단일 엔드포인트 뒤에서 클러스터 내에서 실행되는 애플리케이션을 노출시키며, 이는 워크로드가 여러 백엔드로 나뉘어 있는 경우에도 가능하다.”
처음 들으면 조금 어려운 말처럼 보이지만, 결국 의미는 같다.
-> 즉, 여러 개의 파드(백엔드)가 실제로 존재하더라도 사용자는 그 모든 파드를 일일이 구분할 필요 없이, 단일한 서비스 엔드포인트를 통해 접근할 수 있다는 뜻이다.
ex)마치 여러 명의 직원이 근무하는 콜센터를 하나의 대표 전화번호로 연결하듯이, Service는 파드 집합을 대표하는 안정된 연결 창구 역할을 한다.
쿠버네티스에서 서비스는 파드의 논리적 집합, 그리고 그것에 접근할 수 있는 정책에 대해 정의하는 "추상적 개념"이다.
서비스가 대상으로 하는 파드집합은 일반적으로 selector가 결정한다.
(selector를 쓰지 않는 서비스도 있다. 이는 밑에서 추가적으로 다룰 것이다.)
쿠버네티스 공식 홈페이지 인용
예를 들어, 3개의 레플리카로 실행되는 스테이트리스 이미지-처리 백엔드를 생각해보자. 이러한 레플리카는 대체 가능하다. 즉, 프론트엔드는 그것들이 사용하는 백엔드를 신경쓰지 않는다. 백엔드 세트를 구성하는 실제 파드는 변경될 수 있지만, 프론트엔드 클라이언트는 이를 인식할 필요가 없으며, 백엔드 세트 자체를 추적해야 할 필요도 없다. 서비스 추상화는 이러한 디커플링을 가능하게 한다.
쿠버네티스 공식 홈페이지에는 이렇게 나와있다.
말이 굉장히 어렵게 들리지만 조금씩 뜯어서 해석해보면 다음과 같다.
일단 디커플링에 대한 설명은 아래에서 확인할 수 있으며,
이미지를 처리하는 백엔드 서버를 3개(레플리카3개)를 띄워놓았다고 가정한다면
이 서버들은 모두 한 역할을 하기 때문에 어느 서버(파드)가 일을 하든 상관이 없다
-> 즉, 하나가 죽고 새로 만들어져도 프론트엔드(요청을 보내는 쪽)에서는
"어떤 서버가 실제로 일하고 있는지"를 알 필요가 없다는 것이다.
쿠버네티스의 Service는 이렇게 디커플링을 가능하게 해주는데,
-> 실제 파드가 바뀌더라도 프론트엔드는 항상 같은 주소(DNS name)로 요청을 보낼 수 있게 하여
서로 직접 연결 상태를 관리하지 않아도 되게 해준다.
서비스에 대한 한마디 정리
서비스는 백엔드 파드들이 바뀌어도 프론트엔드(연결을 보내는 쪽)가 끊김 없이 연결될 수 있도록 도와주는 역할을 한다.
디커플링(Decoupling) vs 커플링(Coupling)
- 디커플링 : '결합을 느슨하게 만든다'라는 것이다.
즉, 한쪽이 바뀌어도 다른 쪽이 영향을 받지 않도록 분리하는 것을 말한다.
ex)프론트엔드가 백엔드의 구체적인 IP나 구조를 몰라도 요청을 보낼 수 있다면,
이건 “디커플링”이 잘 되어 있는 상태다.- 커플링 : '결합되어 있다'라는 것이다.
즉, 한쪽이 바뀌면 다른 쪽도 영향을 받는 상태를 말한다.
ex)프론트엔드가 백엔드 파드의 IP주소를 직접 알고 있어야 통신이 가능하다면,
백엔드의 파드가 새로 만들어질 때마다 프론트엔드 코드를 수정해야 한다.
링크: 셀렉터가 없는 서비스
에서 그 예시를 확인할 수 있다.
정리해보자면
참고자료
[쿠버네티스 공식 홈페이지 - Service]
https://kubernetes.io/ko/docs/concepts/services-networking/service/
[CNF - 8.2 서비스 (Service): 파드 집합에 대한 안정적인 엔드포인트 제공]
https://www.cncf.co.kr/ebook/kubernetes/part-3-mastering-core-kubernetes-objects/chapter-8-service-discovery-and-networking/8-2-kubernetes-service/