
쿠버네티스에서 Service API 카테고리로 분류되는 리소스들은 클러스터 상의 컨테이너에 올바르게 접속하기 위한 네트워크 엔드포인트를 제공하거나, 레이블과 일치하는 컨테이너를 찾아내는(Discovery) 역할을 한다.
사용자가 직접 사용하는 리소스는 크게 두 가지 로드 밸런싱 레벨로 나뉜다.
서비스(Service): L4 레벨의 로드 밸런싱을 제공 (IP + Port 기반)
인그레스(Ingress): L7 레벨의 로드 밸런싱을 제공 (HTTP/HTTPS, URL 경로 기반)
이 리소스들은 목적에 따라 클러스터 내부 혹은 외부에서 파드에 접속할 수 있는 창구가 되거나, 고정된 가상 IP 등을 통해 안정적인 통신을 보장한다.
Service API에 속하는 리소스들은 다음과 같다.
Service
ClusterIP: 클러스터 내부에서만 접근 가능한 가상 IP를 할당 (기본값)
ExternalIP: ClusterIP의 확장 형태로, 특정 외부 IP를 서비스에 매핑함
NodePort: 모든 노드의 특정 포트를 개방하여 외부에서 접근하게 함
LoadBalancer: 클라우드 공급자(AWS, GCP 등)의 로드 밸런서를 프로비저닝하여 외부와 연결
Headless (None): ClusterIP를 할당하지 않고, DNS를 통해 파드의 IP를 직접 반환
ExternalName: 외부 도메인(예: https://www.google.com/search?q=google.com)을 내부 서비스 이름으로 매핑
None-Selector: 셀렉터 없이 엔드포인트를 사용자가 직접 지정하여 사용하는 방식
Ingress: HTTP/HTTPS 경로를 기반으로 서비스를 외부로 노출함함
쿠버네티스 클러스터는 생성 시 노드 상에 파드를 위한 내부 네트워크가 자동으로 구성된다.
같은 파드 내 컨테이너 간 통신
하나의 파드 안에 있는 컨테이너들은 동일한 네트워크 네임스페이스와 IP를 공유한다
따라서 localhost를 통해 포트 번호로 서로 통신할 수 있다.
다른 파드 간 통신

내부 네트워크 구성(CNI)
이러한 네트워크는 CNI(Container Network Interface) 플러그인(예: Calico, Flannel, AWS VPC CNI 등)에 의해 구현된다.
기본적으로 노드별로 다른 네트워크 대역(CIDR)을 할당받으며, 노드 간 트래픽은 VXLAN(오버레이 네트워크)이나 L2 Routing 기술을 통해 캡슐화되어 전송됨

파드 간에는 IP를 통해 직접 통신이 가능함에도 불구하고, 서비스(Service)라는 별도의 리소스가 필요한 이유는 가장 큰 이유는 '파드의 휘발성(Ephemeral)' 때문이다.
📌 추가 설명
파드는 스케일링, 업데이트, 혹은 장애 발생 시 언제든 죽고 새로 생성되므로 영구적이지 않다. 이때 파드는 새로운 IP 를 할당 받게 되는데, 클라이언트는 통신해야 될 대상인 파드의 IP가 계속 변하는 문제가 발생한다.
서비스를 사용하면 아래와 같은 이점을 얻을 수 있다.
① 파드에 대한 트래픽 로드 밸런싱 (Load Balancing)
Deployment를 통해 여러 개의 Pod를 운영할 때, 각 파드는 서로 다른 IP를 가진다. 서비스를 사용하지 않는다면 클라이언트는 이 모든 파드의 IP 목록을 실시간으로 추적하고 관리해야 한다.
서비스의 역할: 서비스는 여러 파드를 묶어 하나의 EndPoint를 제공
동작: 클라이언트가 서비스의 가상 IP(ClusterIP)로 요청을 보내면, 서비스는 연결된 여러 파드 중 하나로 트래픽을 적절히 분산(로드 밸런싱)하여 전달한다.
서비스 디스커버리는 클라이언트가 접속해야 할 대상(서비스)의 위치(IP/Port)를 자동으로 찾아내는 메커니즘이다.
MSA 환경에서는 서비스가 빈번하게 생성되고 소멸하므로, 자동화된 검색 기능이 필수적입니다.
개념: IP 주소를 하드코딩하지 않고, "이름(Service Name)"만으로 통신 대상을 찾을 수 있게 해준다. 파드의 IP가 바뀌어도 서비스의 이름과 서비스 IP는 유지되므로 안정적인 통신이 가능함
쿠버네티스의 제공 방식:
환경 변수(Environment Variables): 파드가 생성될 때, 현재 존재하는 서비스들의 정보를 환경 변수로 주입받음. (생성 순서에 의존적이므로 잘 사용되지 않음)
DNS A 레코드: my-service.default.svc.cluster.local과 같은 도메인 이름을 쿼리하면 서비스의 IP를 반환합니다. (가장 일반적인 방식)
DNS SRV 레코드: IP뿐만 아니라 포트 번호와 프로토콜 정보까지 포함하여 응답합니다.