들어가기 전에, 서비스라는 것은 파드의 형태로 띄워지는 것이 아니다. 서비스를 클러스터에 적용하면, 모든 워커 노드의 kube-proxy 컴포넌트 파드가 자신이 속한 노드의 운영체제 커널의 네트워크 시스템에 iptables 또는 IPVS 규칙을 수정하는 것이다. 즉, 서비스는 클러스터 내의 모든 워커 노드에 적용되는 네트워크 라우팅 규칙 그 자체인 셈이다.
1. ClusterIP
내부적으로 Service 와 동일한 이름의 Endpoint 오브젝트가 생성되고, 이 Endpoint 에 Service 의 selector 에 매칭되는 Pod 들의 IP 가 subsets 항목으로 등록된다. 이를 서비스 레지스트리라고 한다.
클러스터 내부에 DNS 가 생성되며, 각 서비스들의 IP(클러스터 내부 IP)가 서비스명과 매핑되어 등록된다. 그래서 클러스터 내부의 파드에서 서비스명으로도 서비스를 호출할 수 있다. 이를 서비스 디스커버리라고 한다.
clusterIP 를 명시적으로 "None" 으로 지정하면 서비스에 IP가 할당되지 않으며, 서비스명으로 질의시 실제 selector 로 연결된 파드의 IP 목록이 조회된다.(서비스 진입 가능한 IP가 없어서 헤드리스 서비스라고 함) 사용 용도로는 파드 상태 수집용 서버가 호출하는 용도, StatefulSet 으로 관리하는 DB용 파드를 직접 호출하는 용도가 있다.(StatefulSet 으로 관리되는 파드는 파드명이 고정된 index suffix 로 생성된다.) 먼저 첫번째 케이스에서는, 파드 상태 수집용 서버에서 각 파드 IP를 aware 하고 있어야 하기 때문에 헤드리스 서비스를 호출하여 파드 IP 목록을 조회해서 사용한다. 두번째 케이스에서는, DB용 파드가 여러개 있고 각 파드가 목적이 다를 때(읽기용, 일기/쓰기용 등), 헤드리스 서비스로 연결된 파드라면 백엔드 애플리케이션 파드에서는 <파드명>.<서비스명> 형태의 도메인 형식으로 특정 파드를 지정해 호출할 수 있게 된다.
2. NodePort
서비스의 nodePort 항목을 지정하지 않으면 자동으로 각 워커노드의 30000~32768 포트 중에 하나가 오픈된다.(모든 워커노드의 동일한 포트가 오픈된다.) 내부적으로는 ClusterIP 처럼 서비스 레지스트리와 서비스 디스커버리에 해당하는 네트워크 규칙이 자동으로 생성된다. 열려진 노드 포트로 외부 네트워크에서 직접 접속이 가능하며(서비스 퍼블리싱), 해당 노드에 파드가 없더라도 다른 노드로 라우팅되기 때문에 클러스터 내의 적절한 파드로 트래픽이 분산된다.
3. LoadBalancer
온프레미스의 메탈LB나 퍼블릭 클라우드 제공자의 로드밸런서를 생성한다. 이 로드밸런서에는 공인IP가 부여되어 외부 네트워크에서 접속하는 단일 진입점으로 활용된다.(서비스 퍼블리싱) 내부적으로는 NodePort 서비스가 생성되고, 로드밸런서에서 모든 노드의 IP와 Port 를 aware 하고 트래픽을 적절히 분산한다. 그 이후의 트래픽 흐름은 NodePort 서비스와 동일하다.
4. ExternalName
다른 서비스 타입들이 클러스터 외부에서 내부로 통신이 가능하게 해주는 반면, ExternalName 서비스는 클러스터 내부에서 외부 공인 DNS 에 질의할 수 있도록 해주는 서비스이다. externalName 이라는 속성에 연결하고자 하는 도메인을 지정한다. 클러스터 내부에서는 ExternalName 서비스명으로 질의하게 되면 외부 공인 DNS 서버에서 도메인명을 해석하게 된다. 여러 파드들에서 목적지 도메인을 수정하지 않고도 ExternalName 서비스의 externalName 도메인만 수정하면 한번에 연결되는 도메인을 변경할 수 있어 유용하다. 하지만, Pod -> ExternalName 서비스 -> 공인 DNS 도메인 해석 -> 해석받은 IP로 호출되는 과정에서 Pod 에서 질의한 도메인이 ExternalName 서비스명이 되기 때문에, 목적지 서버에서 https 프로토콜을 쓴다면 변조된 트래픽으로 판단하여 통신할 수 없다는 큰 단점이 있다.(거의 사용 안함)
5. 그 외
ClusterIP, NodePort 서비스인 경우 externalIPs 항목이 쓰이기도 하는데, externalIPs 항목에 특정 노드의 IP 를 지정하면 외부 네트워크에서 해당 노드로 직접 접속이 가능하게 된다.(서비스 퍼블리싱) 이때 노드에서 개방되는 Port 는 port 항목과 동일하며, 포트 범위의 제한이 없다. 다만, 선택한 노드만으로 접속 가능하다는 점과 노드 IP를 직접 고정해야 한다는 제약이 있어 학습/테스트 용도로만 쓰인다.
'Kubernetes' 카테고리의 다른 글
| [KUBERNETES] 컨트롤러 오브젝트를 삭제할 때 자식 오브젝트를 정리하는 정책 cascade 옵션 (0) | 2026.06.04 |
|---|---|
| [Kubernetes] HorizontalPodAutoscaler(HPA)의 동작 방식과 behavior 설정 (0) | 2026.05.08 |
| [Kubernetes] Pod 상태 체크를 위한 Probe 의 이해 (0) | 2026.05.01 |
| [Kubernetes] 리소스별 selector 정리 (0) | 2026.04.26 |
| [Kubernetes] 오브젝트 라벨링 및 네이밍 가이드 (0) | 2026.04.26 |