BGP를 지원하는 플랫 모드 네트워크 모델 구현

이 문서에서는 경계 게이트웨이 프로토콜(BGP)을 지원하여 플랫 모드 네트워크 모델을 구현하는 방법을 설명합니다. BGP를 지원하는 네트워크 모델을 구현하면 BGP는 서로 다른 레이어 2 도메인의 포드가 서로 통신할 수 있도록 동적으로 보장합니다. BGP를 사용하는 플랫 모드 네트워킹을 동적 플랫 IP라고도 합니다

플랫 모드 네트워크 모델에 대한 자세한 내용은 플랫 모드 및 아일랜드 모드 네트워크 모델 비교를 참조하세요.

BGP를 사용하는 플랫 모드 네트워크를 구현하는 방법

새 클러스터를 만들 때 BGP를 사용하는 플랫 모드 네트워킹이 사용 설정됩니다. 기존 클러스터에 이 기능을 사용 설정할 수 없습니다. 이 기능을 사용 설정하면 일부 구성 설정을 변경할 수 있습니다.

BGP를 지원하는 플랫 모드 네트워크 모델에서 클러스터를 구현하려면 다음 안내를 따르세요.

  1. 클러스터 구성 파일을 수정합니다.

    • spec.clusterNetwork.advancedNetworking 필드를 true로 설정합니다.
    • IPv4에 플랫 모드 네트워킹을 사용 설정하려면 spec.clusterNetwork.flatIPv4 필드를 true로 설정합니다.

      또는 IPv6 전용 플랫 모드 네트워킹을 사용하여 클러스터를 구성하는 이중 스택 클러스터(IPv4 섬, IPv6 동적 플랫 IP)를 참조하세요.

    apiVersion: baremetal.cluster.gke.io/v1
    kind: Cluster
    metadata:
      name: bm
      namespace: cluster-bm
    spec:
      type: user
      ...
      clusterNetwork:
        advancedNetworking: true
        flatIPv4: true
      ...
    

    spec.clusterNetwork.flatIPv4true로 설정되면 spec.clusterNetwork.pods.cidrBlocks 필드는 무시되고 생략될 수 있습니다. 그러나 클러스터 구성 파일(노드별, 노드 풀별 또는 클러스터별)에 ClusterCIDRConfigs 매니페스트를 추가해야 합니다.

  2. NetworkGatewayGroup 매니페스트를 클러스터 구성 파일에 추가합니다.

    BGP 피어링에 사용할 부동 IP를 지정합니다. 리소스 이름이 default이고 네임스페이스가 클러스터 네임스페이스인지 확인합니다.

    ---
    apiVersion: networking.gke.io/v1
    kind: NetworkGatewayGroup
    metadata:
      name: default
      namespace: cluster-bm
    spec:
      floatingIPs:
      - 10.0.1.100
      - 10.0.2.100
    

    NetworkGatewayGroup 커스텀 리소스는 유동 IP 주소 하나 이상의 목록을 관리합니다. BGP 피어링 세션은 NetworkGatewayGroup 커스텀 리소스에 지정한 유동 IP 주소로부터 시작됩니다.

  3. FlatIPMode 매니페스트를 클러스터 구성 파일에 추가합니다.

    FlatIPMode 리소스 이름은 default이어야 하며 네임스페이스는 클러스터 네임스페이스입니다. peerSelectorflatip-peer: "true"는 BGPPeer 객체 bgppeer1bgppeer2(다음 단계에서 정의됨)의 라벨과 일치하므로 두 피어 모두 플랫 모드 네트워킹에 사용됩니다.

    다음 FlatIPMode 매니페스트는 BGP를 사용하는 IPv4 단일 스택, 플랫 모드 네트워킹을 위한 것입니다. 대체 구성은 구성 예시를 참조하세요.

    ---
    apiVersion: baremetal.cluster.gke.io/v1alpha1
    kind: FlatIPMode
    metadata:
      name: default
      namespace: cluster-bm
    spec:
      enableBGPIPv4: true
      enableBGPIPv6: false
      peerSelector:
        flatip-peer: "true"
    
  4. 클러스터 구성 파일에 BGPPeer 매니페스트를 하나 이상 추가합니다.

    리소스 이름을 선택합니다. 하지만 모든 BGPPeer 리소스는 클러스터 네임스페이스에 있어야 합니다.

    ---
    apiVersion: networking.gke.io/v1
    kind: BGPPeer
    metadata:
      name: bgppeer1
      namespace: cluster-bm
      labels:
        flatip-peer: "true"
    spec:
      localASN: 65001
      peerASN: 65000
      peerIP: 10.0.1.254
      sessions: 2
    ---
    apiVersion: networking.gke.io/v1
    kind: BGPPeer
    metadata:
      name: bgppeer2
      namespace: cluster-bm
      labels:
        flatip-peer: "true"
    spec:
      localASN: 65001
      peerASN: 65000
      peerIP: 10.0.2.254
      sessions: 2
    
  5. ClusterCIDRConfig 매니페스트를 클러스터 구성 파일에 추가합니다.

    CusterCIDRConfig 리소스도 클러스터 네임스페이스에 있어야 합니다.

    apiVersion: baremetal.cluster.gke.io/v1alpha1
    kind: ClusterCIDRConfig
    metadata:
      name: cluster-wide-1
      namespace: cluster-bm
    spec:
      ipv4:
        cidr: "192.168.0.0/16"
        perNodeMaskSize: 24
    

    ClusterCIDRConfig는 노드에 동적으로 할당할 포드 CIDR 범위를 지정하는 커스텀 리소스입니다. CNI는 노드에 할당된 포드 CIDR 범위를 사용하여 IP 주소를 노드에서 실행되는 개별 포드에 할당합니다. ClusterCIDRConfig이중 스택 네트워킹에도 사용됩니다. 사용 예시를 포함하여 ClusterCIDRConfig 커스텀 리소스에 대한 자세한 내용은 ClusterCIDRConfig 커스텀 리소스 이해를 참조하세요.

  6. 클러스터를 만듭니다.

    bmctl create cluster
    

    클러스터 만들기에 대한 자세한 내용은 클러스터 만들기 개요를 참조하세요.

    환경에서 멀티 프로토콜 BGP(MP-BGP)를 지원하면 IPv4 및 IPv6 경로를 통해 이러한 IPv4 세션을 공지할 수 있습니다. MP-BGP를 사용하는 예시를 포함한 다양한 구성의 예시는 구성 예시를 참조하세요.

