개발 창고/Server

네트워킹 - Part1: 서비스 리소스 살펴보기

로이제로 2025. 7. 26. 22:00
반응형

들어가며: Pod와 외부 트래픽 연결 문제

Kubernetes에서 Pod는 기본적으로 동적 IP를 사용합니다.
Pod가 재시작되면 IP가 변경되기 때문에, 외부 트래픽을 안정적으로 연결할 수 있는 방법이 필요합니다.
이 문제를 해결하는 리소스가 바로 Service입니다.

이번 글에서는 다음을 다룹니다:

  • Kubernetes Service의 개념과 필요성
  • Service가 Pod와 통신하는 방식
  • ClusterIP, NodePort, LoadBalancer 소개
  • YAML 예제와 실습 방법

목차 (Table of Contents)

  1. Kubernetes Service란 무엇인가?
  2. 왜 Service가 필요한가?
  3. Service의 주요 특징
  4. ClusterIP: 기본 내부 서비스
  5. NodePort: 외부 접근
  6. LoadBalancer: 클라우드 환경의 로드밸런싱
  7. Service YAML 예제
  8. FAQ (Answer Engine Optimization)
  9. 핵심 요약
  10. 마무리

1. Kubernetes Service란 무엇인가?

ServicePod의 IP 변경에도 불구하고 안정적인 네트워크 접근을 제공하는 리소스입니다.
간단히 말해, Pod 집합에 대한 고정된 네트워크 엔드포인트 역할을 합니다.


2. 왜 Service가 필요한가?

  • Pod는 재시작될 때마다 IP가 변경됩니다.
  • 여러 Pod(ReplicaSet, Deployment)로 구성된 애플리케이션에 단일 접점을 제공해야 합니다.
  • 로드밸런싱 및 서비스 디스커버리(Discovery)를 지원합니다.

3. Service의 주요 특징

  • Pod 셀렉터(Selector) 기반으로 동작
  • kube-proxy가 Service 트래픽을 관리
  • 엔드포인트(Endpoints) 리소스를 통해 Pod와 연계
  • 다양한 Service 타입(ClusterIP, NodePort, LoadBalancer) 제공

4. ClusterIP: 기본 내부 서비스

  • Kubernetes의 기본 Service 타입
  • 클러스터 내부에서만 접근 가능
  • 테스트 또는 마이크로서비스 간 통신에 적합

예제:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: ClusterIP

5. NodePort: 외부 접근

  • 각 노드에 **고정 포트(30000~32767)**를 할당하여 외부 접근 가능
  • http://<노드IP>:<NodePort>로 접속 가능
  • 테스트 환경에서 주로 사용

예제:

type: NodePort
ports:
  - port: 80
    targetPort: 8080
    nodePort: 30080

6. LoadBalancer: 클라우드 환경의 로드밸런싱

  • **클라우드 프로바이더(AWS, GCP, Azure)**에서 로드밸런서를 자동 생성
  • 외부 트래픽을 여러 노드와 Pod로 분산
  • 운영 환경에서 가장 많이 사용되는 타입

예제:

type: LoadBalancer
ports:
  - port: 80
    targetPort: 8080

7. Service YAML 예제

다음은 Deployment + Service를 함께 사용하는 예시입니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: my-app
          image: nginx
          ports:
            - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  ports:
    - port: 80
      targetPort: 8080
  type: ClusterIP

8. FAQ (Answer Engine Optimization)

Q1. NodePort와 LoadBalancer의 차이는?
A. NodePort는 노드의 고정 포트를 열어 접근하고, LoadBalancer는 클라우드 로드밸런서를 통해 트래픽을 분산시킵니다.

Q2. Service 없이 Pod에 접근할 수 있나요?
A. 가능하지만, Pod IP가 변할 수 있어 안정적인 접근을 위해 Service를 사용하는 것이 일반적입니다.

Q3. ClusterIP는 외부에서 접근할 수 없나요?
A. 기본적으로 불가능하지만, kubectl port-forward나 Ingress를 통해 우회할 수 있습니다.


9. 핵심 요약

타입 접근 범위 사용 사례
ClusterIP 내부 통신 마이크로서비스 간 통신
NodePort 외부 접근 개발/테스트 환경
LoadBalancer 외부 접근 운영 환경 (클라우드)

10. 마무리

Service는 Pod의 네트워크 접근성을 안정적으로 보장하는 핵심 리소스입니다.


반응형