TIL

Service

Service가 필요한 이유

Service 정의

spec.selector

spec.portsport vs targetPort

protocolappProtocol

Multi-port Service

Selector 없는 Service

EndpointSlice 메커니즘

서비스 디스커버리(Service Discovery)

환경 변수(Environment Variables) 방식

DNS 방식

CoreDNS가 없는 클러스터에서는 DNS 디스커버리 자체가 동작하지 않음 — 사실상 모든 표준 클러스터는 CoreDNS를 기본 탑재.

Headless Service

언제 Headless를 쓰는가

StatefulSet과의 관계

Service 타입

ClusterIP (기본)

NodePort

LoadBalancer

ExternalName

타입 비교 요약

타입 외부 노출 부여되는 IP 주 사용처 비고
ClusterIP ❌ (내부 전용) ClusterIP 마이크로서비스 간 통신 기본값
NodePort ⭕ (Node IP:Port) ClusterIP + Node:Port 개발·테스트, 자체 LB 앞단 운영 단독 사용은 부적합
LoadBalancer ⭕ (외부 LB IP) ClusterIP + NodePort + LB IP 클라우드 환경 외부 노출 L4, 클라우드 LB 자동 프로비저닝
ExternalName 없음 (CNAME) 외부 서비스 내부 이름화 DNS만, 트래픽 통과 X

Virtual IP와 kube-proxy

kube-proxy 모드

모드 데이터플레인 특징 비고
iptables netfilter (iptables) 기본값, 가장 널리 사용 Service·Pod 수가 늘면 규칙 수 선형 증가 → 동기화·매칭 비용 ↑
ipvs IPVS (Linux 커널 LB) 해시 테이블 기반, 대규모 클러스터에 유리 RR·LC·SH 등 다양한 LB 알고리즘 선택 가능
nftables nftables iptables의 후속, GA로 진입 중 매칭 속도·확장성에서 iptables보다 개선
userspace (deprecated) 초기 모드, 사용자 공간에서 직접 프록시 성능 문제로 더 이상 권장되지 않음

Traffic Policy

externalTrafficPolicy

internalTrafficPolicy

spec:
  type: LoadBalancer
  externalTrafficPolicy: Local       # 외부에서 들어온 트래픽은 같은 Node Pod로만
  internalTrafficPolicy: Cluster     # 내부 호출은 클러스터 전체에서 분배
  selector:
    app: my-app
  ports:
    - port: 80
      targetPort: 8080

Session Affinity