Kubernetes

NodePort 간단 설명

라온클 2022. 6. 25. 06:22

노드포트 간단 소개


노드포트(NodePort)는 모든 워커노드의 특정 포트(=Nodeport)를 열고, 이 포트에 오는 모든 요청을 노드포트 서비스로 포워딩한다
클러스터 외부에서 접속 불가하다는 ClusterIP 의 단점을 해결할 수 있는 서비스중에 가장 원시적인(primitive) 방법이다.

 

 

노드포트의 특징

칭찬 많이 받았던 회심의 흐름도😎 클릭하면 고화질로 이동합니다.

  • 노드포트로 노출한다는 것은 곧 Pod나 deployment가 있다는 뜻이다
  • 노드포트는 노드가 3개든, 100개든 모두 동일한 노드포트가 열려진다.
  • 노드포트는 30000-32767 사이의 포트 대역을 사용한다
  • 포트(spec.ports.port) 는 서비스에 대한 포트번호다.
  • 타겟포트(spec.ports.targetPort)는 파드의 컨테이너에 대한 포트(spec.containers[].ports[].containerPort) 번호다.
  • 타겟포트와 포트는 다른 번호로 사용할 수 있지만, 일반적으로는 동일한 번호로 맞춰서 사용한다
  • 어떤 Pod들을 노출시키는지는 Selector로 지정하며, 자동으로 Load Balancing된다

 

노드포트의 제약사항

아래와 같은 이유로 노드포트는 주로 임시나 데모에서만 사용한다.
한 노드포트당 한 서비스만 할당할 수 있다.
외부 사용자가 80 혹은 443 같은 Well-known 같은 포트가 아니라, 30000-32767 사이의 포트만 사용할 수 있다.

 

 

노드포트 만드는법

dp-nginx 라는 이름의 Deployment를 np-nginx라는 nodePort로 노출하려고 한다.
이때 dp-nginx 의 yaml은 다음과 같다.

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: dp-nginx
  name: dp-nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: dp-nginx
  template:
    metadata:
      labels:
        app: dp-nginx
    spec:
      containers:
      - name: nginx
        image: nginx

 


yaml 파일로 만들기

노드포트를 yaml로 생성하면 spec.ports.nodePort로 노드포트 번호를, spec.selector로 Pod를 지정할 수 있다

apiVersion: v1
kind: Service
metadata:
  name: np-nginx 
spec:
  selector:
    app: dp-nginx  
  ports:
    - port: 80
      targetPort: 80
      nodePort: 30000 #option 
  type: NodePort



kubectl expose 명령어로 만들기

노드포트를 expose로 생성하면 Pod는 지정할 수 있으나, 노드포트 번호는 지정할 수 없다.(랜덤 생성)

#방법
kubectl expose (-f FILENAME | TYPE NAME) [--port=port] [--protocol=TCP|UDP|SCTP] [--target-port=number-or-name]
[--name=name] [--external-ip=external-ip-of-service] [--type=type] [options]

#예시
kubectl expose deployment dp-nginx --type=NodePort --name=np-nginx --port=80




kubectl create service 명령어로 만들기

노드포트를 create로 생성하면 Pod와 노드포트 번호 모두 지정할 수 없다.(랜덤 생성)

#방법
kubectl create service nodeport NAME [--tcp=port:targetPort] [--dry-run=server|client|none] [options]

#예시
kubectl create service nodeport np-nginx --tcp=80:80



요약하면 다음과 같다. 

  yaml expose create
nodePort 번호 지정
Pod 지정

⚠️expose나 create 명령어로 생성 후, kubectl edit으로 편집할 수 있다.

 


노드포트로 노출한 애플리케이션에 접근하는 방법

워커노드의IP:노드포트

 


터미널에서 curl로 확인하는 방법




브라우저에서 확인하는 방법


참고