ClusterIP - ExternalIPs 서비스는 "지정한 노드"에서 수신한 트래픽만 특정 파드로 연결해준다고 하였다. NodePort 서비스는 약간 다르게, "전체 노드"에서 수신한 트래픽을 특정 파드로 연결해준다.
NodePort 서비스를 생성하면 내부적으로는 파드 네트워크에서 목적지 파드로 트래픽을 전달하는 ClusterIP 가 생성되며(실제 서비스가 생성되는 것은 아니고, NAT 규칙이 생성되는 개념임), kube-proxy 가 관리하는 NAT 규칙에 ClusterIP 를 거치도록 명시된다.
NodePort → ClusterIP → Pod
NodePort 생성시 아래와 같은 개념으로 clusterIP 속성이 지정된다.
Service A (type=NodePort)
└─ spec.clusterIP: 10.x.x.x (자동 생성)
NodePort 는 지정한 포트를 Listen 하고있으며, 외부에서 Node 의 해당 포트로 접속하면 NodePort 가 트래픽을 ClusterIP 로 전달해주는 형태로 작동한다. ClusterIP 서비스가 받은 트래픽을 어떻게 목적지 파드로 분배하는지는 ClusterIP 서비스 에서 설명하였다.
1. 생성하기
아래 매니페스트로 NodePort 서비스를 생성한다.
apiVersion: v1
kind: Service
metadata:
name: sample-nodeport
spec:
type: NodePort
ports:
- name: "http-port"
protocol: "TCP"
port: 8080
targetPort: 80
nodePort: 30080
selector:
app: sample-app
spec.ports[] 의 각 항목은 아래와 같은 의미를 가진다.
| 항목 | 의미 |
| spec.ports[].nodePort | 모든 노드 IP에서 수신할 Port 번호 |
| spec.ports[].port | ClusterIP 에서 수신할 Port 번호 |
| spec.ports[].targetPort | 목적지 파드(컨테이너) 포트 번호 |
그림으로 보면 아래와 같은 구역에서 수신하는 포트이다.

아래 커맨드로 생성된 NodePort 서비스를 조회한다. CLUSTER-IP 가 자동으로 할당되는 것을 알 수 있다.
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
sample-nodeport NodePort 10.96.41.17 <none> 8080:30080/TCP 50m
실제 클러스터 내부의 파드에서 ClusterIP 가 서비스 디스커버리를 수행하는지 보려면 아래 커맨드를 실행한다.
# 클러스터 내부 DNS에서 sample-nodeport 라는 서비스 이름을 해석할 때 ClusterIP 의 주소(즉, 10.96.41.17)로 해석되는 것을 볼 수 있다.
$ kubectl run --image=amsy810/tools:v2.0 --restart=Never --rm -i testpod --command -
- dig sample-nodeport.default.svc.cluster.local
...
;; QUESTION SECTION:
;sample-nodeport.default.svc.cluster.local. IN A
;; ANSWER SECTION:
sample-nodeport.default.svc.cluster.local. 30 IN A 10.96.41.17
...
pod "testpod" deleted
2. nodePort 지정시 유의할 점
spec.ports[].nodePort 로 NodePort 서비스가 수신할 포트를 지정한다고 했는데, 대부분의 쿠버네티스 환경에서는 기본적으로 30000~32767 범위의 값을 허용한다. nodePort 를 직접 지정하지 않으면 자동으로 할당되는 값도 이 범위 안에서 결정된다.
범위를 벗어난 nodePort 를 지정하면 아래와 같은 에러가 출력된다.
The Service "sample-nodeport" is invalid: spec.ports[0].nodePort: Invalid value: 8888: provided port is not in the valid range. The range of valid ports is 30000-32767
또한, 모든 node 에서 Listen 할 포트를 지정하는 것이기 때문에, 이미 사용중인 포트를 지정하는 것도 불가능하다. 이미 다른 NodePort 서비스가 사용중인 포트를 사용하려고 할 때는 아래와 같은 에러가 출력된다.
The Service "sample-nodeport" is invalid: spec.ports[0].nodePort: Invalid value: 30080: provided port is already allocated
'Kubernetes' 카테고리의 다른 글
| [Kubernetes] 서비스 Session Affinity 설정 (0) | 2025.11.22 |
|---|---|
| [Kubernetes] LoadBalancer 서비스 이해 (0) | 2025.11.15 |
| [Kubernetes] ClusterIP - externalIPs 서비스 이해 (0) | 2025.10.19 |
| [Kubernetes] 서비스에 할당 가능한 IP 대역 조회 (0) | 2025.10.19 |
| [Kubernetes] ClusterIP 서비스 이해 (0) | 2025.10.19 |
