KubeVirt VM에서 실행되는 중첩 클러스터와 BGP 피어링 구성하기
Kubernetes 클러스터 위 KubeVirt VM에서 실행되는 Calico 노드와 BGP 피어링을 구성하는 방법을 다뤄요. 중첩(nested) 클러스터를 지원하고 워크로드에서 경로를 광고할 수 있게 해주는 기능이에요. BGPPeer, BGPFilter, BGPConfiguration 리소스를 조합해 상위·하위 클러스터 사이 경로를 안전하게 주고받는 절차를 배워요.
출처: 문서
본문
전체 그림
Kubernetes 클러스터에서 실행 중인 KubeVirt VM 위의 Calico 노드와 BGP 피어링을 구성해요.
가치
상위 Kubernetes 클러스터의 VM 안에서 중첩 Kubernetes 클러스터를 실행해요. 네트워크 오버레이 오버헤드를 피하고, 레이어 3 네트워크 도달 범위를 중첩 클러스터의 파드부터 물리 네트워크 인프라까지 끝까지 확장할 수 있어요.
개념
이 가이드는 BGP와 Calico의 BGP 피어링 옵션을 잘 이해하고 있다고 가정해요.
가이드에서는 다음을 포함한 여러 Calico 리소스를 사용해요:
- BGPPeer - 외부 BGP 라우터와의 피어링, 그리고 BGP를 지원하는 워크로드와의 피어링을 모두 구성하는 데 사용해요.
- BGPFilter - BGP 피어 사이에서 어떤 경로를 임포트/익스포트할지 제어하는 BGP 필터를 정의해요.
- BGPConfiguration - 클러스터의 글로벌 BGP 설정을 구성해요.
이 개념들의 일반적인 개요는 BGP 피어링 구성을 참고하세요.
지원되는 BGP 토폴로지
상위·중첩 클러스터 모두 오버레이가 없는(non-overlay) BGP 네트워킹을 사용하도록 구성해야 해요.
상위 클러스터와 중첩 워크로드 클러스터 사이 피어링에는 eBGP를 사용해야 해요. 즉 상위 클러스터와 중첩 클러스터의 AS 번호가 달라야 해요.
워크로드로의 iBGP 피어링은 지원하지 않아요:
- 중첩 클러스터로의 iBGP는 테스트되지 않았어요. 올바른 경로가 재광고되도록 적절한
BGPFilter리소스를 갖추면 동작할 수도 있어요.
워크로드와 피어링하면서 클러스터 안에서 BGP 메시를 쓰는 조합은 지원하지 않아요. 테스트되지 않았고, 경로가 올바르게 재광고되도록 추가 BGPFilter 리소스가 필요할 가능성이 커요.
지원되는 KubeVirt 네트워킹 모드
KubeVirt의 "bridged" 네트워킹 모드만 지원해요. 상위 클러스터에서 워크로드로의 피어링이 워크로드의 "pod IP"로 이뤄지기 때문이에요. 이 IP는 워크로드가 트래픽의 발신지로 사용하는 IP와 일치해야 해요.
시작하기 전에
projectcalico.org/v3 리소스에 접근할 수 있어야 해요. Calico API 서버를 설치(kubectl로 접근 가능)하거나 calicoctl을 사용하세요.
방법
글로벌 BGP 설정 구성
중첩 클러스터에서 BGPPeer 리소스 설정을 쉽게 하려면, 워크로드 BGP 피어링 기능은 상위 클러스터의 모든 노드에 프로비저닝되는 가상 IP(IP 버전별 1개)를 사용해요. 워크로드는 부모 노드의 개별 IP를 알 필요 없이 이 가상 IP와 피어링하도록 구성돼요.
네트워크와의 충돌을 피하려고, 주소는 BGPConfiguration 리소스로 설정 가능하며 기본값은 없어요. 이 기능을 켜려면 반드시 설정해야 해요:
IPv4는 상위 클러스터 네트워크에서 다른 용도로 쓰이지 않는 링크 로컬 IP 주소를 추천해요. Calico는 내부적으로 169.254.0.1과 169.254.0.2를 사용하므로 이 주소는 쓰면 안 돼요. 169.254.169.254(AWS에서 사용) 같은 클라우드 공급자 메타데이터 주소도 피하는 게 좋아요. 이 가이드에서는 169.254.0.179를 사용할게요. 노드에서 다른 용도로 충돌하지 않는다면 같은 주소를 써도 돼요.
IPv6 주소를 사용할 경우 링크 로컬 주소를 쓰면 안 돼요(IPv6는 링크 로컬 주소에 스코프 태그를 붙여야 하는데, Calico에는 현재 올바른 스코프를 프로비저닝할 방법이 없어요). 대신 네트워크에서 다른 용도로 쓰이지 않는 ULA 주소를 추천해요. 이 가이드에서는 fdc9:9723:09bc::1을 사용할게요(RFC 4193에 따라 이 가이드를 위해 무작위로 골랐으니, 여러분에게도 적합할 수 있어요).
IP 주소를 정했다면 BGPConfiguration 리소스를 구성하세요. (IPv6를 사용하지 않으면 IPv6 주소는 생략해도 돼요.)
apiVersion: projectcalico.org/v3
kind: BGPConfiguration
metadata:
name: default
spec:
...
localWorkloadPeeringIPV4: "169.254.0.179"
localWorkloadPeeringIPV6: "fdc9:9723:09bc::1"
BGPFilter 리소스 만들기
워크로드와 피어링할 BGPPeer 리소스를 만들기 전에, 임포트/익스포트할 경로를 제어하는 BGPFilter 리소스를 만들어요.
-
워크로드는 Calico 클러스터 위에서 실행되므로, 호스트 노드를 통한 유효한 기본 경로를 이미 갖고 있다고 볼 수 있어요. 따라서 워크로드로는 경로를 익스포트할 필요가 없어요. 모든 경로의 익스포트를 차단하는 데 쓸 수 있는 다음
BGPFilter리소스를 만드세요.apiVersion: projectcalico.org/v3 kind: BGPFilter metadata: name: no-export spec: exportV4: - action: Reject exportV6: - action: Reject -
보안을 더 강화하려면 워크로드에서 받아들일 경로도 제한하는 게 좋아요. 중첩 클러스터의 IP 풀 안에 있는 경로만 받아들이는
BGPFilter리소스를 만드세요. 예를 들어 중첩 클러스터의 IP 풀이 10.123.0.0/16와 ca11:c0::/48이라면:apiVersion: projectcalico.org/v3 kind: BGPFilter metadata: name: accept-nested-ip-pools spec: importV4: - action: Accept matchOperator: In cidr: 10.123.0.0/16 # IP pool CIDR of nested cluster importV6: - action: Accept matchOperator: In cidr: ca11:c0::/48 # IP pool CIDR of nested cluster
추가로, 워크로드에서 학습한 경로를 ToR에 재광고하도록 Calico에 알려주는 BGPFilter를 만들어야 해요. 다음 BGPFilter 리소스를 만들되, CIDR은 여러분의 중첩 클러스터에 맞게 조정하세요:
apiVersion: projectcalico.org/v3
kind: BGPFilter
metadata:
name: export-to-tor
spec:
exportV4:
- action: Accept
matchOperator: In
cidr: 10.123.0.0/16
source: RemotePeers
exportV6:
- action: Accept
matchOperator: In
cidr: ca11:c0::/48
source: RemotePeers
상위 클러스터 BGP 토폴로지 구성
상위 클러스터가 BGP 네트워킹을 사용하고, ToR(top-of-rack) 라우터와 eBGP로 피어링하도록 구성해요. 예를 들어 downward default 모델을 사용하는 방법이 있어요.
ToR과 피어링하는 BGPPeer 리소스에 위에서 정의한 BGPFilter 리소스를 포함하세요:
apiVersion: projectcalico.org/v3
kind: BGPPeer
metadata:
name: node-tor-peer
spec:
peerIP: <ToR IP>
asNumber: <ToR AS number>
filters:
- export-to-tor
참고: 상위 클러스터가 ToR 라우터와 iBGP로 피어링한다면
node-tor-peer리소스에nextHopMode: Self를 추가하세요. 이렇게 하면 상위 클러스터의 노드가 워크로드에서 학습한 경로의 next hop을 자기 로컬 IP 주소로 재작성해요.
워크로드와 BGP 피어링 구성
상위 클러스터에서 워크로드와 피어링할 BGPPeer 리소스를 만들어요.
-
localWorkloadSelector필드는 어떤 워크로드와 피어링할지 선택하는 데 사용해요. 이 예시에서는color=red레이블이 붙은 워크로드를 선택해요. -
임포트/익스포트할 경로를 제어하려고 위에서 정의한
BGPFilter리소스를BGPPeer리소스에 포함하세요.
apiVersion: projectcalico.org/v3
kind: BGPPeer
metadata:
name: peer-to-workloads
spec:
localWorkloadSelector: color == 'red'
asNumber: <workload cluster's AS number>
filters:
- no-export
- accept-nested-ip-pools
노드별(per-node) BGPPeer와 글로벌 BGPPeer 모두 지원해요. 특정 노드로 피어링을 제한하려면 nodeSelector 필드를 사용하세요.
참고:
localWorkloadSelector는 모든 워크로드에 적용되며 현재 대응되는 "네임스페이스 셀렉터"는 없어요. 네임스페이스 레이블로 매칭하려면 레이블 이름 앞에pcns.를 붙일 수 있어요.
하위 클러스터에서는:
-
BGPConfiguration리소스에서 node-to-node 메시를 비활성화하고 워크로드 클러스터의 AS 번호를 설정했는지 확인해요:apiVersion: projectcalico.org/v3 kind: BGPConfiguration metadata: name: default spec: nodeToNodeMeshEnabled: false asNumber: <workload cluster's AS number> -
상위 클러스터의 가상 IP와 피어링하는
BGPPeer리소스를 (IP 버전별로) 만들어요:apiVersion: projectcalico.org/v3 kind: BGPPeer metadata: name: peer-to-parent-cluster spec: peerIP: 169.254.0.179 asNumber: <parent cluster's AS number> --- apiVersion: projectcalico.org/v3 kind: BGPPeer metadata: name: peer-to-parent-cluster-v6 spec: peerIP: "fdc9:9723:09bc::1" asNumber: <parent cluster's AS number>
중첩 클러스터 여러 개 구성
다음과 같이 중첩 클러스터를 여러 개 구성할 수 있어요:
- 중첩 클러스터마다 겹치지 않는 고유한 IP 풀을 선택해요.
- 상위 클러스터에서: 각 클러스터의 경로를 임포트하도록 새 import
BGPFilter리소스를 만들어요. - 상위 클러스터에서: 각 클러스터가 상위 클러스터와 피어링하도록 새로운 고유 이름의
BGPPeer리소스를 만들어요. 공용 "no-export"BGPFilter리소스는 모든 중첩 클러스터 피어링에서 재사용할 수 있어요. - 상위 클러스터에서:
export-to-torBGPFilter리소스를 업데이트해 새 클러스터의 CIDR을 포함시켜요. - 중첩 클러스터에서:
peer-to-parent-clusterBGPPeer의 사본을 추가해요. 상위 클러스터는 모든 중첩 클러스터에 항상 같은 가상 IP를 사용하므로, 모든 중첩 클러스터에서 동일해야 해요.
참고: 중첩 클러스터를 많이 쓸 계획이라면, IP 풀을 하나의 더 큰 CIDR에서 할당하는 방식을 고려해 보세요. 그러면
export-to-tor필터를 더 큰 CIDR만 매칭하도록 단순화할 수 있어요.중첩 클러스터를 신뢰한다면, 마찬가지로 모든 하위 클러스터에 단일
accept-nested-ip-pools필터를 재사용할 수도 있어요.
추가 리소스
더 알아보기 (Learn more)
BGP 피어링의 기본 개념이 아직 낯설다면 BGP 가이드 문서를 먼저 읽어보세요. 중첩 클러스터 수가 늘어날수록 IP 풀 설계가 관리 부담을 좌우하니, 처음부터 CIDR 할당 계획을 세워두는 게 좋아요.