Hunny's Daily

개발과 일상에서의 달콤한 순간들을 기록하며, 유용한 팁과 인사이트를 공유합니다.

Kubernetes Service 개념 정리

Pod가 아닌 Service로 통신해야 하는 이유

Kubernetes에서 애플리케이션을 배포하면 실제로 요청을 처리하는 단위는 Pod다. 그러나 운영 환경에서는 Pod에 직접 접근하지 않는다. Kubernetes는 Pod 앞단에 Service라는 리소스를 두고, 이를 통해 안정적인 통신 구조를 제공한다. 이 글에서는 Kubernetes Service의 기본 개념과 왜 Service가 필요한지를 중심으로 정리한다.


Kubernetes Service란 무엇인가

Service는 Pod 집합에 대한 고정된 접근 지점을 제공하는 Kubernetes 리소스다.
Pod는 생성과 삭제가 빈번하고 IP가 고정되지 않기 때문에, 외부나 다른 서비스가 Pod에 직접 접근하는 것은 적절하지 않다.

Service는 다음 역할을 수행한다.

  • Pod IP 변경과 무관한 고정 엔드포인트 제공
  • 여러 Pod에 대한 트래픽 분산
  • 서비스 간 통신 표준화

즉, Service는 Pod를 대신해 통신의 진입점 역할을 한다.


Pod에 직접 접근하면 안 되는 이유

Kubernetes에서 Pod는 다음과 같은 특성을 가진다.

  • 언제든지 재생성될 수 있음
  • 재생성 시 IP 변경
  • 스케줄링에 따라 노드가 바뀔 수 있음

이러한 특성 때문에 Pod IP를 기준으로 통신 구조를 만들면 운영 안정성이 크게 떨어진다. Service는 이 문제를 해결하기 위한 abstraction이다.


Service와 Label Selector

Service는 Label Selector를 사용해 자신이 관리할 Pod를 결정한다.

일반적인 흐름은 다음과 같다.

  • Deployment가 Label을 가진 Pod 생성
  • Service가 동일한 Label을 Selector로 지정
  • 해당 Pod들이 Service의 대상이 됨

이를 통해 Pod가 교체되더라도 Service는 자동으로 새로운 Pod를 대상으로 트래픽을 전달한다.


Kubernetes Service의 동작 방식

Service가 생성되면 Kubernetes는 내부적으로 다음을 수행한다.

  • Service에 고유한 Cluster IP 할당
  • Selector에 매칭되는 Pod 목록 관리
  • 트래픽을 Pod로 분산 전달

클라이언트는 Service IP만 알면 되고, 실제 Pod의 위치나 개수는 Kubernetes가 관리한다.


Service 타입 개요

Kubernetes는 여러 Service 타입을 제공한다. 각각 사용 목적이 다르다.

  • ClusterIP
  • NodePort
  • LoadBalancer
  • ExternalName

이 중 대부분의 내부 통신은 ClusterIP를 사용한다.


ClusterIP Service

ClusterIP는 클러스터 내부에서만 접근 가능한 Service다.
기본 Service 타입이며, 서비스 간 통신에 주로 사용된다.

특징은 다음과 같다.

  • 외부 접근 불가
  • 클러스터 내부 DNS로 접근
  • 가장 일반적인 사용 방식

MSA 환경에서 서비스 간 호출은 대부분 ClusterIP 기반으로 이루어진다.


NodePort Service

NodePort는 모든 노드의 특정 포트를 열어 Service에 접근할 수 있도록 한다.

특징은 다음과 같다.

  • 노드 IP + 포트로 접근
  • 외부 접근 가능
  • 포트 범위 제한 존재

테스트 환경이나 간단한 외부 노출 용도로 사용되지만, 운영 환경에서는 단독 사용이 드물다.


LoadBalancer Service

LoadBalancer는 클라우드 환경에서 외부 로드밸런서를 생성해 Service를 노출한다.

특징은 다음과 같다.

  • 클라우드 제공자의 로드밸런서와 연동
  • 외부 접근에 적합
  • 비용 발생 가능

운영 환경에서 외부 트래픽을 받는 경우 자주 사용된다.


ExternalName Service

ExternalName은 Kubernetes 외부의 서비스에 이름을 부여하는 용도다.

  • 실제 트래픽 전달 없음
  • DNS 레벨에서 외부 주소로 매핑

외부 API나 레거시 시스템을 내부 서비스처럼 다루고 싶을 때 사용된다.


Service와 Deployment의 관계

Deployment는 Pod의 생명주기를 관리하고, Service는 그 Pod에 접근하는 방식을 정의한다.
두 리소스는 역할이 명확히 분리되어 있다.

  • Deployment: 실행과 유지
  • Service: 접근과 통신

이 분리가 Kubernetes의 확장성과 유연성을 만든다.


Service를 사용할 때 자주 발생하는 문제

다음과 같은 문제가 자주 발생한다.

  • Label Selector 불일치로 트래픽 전달 실패
  • Readiness Probe 미설정으로 비정상 Pod에 트래픽 전달
  • Service 타입 선택 오류

특히 Readiness Probe가 없으면 Service는 준비되지 않은 Pod에도 트래픽을 전달할 수 있다.


어떤 경우에 Service 이해가 중요한가

Service 개념에 대한 이해는 다음 상황에서 필수다.

  • MSA 기반 서비스 간 통신
  • 외부 트래픽을 클러스터로 유입하는 구조
  • Ingress를 사용하는 환경
  • 무중단 배포와 트래픽 제어

Service는 Kubernetes 네트워크의 기본 단위다.


정리

Kubernetes Service는 Pod의 불안정한 특성을 감추고, 안정적인 통신 구조를 제공하는 리소스다. Pod 대신 Service를 기준으로 통신을 설계해야 Kubernetes의 장점을 제대로 활용할 수 있다. Deployment 다음 단계로 Service를 이해하면, Kubernetes 네트워크 구조가 훨씬 명확해진다.