Kubernetes 네트워킹 - Service와 요청 처리 흐름

Service의 역할

Service는 Pod에 트래픽을 보내는 방식을 정의한다.

  • 안정적인 IP/DNS 제공: ClusterIP를 통해 Pod IP가 바뀌어도 항상 같은 주소로 접근 가능
  • 로드밸런싱: 여러 Pod에 트래픽을 분산
  • 서비스 디스커버리: 다른 서비스가 이 서비스를 이름으로 찾을 수 있게 함

Service 타입 비교

타입 접근 범위 사용 사례
ClusterIP 클러스터 내부만 내부 마이크로서비스 통신
NodePort 노드 IP:Port 개발/테스트, 간단한 외부 노출
LoadBalancer 외부 LB 프로덕션 외부 노출 (클라우드 환경)

이 세 타입은 계층 구조로 되어있다.

LoadBalancer는 내부적으로 NodePort를 만들고, NodePort는 내부적으로 ClusterIP를 만든다.


외부 요청 처리 흐름

외부에서 요청이 들어오면 다음 경로로 처리된다.

[외부 인터넷]
↓
[LoadBalancer Service]  ← 클라우드 로드밸런서 (L4: IP/포트 레벨)
↓  "이 IP:443으로 오는 거 클러스터로 보내"
[Ingress Controller]  ← 실제 트래픽 처리 엔진 (nginx 등)
↓
[Ingress 규칙]  ← 도메인/경로 기반 라우팅 (L7: URL 레벨)
↓  "api.myapp.com → 백엔드 Service"
[Service]  ← 파드로 연결
↓
[Pod]

중요한 개념들

API Server는 실제 트래픽을 처리하지 않는다

컨트롤 플레인의 API Server가 모든 요청을 받아서 나눠준다고 오해하기 쉽다. 하지만 API Server의 역할은 클러스터 운영/조율을 위한 내부 관리다.

  • 파드를 어디에 띄울지, 몇 개를 유지할지 같은 관리 명령이 API Server를 통한다
  • 실제 사용자 요청은 API Server를 거치지 않고 Ingress → Service → Pod 경로로 처리된다

Ingress Controller와 Ingress 규칙은 다르다

Ingress 규칙은 설정 파일일 뿐이다. 컨트롤러가 없으면 그냥 텍스트 파일이다.

Ingress Controller(nginx 등)가 그 규칙을 읽고 실제 nginx 설정을 만들어야 라우팅이 수행된다.


LoadBalancer vs Ingress: L4 vs L7

  역할 레벨
LoadBalancer 외부 IP 부여, 트래픽 진입점 L4 (IP/포트)
Ingress Controller 실제 라우팅 엔진 (nginx 등) L7 (HTTP)
Ingress 규칙 “어떤 도메인/경로를 어디로” 정의 설정

NodePort는 외부에서 서버IP:포트번호로 직접 접근할 때 쓰는 방식인데, Ingress를 쓰면 NodePort를 직접 노출할 필요가 없다.


서비스 디스커버리

파드가 다른 서비스를 어떻게 찾아서 통신하는가?

쿠버네티스는 클러스터 안에 CoreDNS라는 DNS 서버를 띄운다. 서비스를 만들면 자동으로 서비스 이름이 DNS에 등록된다.

  • 같은 네임스페이스 내에서는 서비스 이름만으로 접근 가능
    http://backend-service
    
  • 다른 네임스페이스에서는 FQDN 사용
    http://backend-service.my-namespace.svc.cluster.local
    

ClusterIP는 클러스터 내부에서만 쓰는 가상 IP로, 서비스를 만들면 자동으로 부여된다. 이 가상 IP와 DNS가 함께 동작하여 Pod IP가 바뀌어도 항상 안정적으로 접근할 수 있다.