BGP 기반 플랫 모드 네트워킹 구성 수정

BGP로 플랫 모드 네트워크 모델을 사용하도록 구성된 클러스터를 만든 후 일부 구성 설정을 업데이트할 수 있습니다. BGP 관련 리소스(NetworkGatewayGroup, FlatIPMode, BGPPeer)를 나중에 업데이트할 때 관리자 클러스터 kubeconfig 파일을 사용합니다. 그러면 관리자 클러스터에서 사용자 클러스터에 대한 변경사항을 조정합니다. 사용자 클러스터에서 이러한 리소스를 직접 수정하면 관리자 클러스터에서 후속 조정의 변경사항을 덮어씁니다.

구성 예시

다음 섹션에는 BGP를 사용하는 플랫 모드 네트워크 모델의 다양한 변형에 대한 클러스터 구성 예시가 포함되어 있습니다. 샘플 구성 파일이 완료되지 않았습니다. BGP를 사용하는 플랫 모드 네트워킹과 관련 없는 대부분의 클러스터 설정은 생략되었습니다.

단일 스택 IPv4 클러스터

다음 클러스터 구성 파일 샘플에서는 BGP로 플랫 모드 네트워킹을 사용하여 단일 스택 IPv4 클러스터를 구성하는 설정을 보여줍니다.

apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
  name: bm
  namespace: cluster-bm
spec:
  ...
  clusterNetwork:
    advancedNetworking: true
    flatIPv4: true
    services:
      cidrBlocks:
      - 10.96.0.0/12
  ...
---
apiVersion: baremetal.cluster.gke.io/v1alpha1
kind: ClusterCIDRConfig
metadata:
  name: cluster-wide-1
  namespace: cluster-bm          # Must match the cluster namespace
spec:
  ipv4:
    cidr: "222.2.0.0/16"
    perNodeMaskSize: 24
---
apiVersion: networking.gke.io/v1
kind: NetworkGatewayGroup
metadata:
  name: default
  namespace: cluster-bm           # Must match the cluster namespace
