본문 바로가기
Cloud/Kubernetes

kubernetes nodeport 동작원리 - iptables기반

by _Nate 2025. 2. 8.
반응형

Kubernetes에서 NodePort 서비스는 클러스터 외부에서 내부 서비스로 접근할 수 있도록 해주는 중요한 기능이다.

이 글에서는 NodePort 서비스가 iptables를 기반으로 어떻게 동작하는지 분석하고, 실제로 iptables에 등록되는 규칙들을 살펴본다.


1. NodePort란?

Kubernetes에서 Service를 생성할 때 type: NodePort로 설정하면, 클러스터의 각 노드가 특정 포트를 열어 외부 트래픽을 서비스로 전달할 수 있습니다. NodePort의 기본 동작 방식은 다음과 같다.

  1. 클러스터 내의 각 노드는 동일한 NodePort를 open
  2. 외부에서 해당 NodePort로 요청하면, 해당 요청이 내부의 Pod로 라우팅
  3. iptables 또는 IPVS를 사용하여 트래픽을 서비스의 백엔드(Pod)로 전달

 

2. iptables 기반 NodePort 동작 원리

Kubernetes의 kube-proxy가 iptables 규칙을 자동으로 설정하여 NodePort 트래픽을 처리한다.

실제 iptables를 확인하면서 NodePort의 동작을 살펴보자.

2.1 NodePort 서비스 생성

먼저 NodePort 서비스를 생성한다.

apiVersion: v1
kind: Service
metadata:
  name: my-nodeport-service
spec:
  selector:
    app: my-app
  type: NodePort
  ports:
    - protocol: TCP
      port: 80      # 서비스 내부 포트
      targetPort: 80 # Pod에서 사용하는 포트
      nodePort: 30080 # 노드에서 열리는 포트

이제 해당 서비스가 어떻게 iptables에 등록되는지 확인해보자.

 

2.2 iptables 규칙 확인

iptables-save 명령어를 사용하여 관련된 규칙을 찾을 수 있다.

iptables-save | grep 30080

출력 예시는 다음과 같다.

-A KUBE-SERVICES ! -s 10.244.0.0/16 -d 10.96.0.10/32 -p tcp -m tcp --dport 30080 -j KUBE-MARK-MASQ
-A KUBE-SERVICES -d 10.96.0.10/32 -p tcp -m tcp --dport 30080 -j KUBE-NODEPORTS
-A KUBE-NODEPORTS -p tcp -m tcp --dport 30080 -j KUBE-SVC-XXXXX

위 규칙을 하나씩 분석해 보면

  1. KUBE-SERVICES 체인의 첫 번째 규칙:
    • 외부 IP에서 들어오는 요청이라면 KUBE-MARK-MASQ 체인으로 보내서 SNAT 처리를 한다.
    • SNAT : Source IP를 실제 Client가 아닌 Node의 IP로 변경. 실제 Client의 IP가 유지될 경우 pod가 응답을 실제 Client에게 직접 전달할 수 있기 때문에 변경 필요.
  2. KUBE-SERVICES 체인의 두 번째 규칙:
    • 목적지가 서비스의 클러스터 IP(10.96.0.10)이고 NodePort(30080)로 접근하면 KUBE-NODEPORTS 체인으로 보냄.
  3. KUBE-NODEPORTS 체인:
    • 30080 포트의 패킷을 KUBE-SVC-XXXXX 체인으로 전달하여 실제 Pod로 트래픽을 라우팅

 

2.3 KUBE-SVC 및 DNAT 동작

이제 KUBE-SVC-XXXXX 체인으로 전달된 패킷이 어떻게 처리되는지 확인해 보면

-A KUBE-SVC-XXXXX -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-YYYYY
-A KUBE-SVC-XXXXX -j KUBE-SEP-ZZZZZ

위 규칙에서, KUBE-SVC-XXXXX 체인은 라운드 로빈 방식으로 KUBE-SEP-YYYYYKUBE-SEP-ZZZZZ 중 하나로 트래픽을 전달된다.

KUBE-SEP-YYYYY 체인은 특정 Pod로 트래픽을 전달하는 DNAT 규칙을 포함한다.

  • DNAT : Destination의 IP를 pod의 IP로 변경
-A KUBE-SEP-YYYYY -s 10.244.1.5/32 -j KUBE-MARK-MASQ
-A KUBE-SEP-YYYYY -p tcp -m tcp -j DNAT --to-destination 10.244.1.5:80

위 규칙을 보면 최종적으로 요청이 Pod의 IP(예: 10.244.1.5)와 포트(80)로 전달된다.

 

3. 정리

  1. 외부에서 노드의 IP와 NodePort(예: http://<node-ip>:30080)로 요청이 들어옴.
  2. iptables의 KUBE-NODEPORTS 체인에서 해당 트래픽을 KUBE-SVC-XXXXX 체인으로 보냄.
  3. KUBE-SVC-XXXXX에서 라운드 로빈 방식으로 특정 Pod로 트래픽을 전달.
  4. 최종적으로 DNAT 규칙에 의해 요청이 해당 Pod의 IP와 포트로 변경되어 전달됨.

iptables를 기반으로 NodePort 서비스가 동작하는 원리를 분석할 수 있습니다.

Kubernetes에서 트래픽이 어떻게 흐르는지 이해하는 데 도움이 되기를 바랍니다!

반응형