본문 바로가기
1. 개발/1.6. 쿠버네티스 (Kubernetes,K8s)

'ExternalName Service'와 'Endpoints'는 어떤 원리로 작동해?

by 엉짱 2026. 2. 11.
반응형

이제 쿠버네티스라는 요새 안에서만 노는 게 아니라, 요새 밖의 '동맹군(외부 시스템)'들을 내부식구처럼 자연스럽게 합류시키는 고도의 네트워킹 기술에 도달하셨군요! 🫡

사용자의 주식 시스템이 클라우드 안에만 있지 않고, 외부의 특정 증권사 API 서버나 레거시 데이터베이스와 통신해야 할 때 이 기술은 빛을 발합니다. 코드에는 "외부 서버 주소"를 적지 않고 오직 "쿠버네티스 서비스 이름"만 적어도 통신이 되게 만드는 마법, ExternalNameEndpoints의 원리를 파헤쳐 보겠습니다!


🏗️ 1. 왜 외부 시스템을 '서비스'로 감싸야 하는가?

가장 큰 이유는 '추상화와 유연성'입니다.

  • 문제: 만약 파드 코드 안에 외부 DB의 IP 주소(1.2.3.4)를 직접 적어두면, 나중에 DB 주소가 바뀔 때마다 모든 파드의 코드를 수정하고 재배포해야 합니다.
  • 해결: 쿠버네티스 내부에 my-external-db라는 이름의 서비스를 만듭니다. 파드는 이 이름만 보고 통신하고, 실제 연결 주소는 쿠버네티스 서비스 설정만 살짝 바꿔주면 됩니다. 코드 수정 없이 운영 환경을 바꿀 수 있는 것이죠.

🔗 2. 방법 1: ExternalName Service (도메인 연결)

ExternalName은 외부의 도메인 이름(FQDN)을 내부 서비스 이름으로 별칭(Alias)을 지어주는 방식입니다.

① 작동 원리: "DNS의 CNAME 레코드"

사용자가 서비스를 ExternalName 타입으로 생성하고 외부 주소를 api.stock-exchange.com으로 지정하면, 쿠버네티스 내부 DNS 서버는 일종의 '지름길'을 만듭니다.

  1. 파드가 my-api-service로 요청을 보냅니다.
  2. 내부 DNS가 "아, 그건 api.stock-exchange.com의 또 다른 이름이야!"라고 알려줍니다.
  3. 파드의 트래픽은 실제 외부 도메인으로 리다이렉션됩니다.

② 장점

  • 프록시(Proxy)를 거치지 않고 DNS 수준에서 처리되므로 성능 저하가 거의 없습니다.
  • 외부 주소가 바뀌어도 서비스 설정만 바꾸면 파드들은 아무런 영향을 받지 않습니다.

📍 3. 방법 2: Service + Endpoints (IP 주소 연결)

외부 시스템이 도메인이 아닌 고정 IP만 가지고 있다면 ExternalName을 쓸 수 없습니다. 이때는 서비스와 엔드포인트(Endpoints)를 수동으로 연결하는 '수동 매핑' 기법을 씁니다.

① 작동 원리: "이름과 실체의 강제 결합"

보통 쿠버네티스 서비스는 '셀렉터(Selector)'를 통해 파드를 자동으로 찾아 연결하지만, 이 방식에서는 셀렉터를 비워둡니다.

  1. Service 생성: 셀렉터 없이 서비스 이름만 만듭니다. (입구 생성)
  2. Endpoints 생성: 서비스와 똑같은 이름의 엔드포인트 객체를 수동으로 만듭니다. 여기에 실제 외부 IP(예: 10.1.1.50)를 적습니다.
  3. 결과: 파드가 서비스 이름을 부르면, 쿠버네티스는 이름이 같은 엔드포인트를 찾아 그 IP로 트래픽을 쏴줍니다.

🚀 4. 실전 활용 시나리오: "A그룹에서 B그룹으로의 이사"

이 기술은 '마이그레이션' 시기에 정말 강력합니다.

  • 1단계: 처음엔 주식 DB가 클러스터 밖 외부 서버에 있습니다. 서비스와 엔드포인트를 써서 내부 이름(db-service)으로 연결해둡니다.
  • 2단계: 나중에 이 DB를 쿠버네티스 내부 파드로 옮깁니다.
  • 3단계: 서비스 설정에서 수동 엔드포인트를 지우고, 대신 새로 만든 파드의 라벨을 셀렉터에 적어줍니다.
  • 결과: 애플리케이션 파드들은 단 한 번의 재시작도 없이 외부 DB에서 내부 DB로 통신 대상이 바뀌게 됩니다. 완벽한 무중단 이전이죠!

💡 실전 비유: "내선 번호 시스템"

  • 일반 서비스: 아파트 관리실(Pod)로 전화할 때 "관리실" 버튼만 누르면 되는 것과 같습니다.
  • ExternalName: "외식 주문" 버튼을 누르면 자동으로 단골 중국집(외부 도메인)으로 연결되도록 설정한 단축번호입니다.
  • Endpoints (수동): "본사 연락" 버튼을 누르면 사용자 주머니에 있는 개인 휴대폰 번호(외부 고정 IP)로 연결되도록 교환기(K8s)를 수동으로 세팅한 것입니다.

📊 요약: 외부 연결 방식 비교

구분 ExternalName Service + Endpoints
연결 대상 도메인 이름 (FQDN) 고정 IP 주소
작동 계층 L3/L4 (DNS CNAME) L4 (IP/Port)
프록시 경유 없음 (직접 연결) 있음 (kube-proxy 경유 가능)
주요 용도 외부 API 서버 연결 클러스터 밖의 레거시 DB 연결

🚀 꼬리 질문

이제 클러스터 내부와 외부를 자유자재로 잇는 '네트워크의 대가'가 되셨습니다! 🫡 그런데 이렇게 외부와 연결이 잦아지면 보안이 걱정되죠? 특정 파드는 외부로 나갈 수 있게 하고, 어떤 파드는 절대 밖으로 못 나가게 막거나 특정 파드끼리만 대화하게 하는 '방화벽'이 필요합니다.

"그럼 클러스터 내부의 파드 간 통신이나 외부와의 통신을 IP/포트 수준에서 정밀하게 차단하거나 허용하는 'Network Policy'는 어떻게 설정하고 작동해?"

반응형