
쿠버네티스 내부의 파드는 기본적으로 외부와 격리되어 있습니다. 관리자(나)는 각 테넌트 네임스페이스에
MetalLB를 이용한LoadBalancer IP를 할당하고, 이를 통해 사용자가 할당받은 IP로 즉시SSH접속을 할 수 있는 환경을 구축해보고자 합니다. 이렇게 한다면 각 테넌트 입장에서 고유한 가상 서버를 제공받고, 사용하는 경험을 하게 됩니다. (초기 프로젝트 목표였던, 외부 테넌트에게 CSP처럼 인스턴스를 제공하는 부분의 핵심입니다!)
네트워크 독립성 확보 : 테넌트별로 고유한 내부망 IP(LoadBalancer IP) 를 할당하여 자원 간 간섭을 최소화접속 편의성 극대화 : 22번 포트(SSH 전용)를 외부로 노출하여 접속 가능하도록 환경 구성인프라 추상화 : 테넌트가 쿠버넽네티스 노드나 파드의 개념을 몰라도, 부여받은 IP 하나로 서버(인스턴스)처럼 활용할 수 있게 함사용자가 파드를 ‘하나의 독립된 가상 서버’처럼 느끼게 하기 위해 네트워크 접점을 제공
1인 1 IP 제공SSH 통로 개방추상화 제거MetalLB (L2 Mode)Service (Type: LoadBalancer)MetalLB가 선점한 사설 IP의 22번 포트와 1:1로 매핑공유기 포트포워딩(Port Forwarding)📌 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 충돌 방지)
# MetalLB 네이티브 매니페스트 적용
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.12/config/manifests/metallb-native.yaml
# 설치 확인
kubectl get pods -n metallb-system
metallb-config.yamlapiVersion: 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
tenant-alpha-ssh-service.yamlapiVersion: v1
kind: Service
metadata:
name: external-access
namespace: tenant-alpha
spec:
selector:
role: server
ports:
- protocol: TCP
port: 22
targetPort: 22
type: LoadBalancer
네트워크 관리자 페이지에서 테넌트 서버의 IP로 사용할 주소를 사전에 포트포워딩 해줌
kubectl get svc -n tenant-alpha
EXTERNAL -IP 항목이 <pending> 에서 192.168.55.150 (첫 번째 IP) 으로 바뀌면 성공트래픽 경로)
외부 클라이언트→공유기(포트포워딩)→MetalLB 할당 IP→Service(LB)→Pod
| 구분 | 명칭 | 예시 | 역할 |
|---|---|---|---|
| 접속 IP | 공인 IP (Public) | 218.x.x.x | 외부 인터넷에서 우리 집을 찾는 주소 |
| 접속 포트 | 외부 포트 (Outer) | 50111 | 공유기 대문에서 테넌트를 구분하는 포트 번호 |
| 내부 IP | MetalLB 할당 IP | 192.168.x.x | 클러스터가 외부 네트워크와 소통하는 사설 주소 |
| 내부 포트 | 서비스 포트 (Port) | 22 | MetalLB가 외부에 노출한 포트 |
| 타겟 포트 | 파드 포트 (Target) | 22 | 실제 파드 내부의 SSH 서비스 번호 |