쿠버네티스 서비스(Kubernetes Service): 파드 간 안정적인 네트워크 연결

쿠버네티스(Kubernetes)에서 **서비스(Service)**는 클러스터 내에서 실행되는 파드(Pod)들 간의 네트워크 통신을 안정적으로 제공하는 핵심 기능입니다. 쿠버네티스에서는 파드가 지속적으로 생성되고 삭제되며, 재배포될 때마다 IP가 변경될 수 있습니다. 이처럼 동적으로 변하는 파드들과 안정적인 네트워크 연결을 유지하는 것이 서비스의 역할입니다.

이 글에서는 쿠버네티스 서비스의 개념, 유형, 동작 방식, 그리고 실전 예제까지 자세히 설명합니다.


📌 목차

  1. 쿠버네티스 서비스란?
  2. 서비스가 필요한 이유
  3. 쿠버네티스 서비스의 주요 유형
    • ClusterIP
    • NodePort
    • LoadBalancer
    • ExternalName
  4. 서비스와 셀렉터(Selector)
  5. 서비스의 네트워크 동작 방식
  6. 서비스 생성 및 관리 (실전 예제)
  7. 결론

1. 쿠버네티스 서비스란?

**서비스(Service)**는 쿠버네티스에서 네트워크 내에서 여러 개의 파드를 하나의 논리적인 엔드포인트로 묶어주는 기능을 합니다.

서비스의 주요 역할

  • 클러스터 내에서 파드 간 네트워크 통신을 안정적으로 유지.
  • 특정 파드가 종료되고 새로운 파드가 생성되더라도 일관된 네트워크 주소 제공.
  • 로드 밸런싱 기능을 수행하여 여러 개의 파드에 트래픽을 분배.

💡 한마디로?
➡️ 파드의 IP 변경에도 불구하고, 서비스는 지속적인 접근점을 유지하는 가상 IP 역할을 수행합니다.


2. 서비스가 필요한 이유

쿠버네티스에서 파드는 다음과 같은 이유로 네트워크 통신이 어렵습니다.

🔹 1) 파드는 동적으로 생성 및 삭제됨

  • 쿠버네티스에서 파드는 컨트롤러(Deployment, ReplicaSet 등)에 의해 자동으로 생성 및 삭제됩니다.
  • 새로운 파드가 생성될 때마다 IP 주소가 변경될 수 있습니다.

🔹 2) 파드 간 직접 통신이 어렵다

  • 각 노드에 배포된 파드는 클러스터 네트워크를 통해 통신해야 하지만, 특정 파드의 IP를 알기 어렵습니다.

🔹 3) 로드 밸런싱이 필요

  • 여러 개의 파드가 동일한 애플리케이션을 실행하는 경우, 트래픽을 분산하는 기능이 필요합니다.

해결책: 서비스를 사용하여 특정 파드에 관계없이 일관된 네트워크 엔드포인트를 제공!


3. 쿠버네티스 서비스의 주요 유형

쿠버네티스에서 서비스는 네트워크 접근 방식에 따라 네 가지 유형으로 구분됩니다.

서비스 유형설명
ClusterIP기본 설정, 클러스터 내부에서만 접근 가능
NodePort각 노드의 특정 포트를 개방하여 외부에서 접근 가능
LoadBalancer클라우드 환경에서 외부 로드 밸런서를 통해 접근 가능
ExternalName클러스터 외부의 DNS 이름을 서비스로 매핑

🔹 1) ClusterIP (기본 서비스 유형)

설명

  • 클러스터 내부에서만 접근 가능 (kubectl port-forward로 외부에서도 테스트 가능).
  • 외부에서는 접근할 수 없고, 내부 애플리케이션 간의 통신에 주로 사용됨.

사용 사례

  • 마이크로서비스 간 내부 통신 (예: 프론트엔드 → 백엔드 API 호출).

YAML 예제

<yaml>

apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
  • port: 80 → 서비스가 클러스터 내부에서 노출하는 포트.
  • targetPort: 8080 → 실제 파드에서 실행되는 포트.
<bash>

kubectl apply -f my-service.yaml
kubectl get svc

🔹 2) NodePort (외부 접근 가능)

설명

  • 노드의 특정 포트를 개방하여 클러스터 외부에서도 접근 가능.
  • 기본적으로 30000~32767 범위의 포트를 사용.

사용 사례

  • 개발 및 테스트 환경에서 간단한 외부 접근이 필요할 때.

YAML 예제

<yaml>

apiVersion: v1
kind: Service
metadata:
name: my-nodeport-service
spec:
type: NodePort
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
nodePort: 30007 # 노드에서 열리는 포트
<bash>

kubectl apply -f my-nodeport-service.yaml
kubectl get svc

🌍 접속 방법
http://<노드IP>:30007


🔹 3) LoadBalancer (클라우드 환경에서 사용)

설명

  • 클라우드 환경(AWS, GCP, Azure 등)에서 외부 로드 밸런서를 자동 생성.
  • NodePort와 함께 작동하여 외부 트래픽을 클러스터 내부로 라우팅.

사용 사례

  • 프로덕션 환경에서 외부 사용자가 애플리케이션에 접근할 때.

YAML 예제

<yaml>

apiVersion: v1
kind: Service
metadata:
name: my-loadbalancer-service
spec:
type: LoadBalancer
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
<bash>

kubectl apply -f my-loadbalancer-service.yaml
kubectl get svc

🔗 접속 방법
쿠버네티스가 할당한 공인 IP를 통해 외부에서 접근 가능.


🔹 4) ExternalName (외부 DNS 서비스와 연동)

설명

  • 내부에서 특정 **외부 서비스(DNS 주소)**를 가리킬 때 사용.

사용 사례

  • 내부 애플리케이션이 외부 API(예: example.com)를 서비스처럼 사용.

YAML 예제

<yaml>

apiVersion: v1
kind: Service
metadata:
name: external-service
spec:
type: ExternalName
externalName: example.com

4. 서비스와 셀렉터(Selector)

서비스는 특정 파드와 연결되어야 하며, selector를 사용하여 이를 정의.

<yaml>

spec:
selector:
app: my-app
  • selector가 있는 경우, 일치하는 레이블을 가진 파드들이 서비스에 연결.
  • selector 없이도 서비스 생성 가능하지만, 수동으로 엔드포인트를 지정해야 함.

5. 서비스의 네트워크 동작 방식

쿠버네티스 서비스는 내부적으로 kube-proxy를 사용하여 파드 간 통신을 관리합니다.

  • 클러스터 내에서 DNS를 통해 서비스명을 사용하여 통신 가능 (my-service.default.svc.cluster.local).
  • iptables 또는 IPVS를 사용하여 로드 밸런싱 수행.

6. 서비스 생성 및 관리 (실전 예제)

<bash>

# 서비스 목록 조회
kubectl get services

# 특정 서비스 상세 정보
kubectl describe service my-service

# 서비스 삭제
kubectl delete service my-service

7. 결론

쿠버네티스 서비스는 파드 간 안정적인 통신을 보장하는 중요한 역할을 합니다.

서비스 유형 정리

  • ClusterIP: 클러스터 내부에서만 접근 가능.
  • NodePort: 외부에서 특정 노드 포트를 통해 접근 가능.
  • LoadBalancer: 클라우드 환경에서 외부 로드 밸런싱 지원.
  • ExternalName: 외부 DNS 서비스를 내부 서비스로 매핑.

📌 쿠버네티스에서 네트워크를 효과적으로 관리하려면, 서비스 개념을 확실히 이해하고 적절한 유형을 선택하는 것이 중요합니다! 🚀