[Kubernetes] Kubernetes 네트워크 서비스와 파드 연결 방식

Kubernetes 네트워크 서비스와 파드 연결 방식

Kubernetes에서 서비스(Service)는 파드(Pod)와 외부 혹은 내부 트래픽 사이를 연결해주는 네트워크 추상화입니다. 파드는 유동적인 IP를 가지기 때문에 직접 접근이 어려우며, 서비스는 이를 해결하기 위해 안정적인 접근 지점과 로드밸런싱 기능을 제공합니다.

이번 글에서는 Kubernetes에서 지원하는 대표적인 서비스 타입인 ClusterIP, NodePort, LoadBalancer에 대해 이미지와 함께 알아보겠습니다.

 

1. 서비스(Service)의 역할

서비스는 클러스터 내부 또는 외부의 클라이언트가 파드에 안정적으로 접근할 수 있도록 돕는 네트워크 프록시 역할을 합니다. 주요 기능은 다음과 같습니다:

  • 단일 접근 지점 제공: 파드 IP가 동적으로 바뀌더라도 고정된 접근 주소 제공
  • 로드밸런싱: 동일한 레이블을 가진 여러 파드에 트래픽을 분산
  • 서비스 디스커버리: DNS를 통한 서비스 이름으로 파드에 접근 가능

 

 

2. ClusterIP

ClusterIP는 Kubernetes의 기본 서비스 타입으로, 클러스터 내부에서만 접근할 수 있는 가상 IP를 제공합니다.

동작 방식:

  • 서비스가 10.101.199.109:80 주소로 노출됨
  • 테스트 파드(10.244.2.2)는 이 주소로 요청을 전송
  • 서비스는 연결된 파드(10.244.2.3, app: nginx 라벨 보유)로 요청을 전달
  • 외부에서는 접근 불가능, 내부 서비스 간 통신용으로 사용

활용 예:

  • 백엔드 파드 간 통신
  • 마이크로서비스 간 내부 API 호출

구성 예시:

# vi clusterip-pod.yaml
apiVersion: v1
kind: Service
metadata:
  name: clusterip-pod
spec:
  type: ClusterIP
  selector:
    app: nginx-pod
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80  # pod 포트, 컨테이너 포트 같아야 함.

 

 

3. NodePort

NodePort는 클러스터 외부에서 특정 포트를 통해 서비스에 접근할 수 있도록 해주는 방식입니다.

동작 방식:

  • 각 노드의 IP와 고정된 포트(30001)를 통해 서비스에 접근 가능
  • 내부적으로는 ClusterIP로 전달되고, 다시 해당 파드로 트래픽이 전달됨
  • 여러 노드 중 어느 노드에 접속하든 서비스는 동일하게 동작

예시 흐름:

  1. 사용자가 http://10.10.50.51:30001로 요청
  2. 해당 요청은 ClusterIP(10.111.239.70:80)로 전달
  3. ClusterIP는 레이블 app: nginx를 가진 파드 중 하나로 요청을 라우팅

활용 예:

  • 테스트 또는 개발 환경에서 외부 접근이 필요할 때
  • 간단한 로드밸런싱이 필요할 때

구성 예시:

# vi nodeport-pod.yaml
apiVersion: v1
kind: Service
metadata:
  name: nodeport-pod
spec:
  type: NodePort
  selector:
    app: nginx-pod
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
    nodePort: 30001

 

 

4. LoadBalancer

LoadBalancer는 클라우드 환경에서 외부 로드밸런서를 자동으로 생성하여 서비스에 대한 공용 IP 주소를 할당합니다.

동작 방식:

  • 클라우드 제공자의 로드밸런서가 생성되고, 외부 요청은 공용 IP를 통해 들어옴 (포트번호를 안붙여도 접속 됨)
  • 로드밸런서는 ClusterIP를 통해 내부 파드로 요청을 전달
  • 내부 구조는 NodePort와 유사하지만, 클라우드 로드밸런서를 통한 자동 트래픽 분산

특징:

  • NodePort + 외부 로드밸런서의 결합 형태
  • 사용자 입장에서는 단일 공용 IP로 접근 가능
  • GCP, AWS, Azure 등 클라우드 환경에서만 사용 가능
  • 클라우드 환경이 아닌경우 별도의 설정 필요
    • MetalLB 사용 (가장 일반적인 해결책): Kubernetes 네이티브 로드밸런서 애드온으로 온프레미스 환경에서 LoadBalancer 타입 서비스를 지원해줌
    • Ingress + Ingress Controller(Nginx Ingress): 외부 HTTP(S) 트래픽을 한 곳으로 모은 뒤, 클러스터 내부에 라우팅하는 방식
    • 외부 프록시 직접 구성(HAProxy, Nginx): 클러스터 외부에 HAProxy, Nginx, Traefik 등을 별도로 구성하고, Kubernetes의 노드의 NodePort로 트래픽을 프록시하거나 로드밸런싱할 수 있음 

활용 예:

  • 외부 공개 웹 서비스
  • 트래픽이 많은 프로덕션 환경

구성 예시:

# vi loadbalancer-pod.yaml
apiVersion: v1
kind: Service
metadata:
  name: loadbalancer-pod
spec:
  type: LoadBalancer
  externalIPs:           # Onpremiss 구성
  - 10.178.0.2           # Nginx가 배포된 worker node의 IP로 외부 접근 가능하게 설정
  selector:
    app: nginx-pod
  ports:
  - protocol: TCP
    port: 80             # Cluster IP의 port
    targetPort: 80       # web의 port
    nodePort: 30001

 

 

5. 정리

서비스 타입 접근 범위 사용 예시
ClusterIP 클러스터 내부 내부 마이크로서비스 통신
NodePort 외부에서 접근 가능 (노드 IP + 포트) 테스트, 로컬 클러스터 외부 접근
LoadBalancer 외부에서 접근 가능 (공용 IP) 프로덕션 환경의 외부 서비스
 

 

마치며

Kubernetes의 네트워크 서비스는 단순한 연결 이상의 역할을 수행하며, 가용성, 유연성, 확장성 측면에서도 핵심적인 역할을 합니다. 서비스 타입에 따라 적절한 네트워크 전략을 선택하면 안정적이고 효율적인 애플리케이션 운영이 가능합니다.