BGP Control Plane & ClusterMesh¶
Cilium의 BGP Control Plane 설정과 ClusterMesh를 통한 멀티 클러스터 연동 방법을 정리한다.
실습 환경 구성 및 아키텍처¶
1. 확장된 실습 환경 구성¶
1.1 실습 환경 개요¶

5주차 실습 환경은 BGP Control Plane과 ClusterMesh를 다루기 위해 FRR 라우터가 포함된 고급 네트워킹 환경으로 구성된다. 이 환경은 실제 데이터센터의 네트워크 구조를 시뮬레이션하며, 멀티 네트워크 세그먼트와 BGP 라우팅을 포함한다.
환경 구성의 핵심 특징:
- 분산 네트워크 설계:
- 192.168.10.0/24 (메인 클러스터 네트워크)
- 192.168.20.0/24 (원격 노드 네트워크)
-
이중화된 네트워크 구조로 실제 환경과 유사
-
FRR 기반 BGP 라우팅:
- AS 65000을 사용하는 FRR 라우터
- 사내망 시뮬레이션을 위한 loopback 인터페이스
-
BGP 피어링을 통한 동적 라우팅
-
실제 데이터센터 시나리오:
- 서로 다른 네트워크 세그먼트의 k8s 노드
- BGP를 통한 PodCIDR 및 Service 광고
- ECMP를 통한 고가용성 및 로드밸런싱
핵심 구성 요소:
- k8s-ctr: Control Plane 노드 (192.168.10.100, PodCIDR: 172.20.0.0/24)
- k8s-w1: Worker 노드 1 (192.168.10.101, PodCIDR: 172.20.1.0/24)
- k8s-w0: Worker 노드 2 (192.168.20.100, PodCIDR: 172.20.2.0/24) - 다른 네트워크 대역
- router: FRR BGP 라우터 (AS 65000) - eth1: 192.168.10.200/24, eth2: 192.168.20.200/24, loop1: 10.10.1.200/24, loop2: 10.10.2.200/24
1.2 실습 환경 배포¶
Vagrant를 통한 자동 배포:
# 실습 환경 배포
mkdir cilium-lab && cd cilium-lab
curl -O https://raw.githubusercontent.com/gasida/vagrant-lab/refs/heads/main/cilium-study/5w/Vagrantfile
vagrant up
# 기본 정보 확인
vagrant ssh k8s-ctr
# 호스트 정보 확인
cat /etc/hosts
for i in k8s-w0 k8s-w1 router; do
echo ">> node : $i <<"
sshpass -p 'vagrant' ssh -o StrictHostKeyChecking=no vagrant@$i hostname
echo
done
1.3 클러스터 기본 정보 확인¶
클러스터 설정 확인:
# 클러스터 정보
kubectl cluster-info
kubectl cluster-info dump | grep -m 2 -E "cluster-cidr|service-cluster-ip-range"
# 노드 정보 확인
kubectl get node -owide
kubectl get nodes -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.podCIDR}{"\n"}{end}'
# Cilium 설정 확인 (BGP Control Plane 미리 활성화됨)
cilium config view | grep -i bgp
# Expected output:
# bgp-router-id-allocation-ip-pool: default
# bgp-router-id-allocation-mode:
# bgp-secrets-namespace: kube-system
# enable-bgp-control-plane: true
# enable-bgp-control-plane-status-report: true
1.4 네트워크 정보 확인¶
라우팅 정보 분석:
# autoDirectNodeRoutes=false 확인 (BGP로 경로 학습 예정)
cilium config view | grep auto-direct-node-routes
# 각 노드의 네트워크 인터페이스 확인
ip -c -4 addr show dev eth1
for i in w1 w0; do
echo ">> node : k8s-$i <<"
sshpass -p 'vagrant' ssh vagrant@k8s-$i ip -c -4 addr show dev eth1
echo
done
# 라우팅 테이블 확인 (노드별 PodCIDR 라우팅 없음을 확인)
ip -c route | grep static
for i in w1 w0; do
echo ">> node : k8s-$i <<"
sshpass -p 'vagrant' ssh vagrant@k8s-$i ip -c route
echo
done
2. 샘플 애플리케이션 배포 및 통신 문제 확인¶
2.1 샘플 애플리케이션 배포¶
# 3개 노드에 분산 배포될 샘플 애플리케이션
cat << EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
name: webpod
spec:
replicas: 3
selector:
matchLabels:
app: webpod
template:
metadata:
labels:
app: webpod
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- sample-app
topologyKey: "kubernetes.io/hostname"
containers:
- name: webpod
image: traefik/whoami
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: webpod
labels:
app: webpod
spec:
selector:
app: webpod
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP
EOF
# 테스트 클라이언트 배포
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: curl-pod
labels:
app: curl
spec:
nodeName: k8s-ctr
containers:
- name: curl
image: nicolaka/netshoot
command: ["tail"]
args: ["-f", "/dev/null"]
terminationGracePeriodSeconds: 0
EOF
2.2 통신 문제 확인¶
현재 상황: 노드 내의 파드들끼리만 통신 가능
# 배포 상태 확인
kubectl get deploy,svc,ep webpod -owide
kubectl get endpointslices -l app=webpod
kubectl get ciliumendpoints
# 통신 테스트 (일부 Pod에만 연결됨)
kubectl exec -it curl-pod -- curl -s --connect-timeout 1 webpod | grep Hostname
kubectl exec -it curl-pod -- sh -c 'while true; do curl -s --connect-timeout 1 webpod | grep Hostname; echo "---"; sleep 1; done'
# Cilium 상태 확인
kubectl exec -n kube-system ds/cilium -- cilium-dbg endpoint list
kubectl exec -n kube-system ds/cilium -- cilium-dbg service list
kubectl exec -n kube-system ds/cilium -- cilium-dbg bpf lb list
문제 원인: - autoDirectNodeRoutes=false로 설정되어 노드 간 자동 라우팅 비활성화 - BGP를 통한 동적 라우팅이 아직 설정되지 않음 - k8s-w0 노드는 다른 네트워크 대역에 위치하여 직접 통신 불가
Cilium BGP Control Plane 심화 분석¶
1. BGP Control Plane 개념 및 아키텍처¶
1.1 Cilium BGP Control Plane 소개¶


