[Project] Multi-Tenant K8s Cluster on ARM64 - (8) External Access Point

developowl·2026년 3월 8일
post-thumbnail

쿠버네티스 내부의 파드는 기본적으로 외부와 격리되어 있습니다. 관리자(나)는 각 테넌트 네임스페이스에 MetalLB 를 이용한 LoadBalancer IP 를 할당하고, 이를 통해 사용자가 할당받은 IP로 즉시 SSH 접속을 할 수 있는 환경을 구축해보고자 합니다. 이렇게 한다면 각 테넌트 입장에서 고유한 가상 서버를 제공받고, 사용하는 경험을 하게 됩니다. (초기 프로젝트 목표였던, 외부 테넌트에게 CSP처럼 인스턴스를 제공하는 부분의 핵심입니다!)

핵심 목표

  • 네트워크 독립성 확보 : 테넌트별로 고유한 내부망 IP(LoadBalancer IP) 를 할당하여 자원 간 간섭을 최소화
  • 접속 편의성 극대화 : 22번 포트(SSH 전용)를 외부로 노출하여 접속 가능하도록 환경 구성
  • 인프라 추상화 : 테넌트가 쿠버넽네티스 노드나 파드의 개념을 몰라도, 부여받은 IP 하나로 서버(인스턴스)처럼 활용할 수 있게 함

1. [기능 설명] 테넌트별 전용 고정 IP 할당

사용자가 파드를 ‘하나의 독립된 가상 서버’처럼 느끼게 하기 위해 네트워크 접점을 제공

1-1. 주요 설계 목표

  • 1인 1 IP 제공
    • MetalLB 의 IP 풀에서 테넌트당 하나의 외부 IP를 고정적으로 할당
  • SSH 통로 개방
    • 80/443 포트가 아닌, SSH용 22번 포트를 외부로 노출하여 사용자가 터미널
  • 추상화 제거
    • 사용자는 본인의ㅏ 파드가 쿠버네티스 위에 있는지 몰라도 되며, 오직 부여받은 IP로만 소통
      • 독립된 서버 경험 제공
      • 고정성(Persistence) - 파드가 재시작되거나 노드가 바뀌어도 사용자가 할당 받은 IP와 접속 포트는 변하지 않는 고정성 제공

1-2. 필요한 기술적 장치

  • MetalLB (L2 Mode)
    • 별도의 라우터 설정 없이 ARP 응답 대행을 통해 가상 IP를 물리 네트워크에 바인딩 하는 엔진
    • 클라우드의 LoadBalancer 서비스를 집 안의 홈랩 클러스터로 가져오는 핵심!!
  • Service (Type: LoadBalancer)
    • 파드의 22번 포트를 MetalLB가 선점한 사설 IP의 22번 포트와 1:1로 매핑
  • 공유기 포트포워딩(Port Forwarding)
    • 외부 공인 IP의 특정 포트로 들어온 요청을 MetalLB가 할당한 사설 IP의 22번 포트로 전달하는 이정표

📌 MetalLB 란?

  • 퍼블릭 클라우드에만 존재하는 LoadBalancer 기능을 일반 베어메탈 환경에서도 사용할 수 있게 해주는 네트워크 구현체

✅ 왜 사용하는가??

  • 쿠버네티스에서 서비스의 type: LoadBalancer 는 원래 클라우드 환경을 위해 설계되었다고 합니다.
    • 클라우드: LoadBalancer 를 생성하면 CSP가 자동으로 외부 IP를 할당하고 로드밸러서를 대신 띄워줌
    • 홈랩 : 기본적으로 쿠버네티스는 외부 IP를 줄 수 있는 능력이 없다. 그래서 아무리 설정헤도 외부 IP가 <pending> 상태에 머물게 됨..
    • 해결책 : MetalLB 가 클러스터 내에서 가상의 로드밸런서 역할을 수행하며 외부 IP를 직접 할당하고 관리함

✅ 주요 작동 모드: L2 vs BGP

(현재 사용 중인 모드는 L2)

