Service 타입

Kubernetes Service의 종류와 사용처, Ingress 연동 완벽 가이드


Kubernetes Service의 종류와 사용처, Ingress 연동 완벽 가이드

목표: 앱을 적절한 방식으로 노출하고, 트래픽을 제어할 수 있는 수준


🌐 Service 개요

역할: Pod 집합에 안정적인 네트워크 엔드포인트 제공.

[Client]


[Service: 10.96.123.456:80] ──> [Pod: 10.244.1.10:8080]
                         ──> [Pod: 10.244.2.20:8080]
                         ──> [Pod: 10.244.3.30:8080]

📦 Service 타입

ClusterIP (기본)

특징: 클러스터 내부에서만 접근 가능 (내부 통신)

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  ports:
  - port: 80
    targetPort: 8080
  type: ClusterIP
# 접근 방법
# 1. Service IP 직접
curl http://10.96.123.456

# 2. DNS 이름
# my-service.my-namespace.svc.cluster.local
curl http://my-service

# 3. 환경변수 (Pod 내부에서 자동 설정)
env | grep MY_SERVICE

NodePort

특징: 각 노드의 IP:Port로 접근 가능 (개발/테스트용)

apiVersion: v1
kind: Service
metadata:
  name: my-nodeport
spec:
  selector:
    app: my-app
  ports:
  - port: 80
    targetPort: 8080
    nodePort: 30080  # 30000-32767 범위
  type: NodePort
# 접근 방법
# <NodeIP>:<NodePort>
curl http://192.168.1.100:30080
curl http://192.168.1.101:30080

LoadBalancer

특징: 클라우드 로드밸런서 자동 생성 (AWS ELB, GCP LB 등)

apiVersion: v1
kind: Service
metadata:
  name: my-lb
spec:
  selector:
    app: my-app
  ports:
  - port: 80
    targetPort: 8080
  type: LoadBalancer
# EXTERNAL-IP 확인
kubectl get svc my-lb
# NAME    TYPE           CLUSTER-IP      EXTERNAL-IP                                                               PORT(S)
# my-lb   LoadBalancer   10.96.123.456   a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6-1234567890.us-east-1.elb.amazonaws.com   80:30080/TCP

ExternalName

특징: 외부 서비스를 내부 DNS로 매핑

apiVersion: v1
kind: Service
metadata:
  name: external-db
spec:
  type: ExternalName
  externalName: db.example.com
# Pod 내부에서
nslookup external-db
# db.example.com으로 CNAME

🚪 Ingress

역할: HTTP/HTTPS 라우팅, SSL 종료, 가상 호스팅.

Ingress Controller 설치 (nginx)

# Helm으로 설치
helm upgrade --install ingress-nginx ingress-nginx \
  --repo https://kubernetes.github.io/ingress-nginx \
  --namespace ingress-nginx --create-namespace

# 확인
kubectl get pods -n ingress-nginx

Ingress 리소스

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    cert-manager.io/cluster-issuer: "letsencrypt"
spec:
  ingressClassName: nginx
  tls:
  - hosts:
    - api.example.com
    - www.example.com
    secretName: example-tls
  rules:
  - host: api.example.com
    http:
      paths:
      - path: /v1
        pathType: Prefix
        backend:
          service:
            name: api-v1
            port:
              number: 80
      - path: /v2
        pathType: Prefix
        backend:
          service:
            name: api-v2
            port:
              number: 80
  - host: www.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: frontend
            port:
              number: 80
# Ingress 확인
kubectl get ingress
kubectl describe ingress example-ingress

🔄 Service vs Ingress 선택

상황선택이유
내부 통신만ClusterIP안전, 단순
개발/테스트NodePort빠른 확인
프로덕션 HTTPIngress + ClusterIP라우팅, SSL, 비용
프로덕션 TCPLoadBalancer직접 노출
외부 DB 연결ExternalNameDNS 관리

📋 체크리스트

  • Service 4가지 타입 차이
  • ClusterIP 내부 통신
  • NodePort 접근 방법
  • LoadBalancer 클라우드 연동
  • Ingress 라우팅 규칙
  • TLS 설정
  • Service → Pod 트래픽 흐름

🔗 관련 노트

  • 01-04-Deployment-관리 — 워크로드 배포
  • 02-04-NetworkPolicy — 네트워크 보안
  • 02-05-DNS-서비스-발견 — 내부 DNS

마지막 업데이트: 2026-06-01