Cilium BGP Control Plane (BGPv2)는 Cilium Custom Resources를 통해 BGP 설정을 관리할 수 있는 고급 네트워킹 기능이다. Kubernetes 네이티브 방식으로 BGP 설정을 선언적으로 관리할 수 있게 해준다.
CRD 기반 설정 관리:
Cilium BGP는 4개의 주요 Custom Resource Definitions를 통해 계층적이고 유연한 BGP 설정을 제공한다:
| CRD | 역할 |
|---|---|
| CiliumBGPClusterConfig | 클러스터 전체 BGP 설정 - BGP 인스턴스 정의, 노드 셀렉터 적용 범위 제어, ASN 설정, 피어 그룹 및 정책 연결 |
| CiliumBGPPeerConfig | 재사용 가능한 피어링 설정 - BGP 타이머 및 세션 관리, 그레이스풀 리스타트 정책, Address Family 설정, 인증 및 보안 설정 |
| CiliumBGPAdvertisement | 광고 정책 정의 - PodCIDR 자동 광고, Service LoadBalancer IP 광고, 커스텀 프리픽스 및 라우팅 정책, 조건부 광고 |
| CiliumBGPNodeConfigOverride | 노드별 세부 제어 - 특정 노드의 BGP 설정 오버라이드, 노드별 ASN 할당, 지역별 또는 역할별 차별화된 설정 |
1.2 GoBGP 기반 구현의 특징¶
Cilium BGP의 독특한 동작:
- 컨트롤 플레인만 동작: BGP 세션을 맺고 prefix를 광고하거나 수신
- 커널 라우팅 테이블 주입 안 함: 수신한 경로를 Linux FIB에 바로 주입하지 않음
- eBPF 내부 처리: LoadBalancer 서비스 광고, PodCIDR 전파 용도로만 사용
- GoBGP 기본 설정:
disable-telemetry,disable-fib상태로 빌드됨
2. FRR 라우터 설정¶
2.1 FRR 기본 설정 확인¶
# router 접속
sshpass -p 'vagrant' ssh vagrant@router
# FRR 프로세스 확인
ps -ef | grep frr
# Expected output:
# root 4127 1 0 13:38 ? 00:00:00 /usr/lib/frr/watchfrr -d -F traditional zebra bgpd staticd
# frr 4140 1 0 13:38 ? 00:00:00 /usr/lib/frr/zebra -d -F traditional -A 127.0.0.1 -s 90000000
# frr 4145 1 0 13:38 ? 00:00:00 /usr/lib/frr/bgpd -d -F traditional -A 127.0.0.1
# frr 4152 1 0 13:38 ? 00:00:00 /usr/lib/frr/staticd -d -F traditional -A 127.0.0.1
# FRR 설정 확인
vtysh -c 'show running'
vtysh -c 'show ip bgp summary'
vtysh -c 'show ip bgp'
vtysh -c 'show ip route'
2.2 Cilium 노드와 BGP 피어링 설정¶
방법 1: 설정 파일 직접 편집
# /etc/frr/frr.conf 파일에 추가
cat << EOF >> /etc/frr/frr.conf
neighbor CILIUM peer-group
neighbor CILIUM remote-as external
neighbor 192.168.10.100 peer-group CILIUM
neighbor 192.168.10.101 peer-group CILIUM
neighbor 192.168.20.100 peer-group CILIUM
EOF
# FRR 서비스 재시작
systemctl daemon-reexec && systemctl restart frr
systemctl status frr --no-pager --full
# 로그 모니터링
journalctl -u frr -f
방법 2: vtysh 대화형 설정
vtysh
# BGP 설정 모드 진입
conf
router bgp 65000
# 피어 그룹 설정
neighbor CILIUM peer-group
neighbor CILIUM remote-as external
neighbor 192.168.10.100 peer-group CILIUM
neighbor 192.168.10.101 peer-group CILIUM
neighbor 192.168.20.100 peer-group CILIUM
# 설정 저장 및 종료
end
write memory
exit
3. Cilium BGP Control Plane 설정¶
3.1 BGP 노드 라벨링¶
# BGP가 동작할 노드에 라벨 설정
kubectl label nodes k8s-ctr k8s-w0 k8s-w1 enable-bgp=true
kubectl get node -l enable-bgp=true
3.2 Cilium BGP 설정 적용¶
# 터미널 1: FRR 로그 모니터링
journalctl -u frr -f
# 터미널 2: 통신 테스트 지속
kubectl exec -it curl-pod -- sh -c 'while true; do curl -s --connect-timeout 1 webpod | grep Hostname; echo "---"; sleep 1; done'
# BGP 설정 적용
cat << EOF | kubectl apply -f -
apiVersion: cilium.io/v2
kind: CiliumBGPAdvertisement
metadata:
name: bgp-advertisements
labels:
advertise: "bgp"
spec:
advertisements:
- advertisementType: "PodCIDR"
---
apiVersion: cilium.io/v2
kind: CiliumBGPPeerConfig
metadata:
name: cilium-peer
spec:
timers:
holdTimeSeconds: 9
keepAliveTimeSeconds: 3
ebgpMultihop: 2
gracefulRestart:
enabled: true
restartTimeSeconds: 15
families:
- afi: ipv4
safi: unicast
advertisements:
matchLabels:
advertise: "bgp"
---
apiVersion: cilium.io/v2
kind: CiliumBGPClusterConfig
metadata:
name: cilium-bgp
spec:
nodeSelector:
matchLabels:
"enable-bgp": "true"
bgpInstances:
- name: "instance-65001"
localASN: 65001
peers:
- name: "tor-switch"
peerASN: 65000
peerAddress: 192.168.10.200 # router ip address
peerConfigRef:
name: "cilium-peer"
EOF
4. BGP 연결 및 통신 확인¶
4.1 BGP 세션 상태 확인¶
# Cilium BGP 상태 확인
cilium bgp peers
cilium bgp routes available ipv4 unicast
# BGP 설정 리소스 확인
kubectl get ciliumbgpadvertisements,ciliumbgppeerconfigs,ciliumbgpclusterconfigs
kubectl get ciliumbgpnodeconfigs -o yaml | yq
# 예상 출력:
# "peeringState": "established"
# "routeCount": {"advertised": 2, "afi": "ipv4", "received": 1, "safi": "unicast"}
4.2 FRR 라우터에서 BGP 정보 확인¶
# FRR에서 BGP 상태 확인
sshpass -p 'vagrant' ssh vagrant@router "sudo vtysh -c 'show ip bgp summary'"
# Expected output:
# Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd PfxSnt Desc
# 192.168.10.100 4 65001 509 511 0 0 0 00:25:15 1 4 N/A
# 192.168.10.101 4 65001 508 511 0 0 0 00:25:15 1 4 N/A
# 192.168.20.100 4 65001 509 511 0 0 0 00:25:15 1 4 N/A
sshpass -p 'vagrant' ssh vagrant@router "sudo vtysh -c 'show ip bgp'"
# Expected routes:
# Network Next Hop Metric LocPrf Weight Path
# *> 172.20.0.0/24 192.168.10.100 0 0 65001 i
# *> 172.20.1.0/24 192.168.10.101 0 0 65001 i
# *> 172.20.2.0/24 192.168.20.100 0 0 65001 i
# 라우팅 테이블 확인
sshpass -p 'vagrant' ssh vagrant@router ip -c route | grep bgp
# Expected output:
# 172.20.0.0/24 nhid 32 via 192.168.10.100 dev eth1 proto bgp metric 20
# 172.20.1.0/24 nhid 30 via 192.168.10.101 dev eth1 proto bgp metric 20
# 172.20.2.0/24 nhid 31 via 192.168.20.100 dev eth2 proto bgp metric 20
5. 라우팅 문제 해결¶
5.1 문제 상황 분석¶
Cilium BGP의 특징: - BGP로 학습한 경로가 K8s 노드의 커널 라우팅 테이블에 주입되지 않음 - 2개 이상의 NIC 사용 시 노드에 직접 라우팅 설정이 필요 - Default Gateway가 eth0로 설정되어 있고, k8s 통신은 eth1 사용
5.2 해결 방안: 정적 라우팅 설정¶
# 각 노드에 PodCIDR 대역에 대한 라우팅 설정
ip route add 172.20.0.0/16 via 192.168.10.200
sshpass -p 'vagrant' ssh vagrant@k8s-w1 sudo ip route add 172.20.0.0/16 via 192.168.10.200
sshpass -p 'vagrant' ssh vagrant@k8s-w0 sudo ip route add 172.20.0.0/16 via 192.168.20.200
# 라우팅 설정 확인
ip -c route | grep 172.20
sshpass -p 'vagrant' ssh vagrant@k8s-w1 ip -c route | grep 172.20
sshpass -p 'vagrant' ssh vagrant@k8s-w0 ip -c route | grep 172.20
# 통신 테스트 (성공 예상)
kubectl exec -it curl-pod -- sh -c 'while true; do curl -s --connect-timeout 1 webpod | grep Hostname; echo "---"; sleep 1; done'
5.3 Hubble을 통한 트래픽 분석¶
# Hubble 포트 포워딩
cilium hubble port-forward &
hubble status
# 플로우 로그 모니터링
hubble observe -f --protocol tcp --pod curl-pod
# BGP 패킷 분석 (선택사항)
tcpdump -i eth1 tcp port 179 -w /tmp/bgp.pcap
termshark -r /tmp/bgp.pcap
6. 노드 유지보수 시나리오¶
6.1 노드 유지보수 (k8s-w0 드레인)¶
# 현재 BGP 피어 상태 확인
cilium bgp peers
# Expected:
# Node Local AS Peer AS Peer Address Session State Uptime Family Received Advertised
# k8s-ctr 65001 65000 192.168.10.200 established 2h13m35s ipv4/unicast 3 2
# k8s-w1 65001 65000 192.168.10.200 established 2h13m36s ipv4/unicast 3 2
# 노드 드레인 및 BGP 비활성화
kubectl drain k8s-w0 --ignore-daemonsets
kubectl label nodes k8s-w0 enable-bgp=false --overwrite
# 상태 확인
kubectl get node
kubectl get ciliumbgpnodeconfigs
cilium bgp peers
# FRR에서 BGP 테이블 확인
sshpass -p 'vagrant' ssh vagrant@router "sudo vtysh -c 'show ip bgp summary'"
sshpass -p 'vagrant' ssh vagrant@router "sudo vtysh -c 'show ip bgp'"
sshpass -p 'vagrant' ssh vagrant@router ip -c route | grep bgp
6.2 원복 설정¶
# BGP 재활성화 및 노드 복구
kubectl label nodes k8s-w0 enable-bgp=true --overwrite
kubectl uncordon k8s-w0
# Pod 재분배
kubectl scale deployment webpod --replicas 0
kubectl scale deployment webpod --replicas 3
# 상태 확인
kubectl get node
kubectl get ciliumbgpnodeconfigs
cilium bgp peers
Service LoadBalancer BGP 광고¶
1. LoadBalancer IPAM과 BGP 통합¶
1.1 LoadBalancer IP Pool 생성¶
# BGP로 광고할 LoadBalancer IP Pool 생성
cat << EOF | kubectl apply -f -
apiVersion: "cilium.io/v2"
kind: CiliumLoadBalancerIPPool
metadata:
name: "cilium-pool"
spec:
allowFirstLastIPs: "No"
blocks:
- cidr: "172.16.1.0/24"
EOF
# IP Pool 상태 확인
kubectl get ippool
# Expected output:
# NAME DISABLED CONFLICTING IPS AVAILABLE AGE
# cilium-pool false False 254 254 8s
1.2 LoadBalancer 서비스 생성¶
# webpod 서비스를 LoadBalancer 타입으로 변경
kubectl patch svc webpod -p '{"spec": {"type": "LoadBalancer"}}'
# 서비스 상태 확인
kubectl get svc webpod
# Expected output:
# NAME TYPE CLUSTER-IP EXTERNAL-IP PORTS AGE
# webpod LoadBalancer 10.96.39.92 172.16.1.1 80:30800/TCP 3h56m
# External Traffic Policy 확인
kubectl describe svc webpod | grep 'Traffic Policy'
# Expected: External Traffic Policy: Cluster, Internal Traffic Policy: Cluster
2. BGP Advertisement 설정¶
2.1 LoadBalancer IP BGP 광고 설정¶
# LoadBalancer IP를 BGP로 광고하는 Advertisement 생성
cat << EOF | kubectl apply -f -
apiVersion: cilium.io/v2
kind: CiliumBGPAdvertisement
metadata:
name: bgp-advertisements-lb-exip-webpod
labels:
advertise: bgp
spec:
advertisements:
- advertisementType: "Service"
service:
addresses:
- "LoadBalancerIP"
selector:
matchExpressions:
- { key: app, operator: In, values: [ webpod ] }
EOF
# Advertisement 확인
kubectl get CiliumBGPAdvertisement
# Expected output:
# NAME AGE
# bgp-advertisements 2m1s
# bgp-advertisements-lb-exip-webpod 3s
2.2 BGP 라우팅 정책 및 경로 확인¶
# BGP 라우팅 정책 확인
kubectl exec -it -n kube-system ds/cilium -- cilium-dbg bgp route-policies
# BGP 경로 확인
cilium bgp routes available ipv4 unicast
# Expected output showing LoadBalancer IP advertisement
# FRR에서 LoadBalancer IP 경로 확인
sshpass -p 'vagrant' ssh vagrant@router "sudo vtysh -c 'show ip bgp 172.16.1.1/32'"
# Expected output:
# BGP routing table entry for 172.16.1.1/32, version 7
# Paths: (3 available, best #1, table default)
# 65001
# 192.168.10.100 from 192.168.10.100 (192.168.10.100)
# Origin IGP, valid, external, multipath, best
# 65001
# 192.168.20.100 from 192.168.20.100 (192.168.20.100)
# Origin IGP, valid, external, multipath
# 65001
# 192.168.10.101 from 192.168.10.101 (192.168.10.101)
# Origin IGP, valid, external, multipath
3. ECMP 및 LoadBalancer 트래픽 분석¶
3.1 ECMP (Equal Cost Multi-Path) 동작 확인¶
# router에서 ECMP 라우팅 확인
sshpass -p 'vagrant' ssh vagrant@router ip -c route | grep 172.16.1.1
# Expected output:
# 172.16.1.1 nhid 71 proto bgp metric 20
# nexthop via 192.168.10.101 dev eth1 weight 1
# nexthop via 192.168.10.100 dev eth1 weight 1
# nexthop via 192.168.20.100 dev eth2 weight 1
# LoadBalancer IP 접근 테스트
LBIP=172.16.1.1
curl -s $LBIP | grep Hostname
curl -s $LBIP | grep RemoteAddr
# 반복 접속으로 로드밸런싱 확인
for i in {1..100}; do
curl -s $LBIP | grep Hostname
done | sort | uniq -c | sort -nr
# 지속적인 접속 테스트
while true; do
curl -s $LBIP | egrep 'Hostname|RemoteAddr'
sleep 0.1
done
3.2 External Traffic Policy 설정¶

