728x90
🚀 개요
쿠버네티스에서 애플리케이션을 외부에서 접근 가능하도록 만드는 방법 중 하나가 NodePort입니다. NodePort는 Kubernetes의 Service 타입 중 하나로, 클러스터 내부에서만 접근 가능한 ClusterIP와 달리, 외부에서도 특정 포트를 통해 애플리케이션에 접근할 수 있도록 해줍니다.
1️⃣NodePort란?
NodePort는 쿠버네티스 클러스터 내부에서 실행 중인 Pod에 외부에서 접근할 수 있는 Service 타입입니다.
NodePort를 사용하면 클러스터 내 모든 노드의 특정 포트에서 서비스로의 트래픽을 수신할 수 있습니다. 이를 통해 클러스터 외부에서 http://IP:NodePort 형식으로 애플리케이션에 접근할 수 있습니다.
💡 NodePort의 주요 특징
- 모든 노드에서 접근 가능 : 클러스터 내 모든 노드의 해당 포트를 통해 서비스 접근 가능
- 고정된 포트 범위(30000 ~ 32767) 범위 내에서 포트를 할당
- 기본적으로 ClusterIP 포함 : 내부 네트워크에서도 접근 가능
- 로드 밸런싱 기능 : 여러 Pod가 연결된 경우, 라운드 로빈 방식으로 트래픽을 분산
2️⃣NodePort 동작 방식
NodePort를 생성하면 다음과 같이 동작합니다.
- 사용자가 NodePort 타입의 Service를 생성하면, 쿠버네티스는 30000 ~ 32767 범위 내에서 포트를 할당합니다.
- 클러스터의 모든 노드는 해당 포트에서 요청을 수신합니다.
- 요청은 내부적으로 ClusterIP를 통해 해당 서비스에 연결된 Pod로 전달됩니다.
3️⃣NodePort 설정 방법 (YAML 예제)
apiVersion: v1
kind: Service
metadata:
name: my-nodeport-service
spec:
type: NodePort
selector:
app: my-app
ports:
- protocol: TCP
port: 80 # 내부 ClusterIP 서비스 포트
targetPort: 80 # Pod의 컨테이너 포트
nodePort: 30080 # 외부에서 접근할 수 있는 포트 (30000-32767 사이에서 지정 가능)
설명
- type: NodePort → Service 타입을 NodePort로 지정
- selector.app: my-app → my-app 레이블을 가진 Pod들과 연결
- ports.port: 80 → Cluster 내부에서 접근하는 포트
- ports.targetPort: 80 → Pod 내부 컨테이너에서 실행 중인 포트
- ports.nodePort: 30080 → 클러스터 외부에서 접근할 수 있는 포트 (30000-32767 사이에서 설정 가능)
4️⃣NodePort를 이용한 애플리케이션 접근 방법
위에서 생성한 Service를 통해 애플리케이션에 접근하려면 아래와 같은 URL을 사용합니다.
여기서 노드 IP는 클러스터내의 어떤 노드의 IP라도 사용할 수 있습니다.
http://<노드IP>:30080
노드 IP 확인하는 방법
# kubectl get nodes -o wide
5️⃣ NodePort의 장단점
✅ NodePort의 장점
- 간단한 외부 접근 방법 : 로드 밸런서 없이도 외부에서 애플리케이션에 접근 가능
- 내부 ClusterIP 포함 : 클러스터 내부에서도 동일한 Service를 통해 접근 가능
- 모든 노드에서 서비스 가능 : 특정 노드가 다운되어도 다른 노드에서 서비스 제공 가능
❌ NodePort의 단점
- 고정된 포트 범위(30000~32767) 제한
- 보안 이슈 : 노드의 IP가 외부에 노출되므로, 보안 설정이 필요
- 로드밸런싱 부족 : 클라우드 제공자의 LoadBalancer에 비해 부하 분산이 미흡할 수 있음
6️⃣ NodePort와 다른 Service 타입 비교
쿠버네티스에서는 NodePort 외에도 다양한 Service 타입이 존재합니다. 각 타입의 차이를 비교하면 다음과 같습니다.
Service 타입 | 설명 | 외부 접근 가능 여부 |
CluterIP | 기본 타입, 클러스터 내부에서만 접근 가능 | ❌(내부 전용) |
NodePort | 노드의 특정 포트를 통해 외부에서 접근 가능 | ✅ (제한적) |
LoadBalancer | 클라우드 제공자의 로드밸런서를 통해 외부 접 근 가능 | ✅(권장) |
ExternalName | DNS기반으로 외부 서비스로 라우팅 | ✅(DNS 기반) |
'DevOps > Kubernetes' 카테고리의 다른 글
[Kubernetes] Kubernetes NFS PV/PVC 마운트 실패 해결 과정 (0) | 2025.03.05 |
---|---|
[Kubernetes] containerd VS CRI-O 차이점 (0) | 2025.03.01 |
[Kubernetes] YAML에서 Deploy(Deployment)와 Service의 차이 (0) | 2025.02.26 |
[EKS] aws-load-balancer-controller 배포 (0) | 2025.02.14 |
[EKS] EKS 애플리케이션 배포 실습 (0) | 2025.02.13 |