Cilium 스터디 - BGP Control Plane & ClusterMesh

Kevin·2025년 8월 13일

5주차 학습정리 - Cilium BGP Control Plane & ClusterMesh: 대규모 멀티클러스터 네트워킹

🌐 실습 환경 구성 및 아키텍처

1. 확장된 실습 환경 구성

1.1 실습 환경 개요

5주차 실습 환경은 BGP Control Plane과 ClusterMesh를 다루기 위해 FRR 라우터가 포함된 고급 네트워킹 환경으로 구성됩니다. 이 환경은 실제 데이터센터의 네트워크 구조를 시뮬레이션하며, 멀티 네트워크 세그먼트와 BGP 라우팅을 포함합니다.

환경 구성의 핵심 특징:

  1. 분산 네트워크 설계:

    • 192.168.10.0/24 (메인 클러스터 네트워크)
    • 192.168.20.0/24 (원격 노드 네트워크)
    • 이중화된 네트워크 구조로 실제 환경과 유사
  2. FRR 기반 BGP 라우팅:

    • AS 65000을 사용하는 FRR 라우터
    • 사내망 시뮬레이션을 위한 loopback 인터페이스
    • BGP 피어링을 통한 동적 라우팅
  3. 실제 데이터센터 시나리오:

    • 서로 다른 네트워크 세그먼트의 k8s 노드
    • BGP를 통한 PodCIDR 및 Service 광고
    • ECMP를 통한 고가용성 및 로드밸런싱

핵심 구성 요소:

  1. k8s-ctr: Control Plane 노드 (192.168.10.100, PodCIDR: 172.20.0.0/24)
  2. k8s-w1: Worker 노드 1 (192.168.10.101, PodCIDR: 172.20.1.0/24)
  3. k8s-w0: Worker 노드 2 (192.168.20.100, PodCIDR: 172.20.2.0/24) - 다른 네트워크 대역
  4. 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 설정을 관리할 수 있는 고급 네트워킹 기능입니다. 이는 기존의 복잡한 BGP 설정을 Kubernetes 네이티브 방식으로 선언적으로 관리할 수 있게 해주는 혁신적인 접근 방식입니다.

BGP Control Plane v2의 핵심 개념:

CRD 기반 설정 관리:
Cilium BGP는 4개의 주요 Custom Resource Definitions를 통해 계층적이고 유연한 BGP 설정을 제공합니다:

  1. CiliumBGPClusterConfig - 클러스터 전체 BGP 설정

    • BGP 인스턴스 정의 및 관리
    • 노드 셀렉터를 통한 세밀한 적용 범위 제어
    • ASN(Autonomous System Number) 설정
    • 피어 그룹 및 정책 연결
  2. CiliumBGPPeerConfig - 재사용 가능한 피어링 설정

    • BGP 타이머 및 세션 관리 (Hold Time, Keep Alive)
    • 그레이스풀 리스타트 정책
    • Address Family 설정 (IPv4/IPv6, unicast/multicast)
    • 인증 및 보안 설정 (MD5 password 등)
  3. CiliumBGPAdvertisement - 광고 정책 정의

    • PodCIDR 자동 광고
    • Service LoadBalancer IP 광고
    • 커스텀 프리픽스 및 라우팅 정책
    • 조건부 광고 (셀렉터 기반)
  4. 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)의 특징:

Kind는 Docker 컨테이너를 Kubernetes 노드로 사용하는 혁신적인 도구로, 로컬 개발 및 테스트 환경에서 실제 Kubernetes 클러스터를 시뮬레이션할 수 있게 해줍니다.