spec:
  floatingIPs:
  - 10.0.1.100
  - 10.0.3.100
---
apiVersion: baremetal.cluster.gke.io/v1alpha1
kind: FlatIPMode
metadata:
  name: default
  namespace: cluster-bm            # Must match the cluster namespace
spec:
  enableBGPIPv4: true
  enableBGPIPv6: false
  peerSelector:
    flatipmode-peer: "true"
---
apiVersion: networking.gke.io/v1
kind: BGPPeer
metadata:
  name: bgppeer1
  namespace: cluster-bm            # Must match the cluster namespace
  labels:
    flatipmode-peer: "true"
spec:
  localASN: 65001
  peerASN: 65002
  peerIP: 10.0.1.254
  sessions: 2
---
apiVersion: networking.gke.io/v1
kind: BGPPeer
metadata:
  name: bgppeer2
  namespace: cluster-bm            # Must match the cluster namespace
  labels:
    flatipmode-peer: "true"
spec:
  localASN: 65001
  peerASN: 65002
  peerIP: 10.0.3.254
  sessions: 2

이중 스택 클러스터(IPv4 섬, IPv6 동적 플랫 IP)

다음 클러스터 구성 파일 샘플에서는 IPv6에만 BGP를 사용하는 플랫 모드 네트워킹으로 이중 스택(IPv4/IPv6) 클러스터를 구성하는 설정을 보여줍니다.

apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
  name: bm
  namespace: cluster-bm
spec:
  ...
  clusterNetwork:
    advancedNetworking: true
    flatIPv4: false
    pods:
      cidrBlocks:
      - 192.168.0.0/16
    services:
      cidrBlocks:
      - 10.96.0.0/12
      # Additional IPv6 CIDR block determines if the cluster is dual-stack
      - 2620:0:1000:2630:5:2::/112
  ...
---
apiVersion: baremetal.cluster.gke.io/v1alpha1
kind: ClusterCIDRConfig
metadata:
  name: cluster-wide-1
  namespace: cluster-bm          # Must match the cluster namespace
spec:
  ipv4:
    cidr: "192.168.0.0/16"
    perNodeMaskSize: 24
  ipv6:
    cidr: "2222:3::/112"
    perNodeMaskSize: 120
---
apiVersion: networking.gke.io/v1
kind: NetworkGatewayGroup
metadata:
  name: default
  namespace: cluster-bm           # Must match the cluster namespace
spec:
  floatingIPs:
  - 10.0.1.100
  - 10.0.3.100
---
apiVersion: baremetal.cluster.gke.io/v1alpha1
kind: FlatIPMode
metadata:
  name: default
  namespace: cluster-bm            # Must match the cluster namespace
spec:
  enableBGPIPv4: false
  enableBGPIPv6: true
  peerSelector:
    flatipmode-peer: "true"
---
apiVersion: networking.gke.io/v1
kind: BGPPeer
metadata:
  name: bgppeer1
  namespace: cluster-bm            # Must match the cluster namespace
  labels:
    flatipmode-peer: "true"
spec:
  localASN: 65001
  peerASN: 65002
  peerIP: 10.0.1.254
  sessions: 2
---
apiVersion: networking.gke.io/v1
kind: BGPPeer
metadata:
  name: bgppeer2
  namespace: cluster-bm            # Must match the cluster namespace
  labels:
    flatipmode-peer: "true"
spec:
  localASN: 65001
  peerASN: 65002
  peerIP: 10.0.3.254
  sessions: 2

이중 스택 클러스터(IPv4 동적 플랫 IP, IPv6 동적 플랫 IP)

다음 클러스터 구성 파일 샘플에서는 BGP로 플랫 모드 네트워킹을 사용하여 이중 스택 클러스터를 구성하는 설정을 보여줍니다.

apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
  name: bm
  namespace: cluster-bm
spec:
  ...
  clusterNetwork:
    advancedNetworking: true
    flatIPv4: true
    pods:
      cidrBlocks:
      - 192.168.0.0/16
    services:
      cidrBlocks:
      - 10.96.0.0/12
      # Additional IPv6 CIDR block determines if the cluster is dual-stack
      - 2620:0:1000:2630:5:2::/112
  ...
