Nodejs

 

Kubernetes Service 실습: NodePort 이해와 적용

 

 

Kubernetes의 kind 종류와 설명

쿠버네티스(Kubernetes)에서 kind는 리소스 객체의 종류(Type)를 나타냅니다. YAML 매니페스트 파일을 작성할 때 kind에 어떤 값을 넣느냐에 따라 쿠버네티스가 해당 파일을 Pod, Deployment, Service 같은 어떤 리소스로 인식할지가 결정됩니다.

 

쿠버네티스의 kind는 리소스 객체의 종류를 지정하는 필드이며, Pod , Deployment ,  Service  ,   Ingress 등 다양한 리소스 유형이 있습니다.

 

1)  Workload 리소스

  • Pod → 컨테이너 실행의 최소 단위

  • Deployment → ReplicaSet을 관리하며, 애플리케이션 배포/롤링 업데이트 담당

  • ReplicaSet → 동일한 Pod의 개수를 유지

  • StatefulSet → 상태를 가진 Pod(예: DB) 관리, 고유 네트워크 ID와 스토리지 유지

  • DaemonSet → 모든 Node에 1개씩 Pod 실행 (예: 로그 수집기, 모니터링 에이전트)

  • Job → 일회성 작업 실행

  • CronJob → 스케줄 기반 반복 작업 실행

 

2) Service & Networking 리소스

  • Service → Pod 집합을 네트워크로 노출

    • ClusterIP (기본값, 클러스터 내부에서만 접근)

    • NodePort (외부에서 Node의 특정 포트로 접근 가능)

    • LoadBalancer (클라우드 환경에서 외부 로드밸런서 연결)

    • ExternalName (DNS 이름으로 외부 서비스 연결)

  • Ingress → HTTP/HTTPS 요청을 라우팅 (보통 Ingress Controller와 함께 사용)

  • Endpoint → Service가 실제로 연결할 Pod들의 IP 관리

 

3) Configuration 리소스

  • ConfigMap → 애플리케이션 설정값 저장

  • Secret → 암호화된 설정값 저장 (비밀번호, API 키 등)

  • ResourceQuota → 네임스페이스 단위 리소스 사용량 제한

  • LimitRange → Pod/Container 단위 리소스 최소·최대치 제한

 

4) Storage 리소스

  • PersistentVolume (PV) → 클러스터 전체에서 사용할 수 있는 스토리지 정의

  • PersistentVolumeClaim (PVC) → Pod가 필요한 스토리지를 요청하는 객체

  • StorageClass → 동적 스토리지 프로비저닝 설정

5) Policy & Access Control

  • Role / ClusterRole → 권한 정의 (네임스페이스 한정 / 클러스터 전체)

  • RoleBinding / ClusterRoleBinding → 사용자와 Role 연결

  • NetworkPolicy → Pod 간 네트워크 접근 제어

 

✅ 정리:
kind는 쿠버네티스 매니페스트에서 "이 리소스가 어떤 객체인지" 를 정의하는 필드입니다.
예시:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment

여기서는 Deployment 리소스를 정의하고 있다는 의미입니다.

 

 

 

 

 

 

 

 

1. Kubernetes Service 개념 이해

쿠버네티스에서 Service는 클러스터 내 Pod 집합을 외부에서 접근할 수 있도록 연결해주는 네트워크 엔드포인트 역할을 합니다. Pod는 동적으로 생성되고 사라지기 때문에 직접 접근하기 어렵습니다. 이때 Service가 고정된 접근 창구를 제공하는 것이죠.

Service의 대표적인 kind 종류는 아래와 같습니다.

  • ClusterIP (기본값) → 클러스터 내부에서만 접근 가능

  • NodePort → 각 Node의 특정 포트를 열어 외부에서 접근 가능

  • LoadBalancer → 클라우드 환경에서 외부 로드밸런서를 붙여 서비스 노출

  • ExternalName → 외부 도메인으로 매핑