L2 모드 (Layer 2)

  • MetalLB가 클러스터 내에서 리더 노드(마스터 노드가 아닌, 특정 외부 IP를 책임지는 통신 대표!)를 선출하고, 해당 노드가 네트워크의 ARP 요청에 대신 응답하여 트래픽을 독점적으로 수신한 뒤 실제 파드로 전달하는 방식
  • 장점: 특별한 네트워크 장비(관리형 스위치 등)가 필요 없다. 일반 가정 공유기에서도 잘 작동한다.(홈랩의 한계 == 가정용 공유기/네트워크,,,ㅜ)
  • 단점: 특정 시점에 트래픽이 한 대의 노드로만 몰릴 수 있기 때문에 대역폭의 한계가 있을 수 있음

BGP 모드 (Layer 3)

(데이터센터 급(?)의 설정을 할 때 사용한다고 합니다.)

  • 원리: 라우터와 클러스터가 BGP 프로토콜로 직접 통신하며 경로를 설정함
  • 장점: 여러 노드로 트래픽을 분산시킬 수 있음
  • 단점: BGP를 지원하는 고가의 라우터 장비가 필요함

✅ 핵심 구성 요소

  • Controller : IP 할당을 담당. 서비스가 생성되면 기존에 설정한 IPAddressPool 에서 남는 IP를 찾아 서비스에 매칭시킴
  • Speaker : 네트워크 통신을 담당. L2 모드에서는 각 노드에서 실행되며 광고(Announce)를 수행함.

⚠️ 주의사항

  • 할당하려는 IP 대역은 반드시 공유기의 DHCP 할당 범위와 겹치지 않아야 함!!! (IP 충돌 방지)

2. [기능 개발] MetalLB 설치 및 전용 IP 부여

2-1. MetalLB 설치 (컨트롤러 배포)

  • IP를 관리하고 ARP 응답을 대신해 줄 MetalLB 시스템을 클러스터에 올림
# MetalLB 네이티브 매니페스트 적용
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.12/config/manifests/metallb-native.yaml

# 설치 확인
kubectl get pods -n metallb-system

2-2. IP 주소 범위 지정 (IPAddressPool)

  • metallb-config.yaml
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: tenant-ip-pool
  namespace: metallb-system
spec:
  # 공유기 대역 내에서 안전하게 비어있는 구간 50개 설정
  addresses:
  - 192.168.55.150-192.168.55.199
  # 자동으로 꺼내 쓸 수 있도록 설정
  autoAssign: true
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: l2-adv
  namespace: metallb-system
spec:
  # 위에서 만든 pool을 실제로 네트워크에 광고(Announce)함
  ipAddressPools:
  - tenant-ip-pool

2-3. 테넌트용 SSH 서비스 생성 (External Access)

  • 테넌트 파드를 외부 IP와 연결
  • 테넌트가 생성될 때마다 하나씩 만들어 줌
  • tenant-alpha-ssh-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: external-access
  namespace: tenant-alpha
spec:
  selector:
    role: server
  ports:
  - protocol: TCP
    port: 22
    targetPort: 22
  type: LoadBalancer

2-4. 포트포워딩

네트워크 관리자 페이지에서 테넌트 서버의 IP로 사용할 주소를 사전에 포트포워딩 해줌

3. [검증 테스트] 자동 할당 및 SSH 접속 확인

3-1. IP 할당 확인

kubectl get svc -n tenant-alpha
  • EXTERNAL -IP 항목이 <pending> 에서 192.168.55.150 (첫 번째 IP) 으로 바뀌면 성공

Flow 정리

트래픽 경로)
외부 클라이언트공유기(포트포워딩)MetalLB 할당 IPService(LB)Pod

구분명칭예시역할
접속 IP공인 IP (Public)218.x.x.x외부 인터넷에서 우리 집을 찾는 주소
접속 포트외부 포트 (Outer)50111공유기 대문에서 테넌트를 구분하는 포트 번호
내부 IPMetalLB 할당 IP192.168.x.x클러스터가 외부 네트워크와 소통하는 사설 주소
내부 포트서비스 포트 (Port)22MetalLB가 외부에 노출한 포트
타겟 포트파드 포트 (Target)22실제 파드 내부의 SSH 서비스 번호
profile
Don’t get mad at the computer.

0개의 댓글