---
apiVersion: baremetal.cluster.gke.io/v1alpha1
kind: ClusterCIDRConfig
metadata:
  name: cluster-wide-1
  namespace: cluster-bm          # Must match the cluster namespace
spec:
  ipv4:
    cidr: "222.2.0.0/16"
    perNodeMaskSize: 24
  ipv6:
    cidr: "2222:3::/112"
    perNodeMaskSize: 120
---
apiVersion: networking.gke.io/v1
kind: NetworkGatewayGroup
metadata:
  name: default
  namespace: cluster-bm           # Must match the cluster namespace
spec:
  floatingIPs:
  - 10.0.1.100
  - 10.0.3.100
---
apiVersion: baremetal.cluster.gke.io/v1alpha1
kind: FlatIPMode
metadata:
  name: default
  namespace: cluster-bm            # Must match the cluster namespace
spec:
  enableBGPIPv4: true
  enableBGPIPv6: true
  peerSelector:
    flatipmode-peer: "true"
---
apiVersion: networking.gke.io/v1
kind: BGPPeer
metadata:
  name: bgppeer1
  namespace: cluster-bm            # Must match the cluster namespace
  labels:
    flatipmode-peer: "true"
spec:
  localASN: 65001
  peerASN: 65002
  peerIP: 10.0.1.254
  sessions: 2
---
apiVersion: networking.gke.io/v1
kind: BGPPeer
metadata:
  name: bgppeer2
  namespace: cluster-bm            # Must match the cluster namespace
  labels:
    flatipmode-peer: "true"
spec:
  localASN: 65001
  peerASN: 65002
  peerIP: 10.0.3.254
  sessions: 2

문제 해결

BGP를 사용하는 플랫 모드 네트워킹과 관련된 문제를 해결할 수 있도록 이 섹션에는 구성 확인을 위한 안내가 포함되어 있습니다.

  1. FlatIPModes 객체가 관리자 클러스터의 클러스터 네임스페이스에 생성되었는지 확인합니다.

    kubectl get flatipmodes -A --kubeconfig ADMIN_KUBECONFIG
    

    다음과 유사한 응답이 표시되어야 합니다.

    NAMESPACE                 NAME      AGE
    cluster-bm                default   2d17h
    
  2. flatipmodes.networking.gke.io 객체가 사용자 클러스터에 생성되었는지 확인합니다.

    flatipmodes.networking.gke.io 객체의 클러스터 범위는 다음과 같습니다.

    kubectl get flatipmodes.networking.gke.io --kubeconfig USER_KUBECONFIG
    

    다음과 유사한 응답이 표시되어야 합니다.

    NAME      AGE
    default   2d17h
    
  3. BGPSessions 리소스를 가져와서 현재 세션을 봅니다.

    kubectl get bgpsessions -A --kubeconfig USER_KUBECONFIG
    

    다음과 유사한 응답이 표시되어야 합니다.

    NAMESPACE     NAME                LOCAL ASN   PEER ASN   LOCAL IP       PEER IP        STATE            LAST REPORT
    kube-system   10.0.1.254-node-01  65500       65000      10.0.1.100     10.0.1.254     Established      2s
    kube-system   10.0.1.254-node-02  65500       65000      10.0.3.100     10.0.1.254     NotEstablished   2s
    kube-system   10.0.3.254-node-01  65500       65000      10.0.1.100     10.0.3.254     NotEstablished   2s
    kube-system   10.0.3.254-node-02  65500       65000      10.0.3.100     10.0.3.254     Established      2s
    
  4. BGPAdvertisedRoute 리소스를 가져와서 현재 공지 중인 경로를 확인합니다.

    kubectl get bgpadvertisedroutes -A --kubeconfig USER_KUBECONFIG
    

    응답은 다음과 같이 표시되어야 합니다.

    NAMESPACE     NAME                     PREFIX         METRIC
    kube-system   route-via-222-22-208-240   222.2.0.0/24
    kube-system   route-via-222-22-209-240   222.2.1.0/24
    

    경로 이름은 다음 홉을 나타냅니다. 예를 들어 앞의 응답 예시에서 route-via-222-22-208-240은 공지된 프리픽스 222.2.0.0/24의 다음 홉이 222.22.208.240임을 나타냅니다.