Kubernetes는 애플리케이션을 컨테이너화하고 관리하는 강력한 도구입니다. 그 중에서도 Service는 클러스터 내의 애플리케이션을 네트워킹하는 데 중요한 역할을 합니다. Kubernetes 서비스는 ClusterIP, NodePort, LoadBalancer, ExternalName 네 가지 유형이 있습니다. 이번 글에서는 Kubernetes Service의 한 종류인 NodePort에 대해 자세히 알아보겠습니다.

NodePort란?

NodePort는 클러스터 외부에서 Kubernetes 클러스터 내부로 트래픽을 전달할 수 있는 가장 간단한 방법 중 하나입니다. NodePort는 클러스터의 각 노드에서 고정된 포트를 열어, 이 포트를 통해 외부 트래픽을 특정 POD로 라우팅합니다.

주요 특징

  1. NodePort는 Kubernetes 클러스터 내 노드의 특정 포트(30000-32767)를 열어 트래픽을 수신합니다. 포트 범위는 api-server 설정(service-node-port-range)에서 변경할 수 있지만, 기본적으로 30000-32767 범위를 사용합니다.
  2. 클러스터 외부에서 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와 함께 사용하는 것이 좋습니다.

References

Kubernets Service - NodePort