cilium에서는 LB-IPAM 기능을 제공하고 있기 때문에 BGP와 연동하면 외부에서도 쉽게 접근 가능한 LB를 구성할 수 있습니다.
따라하며 테스트해보고 싶은 분은 여길 참고하시면 좋을 것 같습니다.
2025.08.15 - [K8S/cilium] - containerlab을 사용하여 cilium + BGP 테스트 환경 만들기
아래와 같이 적용시 bgpControlplan이 활성화 됩니다. statusReport는 운영환경에서 api서버의 부하를 유발할 수 있기 때문에 끄는 것을 권장한다고 합니다.
helm upgrade cilium cilium/cilium --version 1.18.0 \
--namespace kube-system \
--reuse-values \
--set bgpControlPlane.enabled=true \
--set bgpControlPlane.statusReport.enabled=false
kubectl -n kube-system rollout restart deployment/cilium-operator
kubectl -n kube-system rollout restart ds/cilium
설정이 되어있는지 확인하기 위해서는 cilium-agent 내부에서 다음과 같이 입력하면 확인할 수 있습니다.
cilium config -a | grep BGP
잘 활성화 되면 다음과같이 확인할 수 있습니다.
CiliumBGPClusterConfig 설정하기
cilium의 BGP Control Plane을 활성화 했다면 그다음으론 CiliumBGPClusterConfig를 설정해야합니다. BGP Control Planed을 활성화 하는 것만으로는 아무런 BGP 세션도 연결되지 않습니다.
CiliumBGPClusterConfig는 어떤 노드에 BGP Instance들을 구성할지 선택하고 누구(peer)와 연결할지 설정하게 됩니다. 추가로 cilium은 상대방 router에 연결해서 세션을 맺고 통신을 하기 때문에 수신 포트는 지정하지 않습니다. 만약 상대 라우터가 먼저 연결을 해야한다면 localPort를 설정해야합니다. cilium은 iBGP용으로 BGP를 제공하는건 아니지만 예를들어 같은 노드 간의 iBGP 구성을 하게 된다면 각각의 인스턴스들은 모두 상대의 라우터에 연결하려고 하는데 포트가 없으니 연결을 할 수 없겠죠!? 이럴때 localPort를 설정해서 연결할 수 있게 해주어야합니다.
Cilium BGP Cluster Config 예시
apiVersion: cilium.io/v2
kind: CiliumBGPClusterConfig
metadata:
name: cilium-bgp
spec:
nodeSelector:
matchLabels:
rack: rack0
bgpInstances:
- name: "instance-65000"
localASN: 65000
localPort: 179
peers:
- name: "peer-65000-tor1"
peerASN: 65000
peerAddress: fd00:10:0:0::1
peerConfigRef:
name: "cilium-peer"
- name: "peer-65000-tor2"
peerASN: 65000
peerAddress: fd00:11:0:0::1
peerConfigRef:
name: "cilium-peer"
Auto-Discovery 설정하기
ToR(Top of Rack) 스위치에 bgp listen range(동적 이웃 연결 허용?)를 설정할 수 있다면 자동으로 gateway로 가서 TOR 스위치와의 BGP 연결을 하도록 설정할 수 있다고 합니다. TOR 스위치의 모든 ASN도 동일해야한다고합니다.
peers:
- name: "tor-switch"
peerASN: 65000
autoDiscovery:
mode: "DefaultGateway"
defaultGateway:
addressFamily: ipv4 # Can be "ipv4" or "ipv6"
peerConfigRef:
name: "cilium-peer"
추가로 보통 ToR 스위치는 2대인 경우가 있는데 이럴때 multi homing + Default Gateway Auto-Discovery 를 사용해서 한쪽에 장애가 나면 다른 한쪽에 연결되게 할 수도 있습니다. 한쪽이 장애나면 자동으로 다른 한쪽으로 연결되게 된다고 합니다.
bgpInstances:
- name: "65001"
localASN: 65001
peers:
- name: "instance-65001"
peerASN: 65000
autoDiscovery:
mode: "DefaultGateway"
defaultGateway:
addressFamily: ipv6
peerConfigRef:
name: "cilium-peer"
CiliumBGPPeerConfig 설정하기
CiliumBGPPeerConfig으로는 BGP 피어 설정을 할수 있습니다. 공통 설정을 한개 구성해서 여러 피어가 동일한 구성을 공유할 수 있도록 할수도 있습니다.
CiliumBGPPeerConfig으로는 다음과 같은 설정을 할 수 있습니다.
- MD5 비밀번호
- Timers
- eBGP Multihop
- Graceful Restart
- Transport
- Address Families
apiVersion: cilium.io/v2
kind: CiliumBGPPeerConfig
metadata:
name: cilium-peer
spec:
timers:
holdTimeSeconds: 9
keepAliveTimeSeconds: 3
authSecretRef: bgp-auth-secret # md5 hash 비밀 번호 설정
ebgpMultihop: 4
gracefulRestart:
enabled: true
restartTimeSeconds: 15
families:
- afi: ipv4
safi: unicast
advertisements:
matchLabels:
advertise: "bgp"
Graceful Restart
Cilium BGP Control Plane은 Graceful Restarting Speaker 로 동작하도록 설정할 수 있습니다. 이 설정이 활성화 되면 BGP 세션이 재시작 되면서 BGP OPEN 메시지에 graceful restart capability가 들어가게 됩니다. 이렇게 되면 cilium-agent가 재시작 되어도 피어 라우터에서 경로를 변경하지 않고 트래픽을 전달하게 됩니다.
하지만 실제로 cilium-agent가 죽었을 경우를 대비하여 restartTimeSeconds를 설정하여 일정 시간이 지나도 cilium-agent와의 피어 연결이 안된다면 라우터에서는 cilium이 광고한 경로를 삭제하게 됩니다.
agent가 재시작 되면 TCP FIN으로 TCP 소켓을 닫는데 피어는 이후 BGP 상태를 Idle로 변경하고 restartTime을 체크합니다.
md5 hash 비밀번호 설정해보기
이렇게 cilium bgp cluster config 설정만 되어있는 상태에서 진행하겠습니다.
containerlab을 사용해서 router 구성을 하였는데 이런식으로 cilium에 대해 비밀번호 설정을 해뒀습니다.
vtysh -c "show running-config bgpd" | sed -n '/^router bgp 65000/,/!/{p}'
이 상태에서 쿠버네티스에 위의 비밀번호 값을 저장할 시크릿을 생성합니다.
kubectl -n kube-system create secret generic --type=string bgp-auth-secret --from-literal=password=cilium123
이제 피어 설정을 해보도록 하겠습니다.
apiVersion: cilium.io/v2alpha1
kind: CiliumBGPPeerConfig
metadata:
name: cilium-peer
spec:
authSecretRef: bgp-auth-secret # 방금 설정한 md5 비밀번호 시크릿 이름
gracefulRestart:
enabled: true
restartTimeSeconds: 15
families:
- afi: ipv4
safi: unicast
advertisements:
matchLabels:
advertise: "bgp"
위의 설정을 적용하면 오퍼레이터 로그에도 성공하였다고 잘남고
cilium-agent에 들어가서 peer 설정을 확인해보면 잘 설정된 것 을 확인할 수 있습니다.
Session의 값이 establisthed라면 잘 설정 된 것입니다.
CiliumBGPAdvertisement 설정하기
CiliumBGPAdvertisement 리소스는 다양한 광고 타입과 그에 연관된 속성(Attributes) 을 정의합니다. 피어 구성의 families[*].advertisements 라벨 셀렉터가 하나 이상의 CiliumBGPAdvertisement와 매칭될 수 있습니다.
BGP 속성 설정하기
advertisements[*].attributes 에 BGP 경로 속성(Path Attributes)을 설정할 수 있습니다. cilium에서 지원하는 속성에는 두가지가 있습니다.
- Communities = 경로에 정책용 태그를 붙여 상대 라우터의 route-map을 트리거
- LocalPreference = iBGP 내부 우선순위(클수록 선호, eBGP에는 안 전송)
BGP 광고 타입
BGP 광고는 파드 대역을 광고하거나 서비스 대역(+vip)을 광고하게 할 수 있습니다.
POD CIDR 광고하기
BGP Control Plane은 노드의 Pod CIDR 프리픽스 를 광고할 수 있습니다. 이를 통해 로드밸런서나 NAT 없이도 피어 및 연결된 네트워크에서 Pod로 직접 도달할 수 있습니다. IPAM 모드에 따라 두 가지 방식이 있습니다.
먼저 쿠버네티스 IPAM이거나 Cluster Scope IPAM일 경우 다음과 같이구성하면 됩니다. 각 노드의 BGP 인스턴스는 해당 노드에 할당된 Pod CIDR 프리픽스를 광고합니다. 다른 IPAM 유형(aws eni, azure 등)에서는 advertisementType: "PodCIDR" 가 효과가 없으며 PodCIDR 광고를 지원하지 않는다고 합니다.
apiVersion: cilium.io/v2
kind: CiliumBGPAdvertisement
metadata:
name: bgp-advertisements
labels:
advertise: bgp
spec:
advertisements:
- advertisementType: "PodCIDR"
노드 별 파드 대역은 다음과 같고
각 노드 에이전트 별로 라우팅 되는 정보를 확인해보면 각 노드의 파드 대역을 광고하고 있는 것을 알 수있습니다.
control plane에서 확인시
worker 노드에서 확인시
서비스 광고하기
파드 대역 뿐만 아니라 서비스 대역 및 VIP도 광고를 할 수 있습니다.
apiVersion: cilium.io/v2
kind: CiliumBGPAdvertisement
metadata:
name: bgp-advertisements
labels:
advertise: bgp
spec:
advertisements:
- advertisementType: "Service"
service:
addresses:
- ClusterIP
- ExternalIP
- LoadBalancerIP
selector:
matchExpressions:
- { key: bgp, operator: In, values: [ blue ] }
서비스를 생성할 때 externalTrafficPolicy, internalTrafficPolicy를 설정할 수 있는데
ExternalTrafficPolicy / InternalTrafficPolicy를 광고할때는 externalTrafficPolicy가 Cluster이면 모두 광고를 externalTrafficPolicy: Local 이면 파드가 뜬 노드만 광고하게 됩니다.
반대로 ClusterIP를 광고할때에는 internalTrafficPolicy만을 고려하게 됩니다.
'K8S > 🔥 network study🔥' 카테고리의 다른 글
[cilium] containerlab으로 lb ippool 테스트 해보기 (6) | 2025.08.17 |
---|---|
[cilium] cluster mesh 테스트 (0) | 2025.08.17 |
[cilium] VxLAN, Geneve 오버레이 모드 (작성중) (1) | 2025.08.10 |
[cilium] LB IPAM에 Cilium L2 Announement 적용하기 (8) | 2025.08.09 |
[cilium] LB-IPAM 로드밸런서 아이피를 관리하기 (2) | 2025.08.09 |