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 사이이므로, 여러 서비스에 대해 각각 포트를 열어 실습할 수 있습니다.
✅ 이 전체 내용 요약
Service는 Pod 집합을 외부와 연결하는 네트워크 엔드포인트다.
Service 종류: ClusterIP, NodePort, LoadBalancer, ExternalName.
NodePort를 통해 Node의 특정 포트를 열고 외부 접근 가능.
실습에서는 nginx Pod(3개 Replica)를 NodePort(30080)로 노출.
브라우저에서 http://localhost:30080으로 접근하면 nginx 페이지 확인.
NodePort는 주로 개발·테스트 환경에서 활용, 실제 운영에서는 LoadBalancer/Ingress와 함께 사용.
댓글 ( 0)
댓글 남기기