实现支持 BGP 的平面模式网络模型

本文档介绍如何实现支持边界网关协议 (BGP) 的平面模式网络模型。在实现支持 BGP 的网络模型时,BGP 会动态确保不同第 2 层网域中的 Pod 可以相互通信。支持 BGP 的平面模式网络有时称为动态平面 IP。

如需详细了解平面模式网络模型,请参阅平面模式与孤岛模式网络模型

如何实现使用 BGP 的平面模式网络

当您创建新集群时,系统会启用支持 BGP 的平面模式网络。您无法为现有集群启用此功能。此功能启用后,您可以更改某些配置设置。

如需在支持 BGP 的平面模式网络上实现集群,请执行以下操作:

  1. 修改集群配置文件:

    • spec.clusterNetwork.advancedNetworking 字段设置为 true
    • 如果要为 IPv4 启用平面模式网络,请将 spec.clusterNetwork.flatIPv4 字段设置为 true

      另请参阅双栈集群(IPv4 孤岛模式、IPv6 动态平面 IP),使用仅 IPv6 平面模式网络配置集群。

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

    spec.clusterNetwork.flatIPv4 设置为 true 时,字段 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 是自定义资源,它指定要动态分配给节点的 Pod CIDR 范围。CNI 使用在节点上分配的 Pod CIDR 范围来为节点上运行的各个 Pod 分配 IP 地址。ClusterCIDRConfig 也用于双栈网络。如需详细了解 ClusterCIDRConfig 自定义资源(包括使用示例),请参阅了解 ClusterCIDRConfig 自定义资源

  6. 创建集群:

    bmctl create cluster
    

    如需详细了解如何创建集群,请参阅集群创建概览

    如果您的环境支持多协议 BGP (MP-BGP),则可以通过这些 IPv4 会话通告 IPv4 和 IPv6 路由。如需查看不同配置的示例(包括使用 MP-BGP 的示例),请参阅配置示例

修改基于 BGP 的平面模式网络配置

在创建集群并配置为使用支持 BGP 的平面模式网络模型后,您可以更新某些配置设置。当您对 BGP 相关资源(NetworkGatewayGroupFlatIPModeBGPPeer)进行后续更新时,请使用管理员集群 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)

以下集群配置文件示例展示了使用支持 BGP 的仅 IPv6 平面模式网络配置双栈 (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