91. ClusterIP - K8s 기본 내부 통신 서비스

⚠️ 이 문서는 쿠버네티스(Kubernetes) 환경에서 수시로 죽고 태어나며 IP가 계속 바뀌는 파드(Pod)들 앞단에 서서 고정된 IP와 도메인 네임을 제공하는 '서비스(Service)' 객체의 가장 기본적이고 널리 쓰이는 형태로서, **오직 클러스터 '내부'에 있는 시스템들끼리만 통신할 수 있도록 철저히 격리된 가상 IP를 부여하는 'ClusterIP'**를 다룹니다.

핵심 인사이트 (3줄 요약)

  1. 본질: 쿠버네티스에서 서비스를 만들 때 옵션을 주지 않으면 무조건 기본(Default)으로 생성되는 타입이다. 외부에선 절대 접속할 수 없는 100% 사내망 전용 내선 전화번호다.
  2. 가치: 보안이 가장 중요한 데이터베이스(MySQL 파드)나 외부 고객이 직접 찌를 일이 없는 백엔드 마이크로서비스(WAS 파드)에 고정된 간판을 달아주어, 해커의 접근을 차단하고 같은 클러스터 내의 프론트엔드 파드들만 안전하게 접근하게 해 준다.
  3. 기술 체계: 10.x.x.x 대역의 가상의 IP(Virtual IP)를 하나 부여받고, 내부 DNS(CoreDNS)에 my-backend.default.svc.cluster.local 이라는 영문 도메인을 자동 등록하여 파드 간의 마법 같은 이름(Name) 통신을 완성한다.

Ⅰ. 파드의 단명(Short-lived)과 내부 통신의 딜레마

파드 IP를 믿고 코딩하면 서버는 10분 만에 뻗는다.

  1. 파드 IP 하드코딩의 참사:
    • frontend 파드에서 backend 파드(10.1.1.5)로 API를 호출하는 코드를 짰다.
    • 10분 뒤 메모리 초과로 backend 파드가 죽고, 레플리카셋이 새로운 backend 파드(10.1.1.9)를 띄웠다.
    • frontend는 여전히 10.1.1.5로 통신을 시도하다 타임아웃(에러)을 맞고 쓰러진다.
  2. ClusterIP의 도입 (디커플링):
    • 이 문제를 해결하기 위해 백엔드 파드들 앞에 ClusterIP 서비스를 하나 세운다.
    • 쿠버네티스는 이 서비스에게 10.96.0.10 이라는 영원히 죽지 않는 가상의 IP(VIP)를 하나 떡 하니 부여한다.
    • 프론트엔드 파드는 이제 백엔드 파드들의 진짜 IP는 쳐다보지도 않고, 무조건 10.96.0.10으로만 요청을 던진다. 그러면 ClusterIP가 그 요청을 받아 살아있는 백엔드 파드들에게 라운드 로빈(Round Robin) 방식으로 공평하게 던져준다.

📢 섹션 요약 비유: 프론트엔드 직원이 수시로 바뀌는 백엔드 알바생의 개인 핸드폰 번호(파드 IP)로 일일이 전화를 거는 짓을 멈추고, 영원히 바뀌지 않는 백엔드 부서의 '내선 직통 번호(ClusterIP)'로만 전화를 겁니다. 부서 내선 번호로 걸면 오늘 출근한 어떤 알바생이든 알아서 전화를 받아주는 완벽한 사내망 통신 시스템입니다.


Ⅱ. 완벽한 내부 격리와 보안성

클러스터 안에서는 자유롭지만, 밖에서는 투명 인간이다.

  1. 철통 보안의 내부망 전용:
    • ClusterIP는 오직 쿠버네티스 클러스터 링(Ring) 안에 떠 있는 파드들이나 노드들끼리만 통신할 수 있는 IP 대역이다.
    • 인터넷 망이나 심지어 클러스터 바깥의 사내 PC에서 이 10.96.x.x 주소로 핑(Ping)을 때려도 절대 도달하지 못한다. 라우팅 자체가 밖으로 나가지 않게 설계되었기 때문이다.
  2. 백엔드와 DB를 위한 최고의 껍데기:
    • 해커가 외부에서 고객 DB에 직접 찌르는 것을 막기 위해, 쿠버네티스의 모든 MySQL, Redis, 내부 로직용 API 파드들은 반드시 ClusterIP로만 감싸야 한다.
    • 반면, 고객이 밖에서 브라우저로 직접 접속해야 하는 프론트엔드 파드(React, Nginx)는 ClusterIP가 아니라 밖으로 포트를 열어주는 LoadBalancerIngress로 감싸야만 서비스가 성립된다.

📢 섹션 요약 비유: 군대에서 쓰는 군용 무전망(ClusterIP)입니다. 부대 안에 있는 병사(파드)들끼리는 무전기를 켜면 빵빵하게 아주 잘 들리지만, 부대 밖의 일반인(인터넷)이 자기 핸드폰으로 이 무전 주파수에 전화를 걸면 신호 자체가 잡히지 않아 도청과 해킹이 물리적으로 완벽히 차단된 폐쇄망 구조입니다.


Ⅲ. CoreDNS와의 결합: 마법의 이름 통신

IP 주소를 외우는 것조차 귀찮다. 그냥 이름만 부르면 된다.

  1. 도메인 네임 (DNS) 자동 등록:
    • 개발자가 굳이 ClusterIP로 부여받은 가상 IP(10.96.0.10) 숫자조차 외울 필요가 없다.
    • my-backend라는 이름으로 ClusterIP 서비스를 생성하면, 쿠버네티스 심장부에 있는 CoreDNS 서버가 즉시 이 이름을 자기 장부에 등록한다.
  2. FQDN (Fully Qualified Domain Name):
    • 프론트엔드 소스코드에 http://my-backend 라고 영어 이름만 타이핑해서 배포하면 통신이 기적처럼 성공한다.
    • 내부적으로는 my-backend.default.svc.cluster.local (서비스이름.네임스페이스.svc.cluster.local) 이라는 긴 정식 도메인 주소가 등록되며, 쿠버네티스 밖을 나가지 않고도 DNS가 알아서 이 영단어를 가상 IP로 번역해주고 최종적으로 살아있는 파드에게 요청을 꽂아준다.

📢 섹션 요약 비유: 사내 전화번호부를 외울 필요조차 없게 만들었습니다. 프론트엔드 직원이 전화기를 들고 숫자(IP)를 누르는 대신, 스마트 스피커(CoreDNS)에 대고 "백엔드 팀 연결해 줘!"라고 말만 하면(도메인 네임 호출), 회사 교환기가 찰떡같이 알아듣고 백엔드 내선 번호(ClusterIP)로 연결해 주는 마법 같은 사내 음성 인식 통신망입니다.