Kubernetes는 애플리케이션을 컨테이너화하고 관리하는 강력한 도구입니다. 그 중에서도 Service는 클러스터 내의 애플리케이션을 네트워킹하는 데 중요한 역할을 합니다. Kubernetes 서비스는 ClusterIP, NodePort, LoadBalancer, ExternalName 네 가지 유형이 있습니다. 이번 글에서는 Kubernetes Service의 한 종류인 NodePort에 대해 자세히 알아보겠습니다.
NodePort란?
NodePort는 클러스터 외부에서 Kubernetes 클러스터 내부로 트래픽을 전달할 수 있는 가장 간단한 방법 중 하나입니다. NodePort는 클러스터의 각 노드에서 고정된 포트를 열어, 이 포트를 통해 외부 트래픽을 특정 POD로 라우팅합니다.
주요 특징
- NodePort는 Kubernetes 클러스터 내 노드의 특정 포트(30000-32767)를 열어 트래픽을 수신합니다. 포트 범위는 api-server 설정(
service-node-port-range
)에서 변경할 수 있지만, 기본적으로 30000-32767 범위를 사용합니다. - 클러스터 외부에서 NodeIP:NodePort(30000-32767) 형식으로 접근할 수 있습니다.
NodePort 서비스 생성하기
NodePort 서비스를 생성하는 방법은 매우 간단합니다. 아래는 Nginx 애플리케이션을 대상으로 NodePort 서비스를 생성하는 예제입니다.
Deployment 정의
먼저 Nginx Pod를 배포하는 Deployment를 정의합니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: default
labels:
app.kubernetes.io/name: nginx
spec:
replicas: 3
selector:
matchLabels:
app.kubernetes.io/name: nginx
template:
metadata:
labels:
app.kubernetes.io/name: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
Service 정의
이전 포스트의 ClusterIP와는 달리, NodePort 서비스에서는 ports 스펙 하위에 nodePort를 지정할 수 있습니다. NodePort 서비스를 정의하려면 type을 NodePort로 지정해야 합니다. nodePort를 30007로 직접 지정할 수도 있지만, 이를 선언하지 않으면 자동으로 할당됩니다.
apiVersion: v1
kind: Service
metadata:
name: nginx-service
namespace: default
spec:
type: NodePort
selector:
app.kubernetes.io/name: nginx
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
nodePort: 30007
위의 정의 파일을 통해 nginx-service라는 이름의 NodePort 서비스를 생성할 수 있습니다. 이 서비스는 app.kubernetes.io/name: nginx
레이블을 가진 모든 Pod의 80번 포트로 트래픽을 전달하며, http://NodeIP:30007
를 통해 접근할 수 있습니다. kubectl
명령어로 조회하면 80번 포트가 30007번 포트에 매핑된 것을 확인할 수 있습니다.
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-service NodePort 10.100.30.43 <none> 80:30007/TCP 1d
NodeIP는 kubectl
명령어로 쉽게 찾을 수 있습니다.
$ kubectl get node
NAME STATUS ROLES AGE VERSION
ip-172-31-0-124.ap-northeast-2.compute.internal Ready <none> 1d v1.29.4
ip-172-31-1-234.ap-northeast-2.compute.internal Ready <none> 1d v1.29.4
http://172.31.0.124:30007
/ http://172.31.1.234:30007
통해 nginx Pod로 접근이 가능합니다.
결론
NodePort 서비스는 Kubernetes 클러스터 외부에서 내부 애플리케이션으로 트래픽을 라우팅하는 간단한 방법을 제공하지만, 보안 설정, 포트 관리(30000-32767 범위 내 포트 충돌 방지), 그리고 단순 로드 밸런싱의 한계를 고려해야 합니다. 따라서 NodePort 서비스를 사용할 때는 Ingress와 함께 사용하는 것이 좋습니다.