Implementa un modelo de red de modo plano con compatibilidad con BGP

En este documento, se describe cómo implementar un modelo de red de modo plano compatible con el Protocolo de puerta de enlace fronteriza (BGP). Cuando implementas un modelo de red compatible con BGP, BGP garantiza de forma dinámica que los Pods en diferentes dominios de capa 2 puedan comunicarse entre sí. Las herramientas de redes de modo plano con BGP a veces se denominan IP plana dinámica.

Para obtener más información sobre los modelos de red de modo plano, consulta modelos de red de modo plano frente a modo isla.

Cómo implementar una red de modo plano que usa BGP

Las herramientas de redes de modo plano con BGP se habilitan cuando creas un clúster nuevo. No puedes habilitar esta función en un clúster existente. Una vez que se habilita esta función, puedes realizar cambios en algunos de los parámetros de configuración.

Para implementar un clúster en un modelo de red de modo plano compatible con BGP, haz lo siguiente:

  1. Edita el archivo de configuración del clúster:

    • Configura el campo spec.clusterNetwork.advancedNetworking como true.
    • Si deseas habilitar las herramientas de redes de modo plano para IPv4, establece el campo spec.clusterNetwork.flatIPv4 en true.

      Como alternativa, consulta Clúster de doble pila (isla IPv4, IP plana dinámica IPv6), que configura tu clúster con redes de modo plano solo para IPv6.

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

    Cuando spec.clusterNetwork.flatIPv4 se configura como true, el campo spec.clusterNetwork.pods.cidrBlocks se ignora y se puede omitir. Sin embargo, debes agregar un manifiesto ClusterCIDRConfigs en el archivo de configuración del clúster (por nodo, por grupo de nodos o por clúster).

  2. Agrega un manifiesto NetworkGatewayGroup al archivo de configuración del clúster:

    Especifica las IP flotantes que se usarán para el intercambio de tráfico de BGP. Asegúrate de que el nombre del recurso sea default y que el espacio de nombres sea el del clúster.

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

    El recurso personalizado NetworkGatewayGroup administra una lista de una o más direcciones IP flotantes. Las sesiones de intercambio de tráfico de BGP se inician desde direcciones IP flotantes que especificas en el recurso personalizado NetworkGatewayGroup.

  3. Agrega un manifiesto FlatIPMode al archivo de configuración del clúster:

    El nombre del recurso FlatIPMode debe ser default, y el espacio de nombres debe ser el espacio de nombres del clúster. El valor flatip-peer: "true" de peerSelector coincide con las etiquetas de los objetos de BGPPeer bgppeer1 y bgppeer2 (definidos en el siguiente paso), por lo que ambos pares se usan para las redes de modo plano.

    El siguiente manifiesto de FlatIPMode es para redes IPv4 de pila única y modo plano con BGP. Para obtener configuraciones alternativas, consulta Ejemplos de configuración.

    ---
    apiVersion: baremetal.cluster.gke.io/v1alpha1
    kind: FlatIPMode
    metadata:
      name: default
      namespace: cluster-bm
    spec:
      enableBGPIPv4: true
      enableBGPIPv6: false
      peerSelector:
        flatip-peer: "true"
    
  4. Agrega uno o más manifiestos BGPPeer al archivo de configuración del clúster:

    Puedes elegir los nombres de los recursos, pero todos los recursos BGPPeer deben estar en el espacio de nombres del clúster.

    ---
    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. Agrega un manifiesto ClusterCIDRConfig al archivo de configuración del clúster:

    El recurso CusterCIDRConfig también debe estar en el espacio de nombres del clúster.

    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 es un recurso personalizado que especifica los rangos de CIDR del Pod que se asignarán a los nodos de forma dinámica. La CNI usa los rangos de CIDR del Pod asignados en un nodo para asignar direcciones IP a los Pods individuales que se ejecutan en él. ClusterCIDRConfig también se usa para las herramientas de redes de pila doble. Para obtener más información sobre el recurso personalizado ClusterCIDRConfig, incluidos ejemplos de uso, consulta Información sobre el recurso personalizado ClusterCIDRConfig.

  6. Crea el clúster:

    bmctl create cluster
    

    Para obtener más información sobre cómo crear clústeres, consulta Descripción general de la creación de clústeres.

    Si tu entorno admite BGP de varios protocolos (MP-BGP), las rutas IPv4 e IPv6 se pueden anunciar a través de estas sesiones IPv4. Para ver ejemplos de diferentes configuraciones, incluidos ejemplos que usan MP-BGP, consulta Ejemplos de configuración.