Cluster vs Local 정책 비교:


# 현재 External Traffic Policy 확인
kubectl describe svc webpod | grep 'Traffic Policy'
# Expected: External Traffic Policy: Cluster
# replicas를 2로 줄여서 테스트
kubectl scale deployment webpod --replicas 2
kubectl get pod -owide
# 각 노드에서 패킷 모니터링 준비
# 터미널 1 (k8s-w1): tcpdump -i eth1 -A -s 0 -nn 'tcp port 80'
# 터미널 2 (k8s-w0): tcpdump -i eth1 -A -s 0 -nn 'tcp port 80'
# 터미널 3 (k8s-ctr): tcpdump -i eth1 -A -s 0 -nn 'tcp port 80'
# Cluster 모드에서 접속 테스트 (모든 노드로 분산)
for i in {1..100}; do
curl -s $LBIP | grep Hostname
done | sort | uniq -c | sort -nr
Local 정책으로 변경:
# External Traffic Policy를 Local로 변경
kubectl patch service webpod -p '{"spec":{"externalTrafficPolicy":"Local"}}'
# BGP 광고 상태 확인 (서비스에 대상 파드가 있는 노드만 광고)
sshpass -p 'vagrant' ssh vagrant@router "sudo vtysh -c 'show ip bgp'"
sshpass -p 'vagrant' ssh vagrant@router "sudo vtysh -c 'show ip bgp 172.16.1.1/32'"
sshpass -p 'vagrant' ssh vagrant@router ip -c route | grep 172.16.1.1
# Local 모드에서 접속 테스트 (소스 IP 보존)
for i in {1..100}; do
curl -s $LBIP | grep Hostname
done | sort | uniq -c | sort -nr
while true; do
curl -s $LBIP | egrep 'Hostname|RemoteAddr'
sleep 0.1
done
3.3 Linux ECMP Hash Policy 최적화¶
ECMP 해시 정책 조정:
# 현재 ECMP 해시 정책 확인 (router에서 실행)
sysctl net.ipv4.fib_multipath_hash_policy
# Expected: net.ipv4.fib_multipath_hash_policy = 0 (L3 hash - dest IP only)
# L4 해시로 변경 (더 정교한 부하분산)
sudo sysctl -w net.ipv4.fib_multipath_hash_policy=1
echo "net.ipv4.fib_multipath_hash_policy=1" >> /etc/sysctl.conf
# L4 해시 정책 설명:
# 0: L3 hash (default) - destination IP only
# 1: L4 hash - source IP, dest IP, source port, dest port based hash (more granular)
# 정책 변경 후 부하분산 테스트
kubectl scale deployment webpod --replicas 3
kubectl get pod -owide
for i in {1..100}; do
curl -s $LBIP | grep Hostname
done | sort | uniq -c | sort -nr
Status Report 비활성화 (선택사항)¶
1. BGP Status Report 최적화¶
대규모 클러스터에서의 고려사항:
# 현재 BGP 상태 리포트 확인
kubectl get ciliumbgpnodeconfigs -o yaml | yq '.items[].status'
# BGP Status Report 비활성화 (API 서버 부하 감소)
helm upgrade cilium cilium/cilium --version 1.18.0 \
--namespace kube-system \
--reuse-values \
--set bgpControlPlane.statusReport.enabled=false
kubectl -n kube-system rollout restart ds/cilium
# 비활성화 후 확인 (Status 정보 없음)
kubectl get ciliumbgpnodeconfigs -o yaml | yq '.items[].status'
# Expected: "status": {}
Kind를 통한 ClusterMesh 실습¶
1. Kind 환경 소개¶
1.1 Kind 개념 및 특징¶