Kind의 핵심 장점:

  1. 빠른 클러스터 생성:

    • Docker 기반으로 매우 빠른 클러스터 생성 및 삭제
    • 가상머신 대비 리소스 효율성
    • 초기화 시간 단축 (1-2분 내 클러스터 준비)
  2. 실제 환경과 유사한 구성:

    • kubeadm을 사용한 정식 클러스터 부트스트래핑
    • 멀티노드 클러스터 지원 (컨트롤 플레인 HA 포함)
    • 실제 Container Runtime (containerd) 사용
  3. 개발 친화적 기능:

    • 호스트 포트 매핑을 통한 서비스 노출
    • 볼륨 마운트 지원
    • 다양한 Kubernetes 버전 지원
  4. ClusterMesh 테스트에 최적:

    • 동일 Docker 네트워크에서 다중 클러스터 운영
    • 클러스터 간 직접 통신 가능
    • 복잡한 네트워킹 시나리오 테스트 용이

Kind vs 기존 솔루션 비교:

  • minikube: 단일 노드 제한, Kind는 멀티노드 지원
  • k3s: 경량화에 초점, Kind는 표준 Kubernetes 환경 제공
  • VM 기반: 무거운 리소스, Kind는 컨테이너 기반 효율성

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의 핵심 개념과 동작 원리:

1. ServiceExport - 서비스 내보내기

  • 로컬 서비스를 다른 클러스터에서 접근 가능하도록 내보내기
  • 네임스페이스 스코프로 세밀한 제어 가능
  • 자동 서비스 등록 및 광고
  • 보안 정책 기반 접근 제어

2. ServiceImport - 서비스 가져오기

  • 원격 클러스터의 서비스를 로컬에서 사용
  • 자동 생성되는 프록시 서비스
  • 로컬 DNS 통합 (*.svc.clusterset.local)
  • 투명한 로드밸런싱 및 장애 조치

3. 글로벌 서비스 발견 메커니즘

  • DNS 기반 서비스 발견: service.namespace.svc.clusterset.local 형식
  • 자동 엔드포인트 동기화: 원격 클러스터 Pod IP 자동 업데이트
  • 헬스체크 통합: 원격 엔드포인트 상태 모니터링
  • 네트워크 정책 연동: 클러스터 간 보안 정책 적용

4. 로드밸런싱 및 트래픽 관리

  • 멀티클러스터 엔드포인트: 여러 클러스터의 Pod 간 트래픽 분산
  • 지역성 기반 라우팅: 동일 리전 우선 라우팅
  • 가중치 기반 분배: 클러스터별 트래픽 가중치 설정
  • 서킷 브레이커: 장애 클러스터 자동 격리

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. 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 실습

2. 공식 문서 및 가이드

BGP Control Plane:

ClusterMesh:

Kind 환경:

3. 추가 학습 블로그 및 케이스 스터디

실무 적용 사례:

기술 심화:

🛠️ 고급 설정 및 최적화

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 피어링 실패:

# 방화벽 확인
ss -tnlp | grep 179
iptables -L | grep 179

# 라우팅 테이블 확인
ip route show table all

ClusterMesh 인증서 문제:

# 인증서 상태 확인
kubectl get secret -n kube-system | grep cilium-ca

# 인증서 재생성
cilium clustermesh enable --service-type NodePort --enable-kvstoremesh=false

🏗️ 프로덕션 운영 고려사항

1. 확장성 계획

1.1 대규모 클러스터 BGP 설계

📊 다이어그램 참조: 5주차 Mermaid 다이어그램.md

계층적 BGP 설계 (Spine-Leaf Architecture):

대규모 Kubernetes 환경에서 Cilium BGP Control Plane을 효과적으로 활용하기 위해서는 현대적인 데이터센터 네트워크 아키텍처인 Spine-Leaf 구조를 이해하고 적용하는 것이 중요합니다.

Spine-Leaf 아키텍처의 핵심 특징:

1. Spine Layer (스파인 계층)

  • 역할: 백본 네트워크 역할, 모든 Leaf 스위치와 연결
  • AS 설계: 일반적으로 동일한 ASN 사용 (AS 65000)
  • 라우팅 정책: 전체 네트워크의 라우팅 테이블 집약
  • 이중화: 최소 2개 이상의 Spine으로 고가용성 보장

