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 | 빠른 확인 |
| 프로덕션 HTTP | Ingress + ClusterIP | 라우팅, SSL, 비용 |
| 프로덕션 TCP | LoadBalancer | 직접 노출 |
| 외부 DB 연결 | ExternalName | DNS 관리 |
📋 체크리스트
- Service 4가지 타입 차이
- ClusterIP 내부 통신
- NodePort 접근 방법
- LoadBalancer 클라우드 연동
- Ingress 라우팅 규칙
- TLS 설정
- Service → Pod 트래픽 흐름
🔗 관련 노트
- 01-04-Deployment-관리 — 워크로드 배포
- 02-04-NetworkPolicy — 네트워크 보안
- 02-05-DNS-서비스-발견 — 내부 DNS
마지막 업데이트: 2026-06-01