Kind (Kubernetes in Docker)는 Docker 컨테이너를 Kubernetes 노드로 사용하는 도구로, 로컬 개발 및 테스트 환경에서 실제 Kubernetes 클러스터를 시뮬레이션할 수 있다.
Kind의 핵심 장점:
- 빠른 클러스터 생성: Docker 기반으로 빠른 클러스터 생성 및 삭제, 1-2분 내 클러스터 준비
- 실제 환경과 유사한 구성: kubeadm을 사용한 정식 클러스터 부트스트래핑, 멀티노드 클러스터 및 HA 지원
- 개발 친화적 기능: 호스트 포트 매핑을 통한 서비스 노출, 볼륨 마운트, 다양한 Kubernetes 버전 지원
- ClusterMesh 테스트에 최적: 동일 Docker 네트워크에서 다중 클러스터 운영, 클러스터 간 직접 통신 가능
Kind vs 기존 솔루션 비교:
| 도구 | 특징 |
|---|---|
| minikube | 단일 노드 제한 |
| k3s | 경량화에 초점, 표준 Kubernetes와 차이 있음 |
| VM 기반 | 무거운 리소스 요구 |
| Kind | 멀티노드 지원, 표준 Kubernetes 환경, 컨테이너 기반 효율성 |
1.2 Kind 설치 및 클러스터 배포¶
Cilium CLI 설치:
# macOS
brew install cilium-cli
# Linux
CILIUM_CLI_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/cilium-cli/main/stable.txt)
CLI_ARCH=amd64
if [ "$(uname -m)" = "aarch64" ]; then CLI_ARCH=arm64; fi
curl -L --fail --remote-name-all \
https://github.com/cilium/cilium-cli/releases/download/${CILIUM_CLI_VERSION}/cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}
sha256sum --check cilium-linux-${CLI_ARCH}.tar.gz.sha256sum
sudo tar xzvfC cilium-linux-${CLI_ARCH}.tar.gz /usr/local/bin
rm cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}
west 클러스터 배포:
# west 클러스터 생성
kind create cluster --name west --image kindest/node:v1.33.2 --config - <<EOF
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
extraPortMappings:
- containerPort: 30000 # sample apps
hostPort: 30000
- containerPort: 30001 # hubble ui
hostPort: 30001
- role: worker
extraPortMappings:
- containerPort: 30002 # sample apps
hostPort: 30002
networking:
podSubnet: "10.0.0.0/16"
serviceSubnet: "10.2.0.0/16"
disableDefaultCNI: true
kubeProxyMode: none
EOF
# 기본 툴 설치
docker exec -it west-control-plane sh -c '
apt update && apt install tree psmisc lsof wget net-tools dnsutils tcpdump ngrep iputils-ping git -y'
docker exec -it west-worker sh -c '
apt update && apt install tree psmisc lsof wget net-tools dnsutils tcpdump ngrep iputils-ping git -y'
east 클러스터 배포:
# east 클러스터 생성
kind create cluster --name east --image kindest/node:v1.33.2 --config - <<EOF
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
extraPortMappings:
- containerPort: 31000 # sample apps
hostPort: 31000
- containerPort: 31001 # hubble ui
hostPort: 31001
- role: worker
extraPortMappings:
- containerPort: 31002 # sample apps
hostPort: 31002
networking:
podSubnet: "10.1.0.0/16"
serviceSubnet: "10.3.0.0/16"
disableDefaultCNI: true
kubeProxyMode: none
EOF
# 기본 툴 설치
docker exec -it east-control-plane sh -c '
apt update && apt install tree psmisc lsof wget net-tools dnsutils tcpdump ngrep iputils-ping git -y'
docker exec -it east-worker sh -c '
apt update && apt install tree psmisc lsof wget net-tools dnsutils tcpdump ngrep iputils-ping git -y'
1.3 Kind 환경 확인¶
# 클러스터 컨텍스트 확인
kubectl config get-contexts
# Expected output:
# CURRENT NAME CLUSTER AUTHINFO NAMESPACE
# * kind-east kind-east kind-east
# kind-west kind-west kind-west
# alias 설정
alias kwest='kubectl --context kind-west'
alias keast='kubectl --context kind-east'
# 클러스터 정보 확인
kwest get node -owide
keast get node -owide
# Docker 네트워크 확인
docker network ls | grep kind
docker ps -q | xargs docker inspect --format '{{.Name}} {{.NetworkSettings.Networks.kind.IPAddress}}'
2. Cilium CNI 배포¶
2.1 west 클러스터 Cilium 설치¶
# west 클러스터용 Cilium 설치
cilium install --version 1.17.6 --set ipam.mode=kubernetes \
--set kubeProxyReplacement=true --set bpf.masquerade=true \
--set endpointHealthChecking.enabled=false --set healthChecking=false \
--set operator.replicas=1 --set debug.enabled=true \
--set routingMode=native --set autoDirectNodeRoutes=true --set ipv4NativeRoutingCIDR=10.0.0.0/16 \
--set ipMasqAgent.enabled=true --set ipMasqAgent.config.nonMasqueradeCIDRs='{10.1.0.0/16}' \
--set cluster.name=west --set cluster.id=1 \
--context kind-west
# 설치 상태 모니터링
watch kubectl get pod -n kube-system --context kind-west
2.2 east 클러스터 Cilium 설치¶
# east 클러스터용 Cilium 설치
cilium install --version 1.17.6 --set ipam.mode=kubernetes \
--set kubeProxyReplacement=true --set bpf.masquerade=true \
--set endpointHealthChecking.enabled=false --set healthChecking=false \
--set operator.replicas=1 --set debug.enabled=true \
--set routingMode=native --set autoDirectNodeRoutes=true --set ipv4NativeRoutingCIDR=10.1.0.0/16 \
--set ipMasqAgent.enabled=true --set ipMasqAgent.config.nonMasqueradeCIDRs='{10.0.0.0/16}' \
--set cluster.name=east --set cluster.id=2 \
--context kind-east
# 설치 상태 모니터링
watch kubectl get pod -n kube-system --context kind-east
2.3 Cilium 상태 확인¶
# 양 클러스터 상태 확인
kwest get pod -A && keast get pod -A
cilium status --context kind-west
cilium status --context kind-east
# 설정 확인
cilium config view --context kind-west
cilium config view --context kind-east
# 라우팅 정보 확인
docker exec -it west-control-plane ip -c route
docker exec -it west-worker ip -c route
docker exec -it east-control-plane ip -c route
docker exec -it east-worker ip -c route
3. ClusterMesh 설정¶
3.1 ClusterMesh 활성화¶
# 각 클러스터에서 ClusterMesh 활성화
cilium clustermesh enable --service-type NodePort --enable-kvstoremesh=false --context kind-west
cilium clustermesh enable --service-type NodePort --enable-kvstoremesh=false --context kind-east
# clustermesh-apiserver 서비스 확인
kwest get svc,ep -n kube-system clustermesh-apiserver
keast get svc,ep -n kube-system clustermesh-apiserver
# 상태 모니터링
cilium clustermesh status --context kind-west --wait
cilium clustermesh status --context kind-east --wait
3.2 클러스터 연결¶
# 클러스터 간 연결 설정
cilium clustermesh connect --context kind-west --destination-context kind-east
# 연결 상태 확인
cilium status --context kind-west
cilium status --context kind-east
# 예상 출력:
# ClusterMesh: 1/1 remote clusters ready, 0 global-services
# east: ready, 2 nodes, 4 endpoints, 3 identities, 0 services
3.3 라우팅 자동 주입 확인¶
ClusterMesh 설정 시 자동 라우팅:
# 라우팅 정보 확인 (클러스터 간 PodCIDR 자동 주입)
docker exec -it west-control-plane ip -c route | grep 10.1
docker exec -it west-worker ip -c route | grep 10.1
docker exec -it east-control-plane ip -c route | grep 10.0
docker exec -it east-worker ip -c route | grep 10.0
# Expected routes:
# west cluster: 10.1.0.0/16 via east cluster nodes
# east cluster: 10.0.0.0/16 via west cluster nodes
4. 멀티클러스터 통신 테스트¶
4.1 테스트 Pod 배포¶
# west 클러스터에 curl-pod 배포
cat << EOF | kubectl apply --context kind-west -f -
apiVersion: v1
kind: Pod
metadata:
name: curl-pod
labels:
app: curl
spec:
containers:
- name: curl
image: nicolaka/netshoot
command: ["tail"]
args: ["-f", "/dev/null"]
terminationGracePeriodSeconds: 0
EOF
# east 클러스터에 curl-pod 배포
cat << EOF | kubectl apply --context kind-east -f -
apiVersion: v1
kind: Pod
metadata:
name: curl-pod
labels:
app: curl
spec:
containers:
- name: curl
image: nicolaka/netshoot
command: ["tail"]
args: ["-f", "/dev/null"]
terminationGracePeriodSeconds: 0
EOF
4.2 클러스터 간 직접 통신 테스트¶
# Pod IP 확인
kwest get pod -owide
keast get pod -owide
# west에서 east로 ping (직접 라우팅)
kubectl exec -it curl-pod --context kind-west -- ping -c 1 10.1.0.128
# east에서 west로 ping (직접 라우팅)
kubectl exec -it curl-pod --context kind-east -- ping -c 1 10.0.0.144
# 패킷 추적 (NAT 없이 직접 라우팅 확인)
kubectl exec -it curl-pod --context kind-east -- tcpdump -i eth0 -nn icmp
docker exec -it east-control-plane tcpdump -i any icmp -nn
5. Hubble 활성화¶
5.1 west 클러스터 Hubble 설정¶
# west 클러스터 Hubble 활성화
helm upgrade cilium cilium/cilium --version 1.17.6 \
--namespace kube-system --reuse-values \
--set hubble.enabled=true --set hubble.relay.enabled=true --set hubble.ui.enabled=true \
--set hubble.ui.service.type=NodePort --set hubble.ui.service.nodePort=30001 \
--kube-context kind-west
kwest -n kube-system rollout restart ds/cilium
# Hubble UI 접속 확인
kwest get svc,ep -n kube-system hubble-ui
open http://localhost:30001
5.2 east 클러스터 Hubble 설정¶
# east 클러스터 Hubble 활성화
helm upgrade cilium cilium/cilium --version 1.17.6 \
--namespace kube-system --reuse-values \
--set hubble.enabled=true --set hubble.relay.enabled=true --set hubble.ui.enabled=true \
--set hubble.ui.service.type=NodePort --set hubble.ui.service.nodePort=31001 \
--kube-context kind-east
keast -n kube-system rollout restart ds/cilium
# Hubble UI 접속 확인
keast get svc,ep -n kube-system hubble-ui
open http://localhost:31001
Cilium MCS API (Multi-Cluster Services)¶
1. MCS API 개념¶
1.1 Multi-Cluster Services 소개¶