이번 실습에서는 NodePort 방식을 사용하여, 외부에서도 직접 nginx Pod에 접근할 수 있도록 구성합니다.

 

 

2. Deployment와 Service 설정 파일 분석

먼저 deployment.yml입니다.

a piVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx-app
    type: back-end
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx-app
        type: back-end
    spec:
      containers:
        - name: nginx-container
          image: nginx
          ports:
            - containerPort: 80
  selector:
    matchLabels:
      app: nginx-app
      type: back-end

 여기서 핵심은:

  • replicas: 3 → nginx Pod가 3개 생성됨

  • labels와 selector → Service가 어떤 Pod를 묶어줄지 결정하는 기준

이제 node_port.yml을 보겠습니다.

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx-app
    type: back-end
  type: NodePort
  ports:
    - port: 80        # Service Port (Cluster 내부)
      targetPort: 80  # 실제 Container Port
      nodePort: 30080 # 외부 접근용 NodePort

 주요 포인트:

  • type: NodePort → 외부 접근 가능

  • nodePort: 30080 → 클러스터 Node의 30080 포트를 열어 외부 연결 가능

  • 따라서 http://<Node-IP>:30080 으로 접근하면 nginx 페이지 확인 가능

 

 

3. kubectl 명령어로 실습 진행

이제 설정 파일을 적용해 보겠습니다.

kubectl apply -f ./7_node_port/

출력 결과:

deployment.apps/nginx-deployment created
service/nginx-service unchanged

배포 확인:

kubectl get deployment
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           19s

서비스 확인:

kubectl get service
NAME            TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes      ClusterIP   10.96.0.1        <none>        443/TCP        2d17h
nginx-service   NodePort    10.107.110.146   <none>        80:30080/TCP   2m55s

➡️ 여기서 80:30080/TCP가 핵심입니다. Cluster 내부 포트 80을 Node 외부 포트 30080과 연결했다는 의미입니다.

이제 브라우저에서 http://localhost:30080 으로 접속하면 nginx 기본 페이지를 볼 수 있습니다.

 

 

4. Service 삭제 실습

서비스를 삭제해 보겠습니다.

kubectl delete service nginx-service

출력:

service "nginx-service" deleted

다시 서비스 목록 확인:

kubectl get service
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   2d17h

➡️ 이제 NodePort 서비스가 사라지고, 클러스터 기본 서비스(kubernetes ClusterIP)만 남아 있음을 확인할 수 있습니다.

 

 

5. 응용 포인트

  • 개발 환경(Local): NodePort는 로컬 kind, minikube, docker desktop 등에서 외부 접속 테스트할 때 유용합니다.

  • 운영 환경(Cloud): 실제 프로덕션에서는 NodePort만 사용하지 않고, 보통 LoadBalancer와 Ingress Controller를 붙여 사용합니다.

  • 실습 확장: NodePort 범위는 30000 ~ 32767 사이이므로, 여러 서비스에 대해 각각 포트를 열어 실습할 수 있습니다.

 

 

✅ 이 전체 내용 요약

  1. Service는 Pod 집합을 외부와 연결하는 네트워크 엔드포인트다.

  2. Service 종류: ClusterIP, NodePort, LoadBalancer, ExternalName.

  3. NodePort를 통해 Node의 특정 포트를 열고 외부 접근 가능.

  4. 실습에서는 nginx Pod(3개 Replica)를 NodePort(30080)로 노출.

  5. 브라우저에서 http://localhost:30080으로 접근하면 nginx 페이지 확인.

  6. NodePort는 주로 개발·테스트 환경에서 활용, 실제 운영에서는 LoadBalancer/Ingress와 함께 사용.

 

 

 

 

about author

PHRASE

Level 60  라이트

자기 부모를 섬길 줄 모르는 사람과는 벗하지 말라. 왜냐하면 그는 인간의 첫 걸음을 벗어났기 때문이다. -소크라테스

댓글 ( 0)

댓글 남기기

작성