2. Leaf Layer (리프 계층)

  • 역할: ToR(Top of Rack) 스위치, 서버와 직접 연결
  • AS 설계: 각 Leaf별 고유 ASN (AS 65001, 65002, 65003...)
  • 라우팅 범위: 연결된 서버들의 PodCIDR 정보 관리
  • BGP 피어링: Spine과 eBGP, 서버와 eBGP

3. Server Layer (서버 계층)

  • 역할: Kubernetes 노드, Cilium BGP Agent 실행
  • AS 설계: 클러스터별 또는 노드별 ASN 할당
  • 광고 경로: PodCIDR, Service LoadBalancer IP
  • 피어링: 연결된 Leaf 스위치와 eBGP

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"

🎯 5주차 학습 요약

1. 핵심 성취 목표

BGP Control Plane 마스터:

  • ✅ Cilium BGP Control Plane v2 아키텍처 이해
  • ✅ FRR과의 BGP 피어링 설정 및 운영
  • ✅ LoadBalancer Service BGP 광고 구현
  • ✅ ECMP를 통한 고가용성 로드밸런싱
  • ✅ External Traffic Policy 최적화

ClusterMesh 구현:

  • ✅ Kind 기반 멀티클러스터 환경 구축
  • ✅ 클러스터 간 직접 라우팅 및 통신 확인
  • ✅ MCS API를 통한 서비스 Export/Import
  • ✅ Hubble을 통한 멀티클러스터 가시성

2. 실무 적용 포인트

대규모 환경 설계:

  • BGP 계층화: Spine-Leaf 아키텍처 적용
  • ASN 설계: 조직 구조에 맞는 ASN 할당 체계
  • ECMP 활용: 고가용성과 성능 최적화
  • 라우팅 정책: 세밀한 트래픽 제어

멀티클러스터 전략:

  • 클러스터 분할: 리전, 환경, 팀별 클러스터 운영
  • 서비스 공유: MCS API를 통한 안전한 서비스 공유
  • 네트워크 정책: 클러스터 간 보안 정책 적용
  • 장애 격리: 클러스터 단위 장애 영향 최소화

3. 운영 베스트 프랙티스

BGP 운영:

  • 모니터링: BGP 세션 상태 및 경로 정보 지속 감시
  • 자동화: BGP 설정 변경 자동화 및 검증
  • 백업: 경로 다중화를 통한 가용성 확보
  • 보안: MD5 인증 및 접근 제어 적용

ClusterMesh 운영:

  • 인증서 관리: 자동 갱신 및 만료 모니터링
  • 네트워크 분할: 클러스터 간 네트워크 세그멘테이션
  • 성능 최적화: etcd 및 apiserver 튜닝
  • 장애 대응: 클러스터 격리 및 복구 절차

4. 다음 단계 발전 방향

고급 기능 탐구:

  • WireGuard 암호화: 클러스터 간 투명 암호화
  • Ingress 통합: 멀티클러스터 Ingress 구현
  • Service Mesh: Istio와 Cilium 통합 운영
  • GitOps: Cilium 설정의 선언적 관리

성능 최적화:

  • 커널 바이패스: XDP 및 DPDK 활용
  • 하드웨어 가속: SmartNIC 활용 방안
  • 메모리 최적화: 대용량 환경 메모리 효율성
  • CPU 최적화: eBPF 프로그램 최적화

5. 권장 심화 실습

  1. 프로덕션 BGP 시뮬레이션: 실제 네트워크 장비와 BGP 연동
  2. DR 시나리오: 멀티리전 ClusterMesh 장애 복구 테스트
  3. 성능 벤치마킹: 다양한 로드밸런싱 모드 성능 비교
  4. 보안 강화: BGP 및 ClusterMesh 보안 정책 적용
  5. 자동화 구현: Infrastructure as Code로 Cilium 관리
profile
성장해나가는 개발자입니다.

0개의 댓글