Multi-Cluster Services (MCS) API는 Kubernetes SIG-Multicluster에서 정의한 표준으로, 여러 클러스터에 걸쳐 서비스를 안전하고 투명하게 공유할 수 있게 해주는 기술이다.
MCS API의 핵심 개념과 동작 원리:
| 개념 | 설명 |
|---|---|
| ServiceExport | 로컬 서비스를 다른 클러스터에서 접근 가능하도록 내보내기. 네임스페이스 스코프로 세밀한 제어 가능, 자동 서비스 등록 및 광고 |
| ServiceImport | 원격 클러스터의 서비스를 로컬에서 사용. 자동 생성되는 프록시 서비스, 로컬 DNS 통합 (*.svc.clusterset.local) |
| 글로벌 서비스 발견 | DNS 기반 서비스 발견 (service.namespace.svc.clusterset.local 형식), 자동 엔드포인트 동기화, 헬스체크 통합 |
| 로드밸런싱 및 트래픽 관리 | 멀티클러스터 엔드포인트 트래픽 분산, 지역성 기반 라우팅, 가중치 기반 분배, 서킷 브레이커 |
MCS API의 실제 활용 시나리오:
| 시나리오 | 설명 |
|---|---|
| 마이크로서비스 분산 | 서비스별 클러스터 분산 배치 |
| 재해 복구 | 액티브-패시브 멀티클러스터 구성 |
| 블루-그린 배포 | 클러스터 단위 무중단 배포 |
| 데이터 지역성 | 지역별 데이터 처리 및 캐싱 |
1.2 MCS API 활성화¶
# west 클러스터에서 MCS API 활성화
helm upgrade cilium cilium/cilium --version 1.17.6 \
--namespace kube-system --reuse-values \
--set clustermesh.useAPIServer=true \
--set clustermesh.config.enabled=true \
--set clustermesh.apiserver.service.type=NodePort \
--kube-context kind-west
# east 클러스터에서 MCS API 활성화
helm upgrade cilium cilium/cilium --version 1.17.6 \
--namespace kube-system --reuse-values \
--set clustermesh.useAPIServer=true \
--set clustermesh.config.enabled=true \
--set clustermesh.apiserver.service.type=NodePort \
--kube-context kind-east
2. MCS API 실습¶
2.1 서비스 Export/Import 예제¶
# west 클러스터에 웹 서비스 배포
cat << EOF | kubectl apply --context kind-west -f -
apiVersion: apps/v1
kind: Deployment
metadata:
name: webapp
spec:
replicas: 2
selector:
matchLabels:
app: webapp
template:
metadata:
labels:
app: webapp
spec:
containers:
- name: webapp
image: traefik/whoami
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: webapp
spec:
selector:
app: webapp
ports:
- port: 80
targetPort: 80
type: ClusterIP
EOF
# 서비스 내보내기 (ServiceExport)
cat << EOF | kubectl apply --context kind-west -f -
apiVersion: multicluster.x-k8s.io/v1alpha1
kind: ServiceExport
metadata:
name: webapp
spec: {}
EOF
2.2 멀티클러스터 서비스 접근¶
# east 클러스터에서 west의 서비스에 접근
kubectl exec -it curl-pod --context kind-east -- nslookup webapp.default.svc.clusterset.local
kubectl exec -it curl-pod --context kind-east -- curl webapp.default.svc.clusterset.local
# ServiceImport 자동 생성 확인
keast get serviceimport
# 글로벌 서비스 엔드포인트 확인
keast get endpointslice -l multicluster.kubernetes.io/service-name=webapp
고급 설정 및 최적화¶
1. BGP Auto-Discovery¶
ToR Switch와 Server 간 BGP 작업 편의성:
# FRR BGP Listen Range 설정
vtysh
conf
router bgp 65000
bgp listen range 192.168.10.0/24 peer-group CILIUM
bgp listen range 192.168.20.0/24 peer-group CILIUM
end
write memory
Default Gateway Auto-Discovery: - 노드의 기본 게이트웨이를 자동으로 BGP 피어로 설정 - 대규모 환경에서 설정 자동화 지원
2. 성능 최적화 및 모니터링¶
2.1 BGP 성능 튜닝¶
# BGP 타이머 최적화
cat << EOF | kubectl apply -f -
apiVersion: cilium.io/v2
kind: CiliumBGPPeerConfig
metadata:
name: optimized-peer
spec:
timers:
holdTimeSeconds: 180 # 기본값보다 높여 안정성 증대
keepAliveTimeSeconds: 60 # 기본값보다 높여 CPU 부하 감소
gracefulRestart:
enabled: true
restartTimeSeconds: 120 # 재시작 시간 증가
EOF
2.2 ClusterMesh 최적화¶
# etcd 성능 최적화
helm upgrade cilium cilium/cilium --version 1.17.6 \
--namespace kube-system --reuse-values \
--set clustermesh.apiserver.etcd.resources.requests.cpu=200m \
--set clustermesh.apiserver.etcd.resources.requests.memory=512Mi \
--set clustermesh.apiserver.etcd.resources.limits.cpu=1000m \
--set clustermesh.apiserver.etcd.resources.limits.memory=1Gi
3. 트러블슈팅 가이드¶
3.1 BGP 연결 문제¶
# BGP 세션 상태 확인
cilium bgp peers
# BGP 로그 확인
kubectl logs -n kube-system -l k8s-app=cilium -c cilium-agent | grep "subsys=bgp-control-plane"
kubectl logs -n kube-system -l name=cilium-operator | grep "subsys=bgp-cp-operator"
# 네트워크 연결성 확인
kubectl exec -n kube-system ds/cilium -c cilium-agent -- cilium-dbg troubleshoot bgp
3.2 ClusterMesh 연결 문제¶
# ClusterMesh 상태 확인
cilium clustermesh status --wait
# 원격 클러스터 연결 확인
kubectl exec -it -n kube-system ds/cilium -c cilium-agent -- cilium-dbg troubleshoot clustermesh
# etcd 연결 상태 확인
kubectl get ciliumnode -o yaml | yq '.items[].status.cluster-mesh'
3.3 일반적인 해결책¶
BGP 피어링 실패:
ClusterMesh 인증서 문제:
# 인증서 상태 확인
kubectl get secret -n kube-system | grep cilium-ca
# 인증서 재생성
cilium clustermesh enable --service-type NodePort --enable-kvstoremesh=false
프로덕션 운영 고려사항¶
1. 확장성 계획¶
1.1 대규모 클러스터 BGP 설계¶
계층적 BGP 설계 (Spine-Leaf Architecture):
대규모 Kubernetes 환경에서 Cilium BGP Control Plane을 효과적으로 활용하기 위해서는 Spine-Leaf 구조를 이해하고 적용하는 것이 중요한다.
Spine-Leaf 아키텍처의 핵심 특징:
| 계층 | 역할 | AS 설계 |
|---|---|---|
| Spine Layer | 백본 네트워크, 모든 Leaf 스위치와 연결, 전체 라우팅 테이블 집약 | 동일 ASN 사용 (AS 65000), 최소 2개 이상으로 고가용성 보장 |
| Leaf Layer | ToR(Top of Rack) 스위치, 서버와 직접 연결 | 각 Leaf별 고유 ASN (AS 65001, 65002, ...) |
| Server Layer | Kubernetes 노드, Cilium BGP Agent 실행 | 클러스터별 또는 노드별 ASN 할당 |
ASN 할당 전략: - Private ASN 범위 활용: 64512-65534 (16-bit), 4200000000-4294967294 (32-bit) - 계층적 할당: - Spine: AS 65000 - Leaf: AS 65001-65099 (리전/존별) - K8s Cluster: AS 65100-65199 (클러스터별) - 예약 구간: AS 65200-65299 (확장용)
BGP 정책 설계:
| 기법 | 설명 |
|---|---|
| Route Reflector | 대규모 환경에서 Spine을 RR로 활용 |
| Community Tagging | 트래픽 엔지니어링 및 정책 적용 |
| AS-Path Prepending | 경로 우선순위 조정 |
| Route Filtering | 불필요한 경로 필터링 |
고가용성 및 성능 최적화:
| 기법 | 설명 |
|---|---|
| ECMP | 동일 비용 경로를 통한 로드밸런싱 |
| BFD (Bidirectional Forwarding Detection) | 빠른 장애 감지 |
| BGP Graceful Restart | 무중단 BGP 세션 유지보수 |
| Route Dampening | 불안정한 경로 억제 |
확장성 고려사항:
- 모듈러 확장: Leaf-Server 단위 점진적 확장
- 대역폭 오버서브스크립션: 적절한 오버서브스크립션 비율 유지
- 라우팅 테이블 크기: 각 계층별 라우팅 테이블 최적화
- 컨버전스 시간: 네트워크 수렴 시간 최소화
1.2 멀티리전 ClusterMesh¶
# 리전별 클러스터 ID 체계
# Region 1: cluster.id 1-99
# Region 2: cluster.id 100-199
# Region 3: cluster.id 200-299
# 리전 간 연결 설정
cilium clustermesh enable --cluster-id 1 --cluster-name seoul-prod
cilium clustermesh enable --cluster-id 101 --cluster-name tokyo-prod
cilium clustermesh connect --context seoul-prod --destination-context tokyo-prod
2. 보안 고려사항¶
2.1 BGP 보안 강화¶
# BGP MD5 인증 설정
kubectl create secret generic bgp-auth \
--from-literal=password=$(openssl rand -base64 32)
# 네트워크 정책으로 BGP 트래픽 제한
cat << EOF | kubectl apply -f -
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: bgp-security-policy
spec:
endpointSelector:
matchLabels:
k8s-app: cilium
egress:
- toPorts:
- ports:
- port: "179"
protocol: TCP
toFQDNs:
- matchPattern: "*.company.com"
EOF
2.2 ClusterMesh 보안¶
# mTLS 인증서 자동 갱신
helm upgrade cilium cilium/cilium --version 1.17.6 \
--namespace kube-system --reuse-values \
--set clustermesh.apiserver.tls.auto.enabled=true \
--set clustermesh.apiserver.tls.auto.method=cronJob \
--set clustermesh.apiserver.tls.auto.schedule="0 0 1 */2 *" # 2개월마다 갱신
3. 모니터링 및 알림¶
3.1 필수 메트릭¶
# BGP 관련 주요 메트릭
cilium_bgp_session_up # BGP 세션 상태
cilium_bgp_announced_prefixes_total # 광고된 프리픽스 수
cilium_bgp_received_prefixes_total # 수신된 프리픽스 수
# ClusterMesh 관련 주요 메트릭
cilium_clustermesh_remote_clusters # 연결된 원격 클러스터 수
cilium_clustermesh_global_services # 글로벌 서비스 수
cilium_clustermesh_endpoints_per_cluster # 클러스터별 엔드포인트 수
3.2 알림 규칙 예시¶
# Prometheus AlertManager 규칙
groups:
- name: cilium-bgp
rules:
- alert: BGPSessionDown
expr: cilium_bgp_session_up == 0
for: 5m
labels:
severity: critical
annotations:
summary: "BGP session down"
description: "BGP session to {{ $labels.peer_address }} is down"
- alert: ClusterMeshRemoteClusterDown
expr: cilium_clustermesh_remote_clusters < 1
for: 5m
labels:
severity: warning
annotations:
summary: "ClusterMesh remote cluster disconnected"
핵심 성취¶
BGP Control Plane:
- 아키텍처 이해: Cilium BGP Control Plane v2 CRD 기반 설정 관리
- FRR 피어링: FRR과의 BGP 피어링 설정 및 운영
- LoadBalancer 광고: Service BGP 광고 및 IP Pool 연동
- ECMP: 고가용성 로드밸런싱 구현
- Traffic Policy: External Traffic Policy Cluster/Local 비교 및 최적화
ClusterMesh:
- 멀티클러스터 환경: Kind 기반 west/east 클러스터 구축
- 직접 라우팅: 클러스터 간 직접 라우팅 및 통신 확인
- MCS API: ServiceExport/Import를 통한 서비스 공유
- 가시성: Hubble을 통한 멀티클러스터 트래픽 모니터링
운영 베스트 프랙티스¶
BGP 운영:
- 모니터링: BGP 세션 상태 및 경로 정보 지속 감시
- 자동화: BGP 설정 변경 자동화 및 검증
- 백업: 경로 다중화를 통한 가용성 확보
- 보안: MD5 인증 및 접근 제어 적용
ClusterMesh 운영:
- 인증서 관리: 자동 갱신 및 만료 모니터링
- 네트워크 분할: 클러스터 간 네트워크 세그멘테이션
- 성능 최적화: etcd 및 apiserver 튜닝
- 장애 대응: 클러스터 격리 및 복구 절차
YouTube eCHO Episode 시리즈¶
BGP 관련 에피소드:
| 에피소드 | 내용 |
|---|---|
| eCHO Episode 72 | BGP on Cilium - BGP Control Plane 상세 분석 |
| eCHO Episode 45 | Cilium Load Balancing - Service 로드밸런싱 원리 |
| eCHO Episode 39 | Local Redirect Policy - 로컬 트래픽 최적화 |
ClusterMesh 관련 에피소드:
| 에피소드 | 내용 |
|---|---|
| eCHO Episode 56 | Service Mesh with Cilium - 멀티클러스터 서비스 메시 |
| eCHO Episode 84 | Multi-Cluster Networking - ClusterMesh 고급 설정 |
| eCHO Episode 92 | Cilium MCS API - Multi-Cluster Services 실습 |
공식 문서¶
BGP Control Plane: - Cilium BGP Control Plane v2 문서 - BGP Advertisement 설정 가이드 - MetalLB에서 Cilium으로 마이그레이션
ClusterMesh: - ClusterMesh 설정 가이드 - Multi-Cluster Services API - 클러스터 간 네트워크 정책
Kind 환경: - Kind 공식 문서 - Cilium with Kind 설정