Implemente o modelo de rede de modo simples com suporte de BGP

Este documento descreve como implementar um modelo de rede de modo simples com suporte do protocolo de gateway de fronteira (BGP). Quando implementa um modelo de rede com suporte de BGP, o BGP garante dinamicamente que os pods em diferentes domínios da camada 2 podem comunicar entre si. A rede de modo simples com BGP é, por vezes, denominada IP simples dinâmico.

Para mais informações sobre os modelos de rede de modo simples, consulte o artigo Modelos de rede de modo simples vs. modo isolado.

Como implementar uma rede de modo simples que usa BGP

A rede no modo simples com BGP é ativada quando cria um novo cluster. Não pode ativar esta funcionalidade para um cluster existente. Depois de ativar esta funcionalidade, pode fazer alterações a algumas das definições de configuração.

Para implementar um cluster num modelo de rede de modo simples com suporte de BGP:

  1. Edite o ficheiro de configuração do cluster:

    • Defina o campo spec.clusterNetwork.advancedNetworking como true.
    • Se quiser ativar a rede no modo simples para IPv4, defina o campo spec.clusterNetwork.flatIPv4 como true.

      Para uma alternativa, consulte o cluster de pilha dupla (IPv4 Island, IPv6 Dynamic Flat IP), que configura o cluster com rede de modo simples apenas para IPv6.

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

    Quando spec.clusterNetwork.flatIPv4 está definido como true, o campo spec.clusterNetwork.pods.cidrBlocks é ignorado e pode ser omitido. No entanto, tem de adicionar um manifesto ClusterCIDRConfigs no ficheiro de configuração do cluster (por nó, por conjunto de nós e/ou por cluster).

  2. Anexe um manifesto NetworkGatewayGroup ao ficheiro de configuração do cluster:

    Especifique os IPs flutuantes a usar para a interligação BGP. Certifique-se de que o nome do recurso é default e que o espaço de nomes é o espaço de nomes do cluster.

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

    O recurso personalizado NetworkGatewayGroup gere uma lista de um ou mais endereços IP flutuantes. As sessões de peering BGP são iniciadas a partir de endereços IP flutuantes que especifica no recurso personalizado NetworkGatewayGroup.

  3. Anexe um manifesto FlatIPMode ao ficheiro de configuração do cluster:

    O nome do recurso FlatIPMode tem de ser default e o espaço de nomes é o espaço de nomes do cluster. O valor peerSelector corresponde às etiquetas nos objetos BGPPeer bgppeer1 e bgppeer2 (definidos no passo seguinte), pelo que ambos os pares são usados para a rede no modo simples.flatip-peer: "true"

    O seguinte manifesto FlatIPMode destina-se a redes de modo simples de pilha única IPv4 com BGP. Para configurações alternativas, consulte os exemplos de configuração.

    ---
    apiVersion: baremetal.cluster.gke.io/v1alpha1
    kind: FlatIPMode
    metadata:
      name: default
      namespace: cluster-bm
    spec:
      enableBGPIPv4: true
      enableBGPIPv6: false
      peerSelector:
        flatip-peer: "true"
    
  4. Anexe um ou mais manifestos BGPPeer ao ficheiro de configuração do cluster:

    Escolhe os nomes dos recursos, mas todos os recursos BGPPeer têm de estar no espaço de nomes do cluster.

    ---
    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. Anexe um manifesto ClusterCIDRConfig ao ficheiro de configuração do cluster:

    O recurso CusterCIDRConfig também tem de estar no espaço de nomes do cluster.

    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 é um recurso personalizado que especifica intervalos CIDR de pods a serem atribuídos dinamicamente aos nós. O CNI usa os intervalos CIDR de pods atribuídos num nó para atribuir endereços IP aos pods individuais em execução no nó. O ClusterCIDRConfig também é usado para redes de pilha dupla. Para mais informações sobre o recurso personalizado ClusterCIDRConfig, incluindo exemplos de utilização, consulte Compreenda o recurso personalizado ClusterCIDRConfig.

  6. Crie o cluster:

    bmctl create cluster
    

    Para mais informações sobre a criação de clusters, consulte o artigo Vista geral da criação de clusters.

    Se o seu ambiente suportar BGP multiprotocolo (MP-BGP), as rotas IPv4 e IPv6 podem ser anunciadas através destas sessões IPv4. Para ver exemplos de diferentes configurações, incluindo exemplos que usam MP-BGP, consulte os exemplos de configuração.

Modifique a configuração de rede de modo simples baseada em BGP

Depois de criar o cluster configurado para usar um modelo de rede de modo simples com BGP, é possível atualizar algumas definições de configuração. Use o ficheiro kubeconfig do cluster de administrador quando fizer atualizações subsequentes aos recursos relacionados com o BGP (NetworkGatewayGroup, FlatIPMode e BGPPeer). Em seguida, o cluster de administrador reconcilia as alterações ao cluster de utilizador. Se editar estes recursos diretamente no cluster de utilizadores, o cluster de administrador substitui as suas alterações nas reconciliações subsequentes.

Exemplos de configurações

As secções seguintes incluem exemplos de configuração de clusters para diferentes variações do modelo de rede de modo simples com BGP. Os ficheiros de configuração de exemplo não estão completos. A maioria das definições de clusters que não são relevantes para a rede no modo simples com BGP foram omitidas.

Cluster IPv4 de pilha única

O exemplo de ficheiro de configuração do cluster seguinte mostra as definições para configurar um cluster IPv4 de pilha única com rede de modo simples com 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

Cluster de pilha dupla (IPv4 Island, IPv6 Dynamic Flat IP)

O exemplo de ficheiro de configuração do cluster seguinte mostra as definições para configurar um cluster de pilha dupla (IPv4/IPv6) com rede de modo simples com BGP apenas 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

Cluster de pilha dupla (IP dinâmico simples IPv4, IP dinâmico simples IPv6)

O exemplo de ficheiro de configuração do cluster seguinte mostra as definições para configurar um cluster de pilha dupla com rede de modo simples com 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

Resolução de problemas

Para ajudar a resolver problemas relacionados com a rede no modo simples com BGP, esta secção inclui instruções para verificar a sua configuração:

  1. Verifique se um objeto FlatIPModes foi criado no espaço de nomes do cluster no cluster de administrador:

    kubectl get flatipmodes -A --kubeconfig ADMIN_KUBECONFIG
    

    A resposta deve ter um aspeto semelhante a este:

    NAMESPACE                 NAME      AGE
    cluster-bm                default   2d17h
    
  2. Verifique se um objeto flatipmodes.networking.gke.io é criado no cluster do utilizador:

    O objeto flatipmodes.networking.gke.io tem âmbito de cluster.

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

    A resposta deve ter um aspeto semelhante a este:

    NAME      AGE
    default   2d17h
    
  3. Obtenha os recursos BGPSessions para ver as sessões atuais:

    kubectl get bgpsessions -A --kubeconfig USER_KUBECONFIG
    

    A resposta deve ter um aspeto semelhante a este:

    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. Obtenha os recursos BGPAdvertisedRoute para ver as rotas atualmente anunciadas:

    kubectl get bgpadvertisedroutes -A --kubeconfig USER_KUBECONFIG
    

    A resposta deve ter um aspeto semelhante ao seguinte:

    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   
    

    Os nomes das rotas indicam o salto seguinte. Por exemplo, route-via-222-22-208-240 da resposta do exemplo anterior indica que o salto seguinte para o prefixo anunciado 222.2.0.0/24 é 222.22.208.240.