Modifica la configuración de herramientas de redes de modo plano basada en BGP

Después de crear tu clúster configurado para usar un modelo de red de modo plano con BGP, se pueden actualizar algunos parámetros de configuración. Usa el archivo kubeconfig del clúster de administrador cuando realices actualizaciones posteriores en los recursos relacionados con BGP (NetworkGatewayGroup, FlatIPMode y BGPPeer). Luego, el clúster de administrador concilia los cambios en el clúster de usuario. Si editas estos recursos directamente en el clúster de usuario, el clúster de administrador reemplaza los cambios en las conciliaciones posteriores.

Configuración de ejemplo

En las siguientes secciones, se incluyen ejemplos de configuración de clústeres para distintas variantes del modelo de red de modo plano con BGP. Los archivos de configuración de muestra no están completos. Se omitió la mayoría de los parámetros de configuración del clúster que no son relevantes para las herramientas de redes de modo plano con BGP.

Clúster IPv4 de una sola pila

En el siguiente ejemplo de archivo de configuración de clúster, se muestra la configuración para configurar un clúster IPv4 de una sola pila con herramientas de redes de modo plano con BGP:

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

Clúster de doble pila (isla IPv4, IP plana dinámica IPv6)

En el siguiente ejemplo de archivo de configuración del clúster, se muestra la configuración para configurar un clúster de pila doble (IPv4/IPv6) con herramientas de redes de modo plano con BGP solo para 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

Clúster de pila doble (IP plana dinámica IPv4, IP plana dinámica IPv6)

En el siguiente ejemplo de archivo de configuración del clúster, se muestra la configuración para configurar un clúster de doble pila con herramientas de redes de modo plano con 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

Soluciona problemas

A fin de ayudarte a solucionar problemas relacionados con las herramientas de redes de modo plano con BGP, en esta sección se incluyen instrucciones para verificar la configuración:

  1. Verifica si se crea un objeto FlatIPModes en el espacio de nombres del clúster del clúster de administrador:

    kubectl get flatipmodes -A --kubeconfig ADMIN_KUBECONFIG
    

    La respuesta debería ser similar a la siguiente:

    NAMESPACE                 NAME      AGE
    cluster-bm                default   2d17h
    
  2. Verifica si se crea un objeto flatipmodes.networking.gke.io en el clúster de usuario:

    El objeto flatipmodes.networking.gke.io tiene permiso de clúster.

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

    La respuesta debería ser similar a la siguiente:

    NAME      AGE
    default   2d17h
    
  3. Obtén los recursos BGPSessions para ver las sesiones actuales:

    kubectl get bgpsessions -A --kubeconfig USER_KUBECONFIG
    

    La respuesta debería ser similar a la siguiente:

    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. Obtén los recursos BGPAdvertisedRoute para ver las rutas que se anuncian en este momento:

    kubectl get bgpadvertisedroutes -A --kubeconfig USER_KUBECONFIG
    

    La respuesta debería ser similar a la siguiente:

    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
    

    Los nombres de las rutas indican el próximo salto. Por ejemplo, route-via-222-22-208-240 de la respuesta de ejemplo anterior indica que el siguiente salto para el prefijo anunciado 222.2.0.0/24 es 222.22.208.240.