Habilita puertas de enlace de varios clústeres


En esta página se muestra cómo habilitar el controlador de puerta de enlace de GKE, un controlador alojado en Google que aprovisiona balanceadores de cargas internos y externos para tus clústeres de GKE. Si deseas obtener información para usar los recursos de la puerta de enlace y para el balanceo de cargas de contenedores, consulta Implementa puertas de enlace o Implementa puertas de enlace de varios clústeres.

El controlador de puerta de enlace de GKE de varios clústeres instala las siguientes GatewayClasses de varios clústeres en tus clústeres:

  • gke-l7-global-external-managed-mc para puertas de enlace de varios clústeres externas globales
  • gke-l7-regional-external-managed-mc para puertas de enlace de varios clústeres externas regionales
  • gke-l7-rilb-mc para puertas de enlace de varios clústeres internas regionales
  • gke-l7-gxlb-mc para puertas de enlace de varios clústeres externas globales

Obtén más información sobre las capacidades de las diversas GatewayClasses en GKE.

Precios

Todos los recursos de Compute Engine implementados a través del controlador de la puerta de enlace se cobran en el proyecto en el que residen tus clústeres de GKE. El controlador de Gateway de un solo clúster se ofrece sin cargo adicional como parte de los precios de GKE Standard y Autopilot. Los precios de las puertas de enlace de varios clústeres se describen en la página de precios de Ingress y puerta de enlace de varios clústeres.

Antes de comenzar

Antes de comenzar, asegúrate de haber realizado las siguientes tareas:

  • Habilita la API de Kubernetes Engine de Google.
  • Habilitar la API de Kubernetes Engine de Google
  • Si deseas usar Google Cloud CLI para esta tarea, instala y, luego, inicializa gcloud CLI. Si ya instalaste gcloud CLI, ejecuta gcloud components update para obtener la versión más reciente.

Requisitos del controlador de la puerta de enlace de GKE

  • Para Standard, la versión 1.24 de GKE o una posterior.
  • Para Autopilot, versión 1.26 de GKE o posterior.
  • Versión 407.0.0 o posterior de Google Cloud CLI.
  • La API de la puerta de enlace solo es compatible con clústeres nativos de VPC.
  • Si usas las GatewayClasses internas, debes habilitar una subred de solo proxy.
  • El clúster debe tener el complemento HttpLoadBalancing habilitado.
  • Si usas Istio, debes actualizarlo a una de las siguientes versiones:
    • 1.15.2 o una versión posterior
    • 1.14.5 o una versión posterior
    • 1.13.9 o una versión posterior.
  • Si usas una VPC compartida, en el proyecto host, debes asignar el rol Compute Network User a la cuenta de servicio de GKE para el proyecto de servicio.

Requisitos de las puertas de enlace de varios clústeres

Además de los requisitos del controlador de la puerta de enlace de GKE, para las implementaciones de puertas de enlace de varios clústeres, asegúrate de haber realizado las siguientes tareas:

  • Habilita la API de la puerta de enlace en tu clúster de configuración.
  • Habilita la federación de identidades para cargas de trabajo para GKE en tus clústeres.
  • Completa los requisitos generales de la flota para registrar tus clústeres.
  • Habilita las siguientes API de puerta de enlace de varios clústeres requeridas en tu proyecto:

    • API de Traffic Director
    • API de Service de varios clústeres
    • API de Ingress de varios clústeres

    Ejecuta este comando para habilitar las API requeridas si aún no están habilitadas:

    gcloud services enable \
      trafficdirector.googleapis.com \
      multiclusterservicediscovery.googleapis.com \
      multiclusteringress.googleapis.com \
      --project=PROJECT_ID
    

    Reemplaza PROJECT_ID por el ID del proyecto en el que se ejecutan los clústeres de GKE.

Restricciones y limitaciones

Las mismas limitaciones y problemas conocidos para las puerta de enlaces de un solo clúster también se aplican a las puerta de enlaces de varios clústeres.

Además de las limitaciones de la puerta de enlace de un solo clúster, las siguientes limitaciones se aplican a las puertas de enlace de varios clústeres:

  • El balanceo de cargas en backends en diferentes regiones no es compatible con la puerta de enlaceClass gke-l7-rilb-mc regional. Para obtener más información sobre las diferentes funciones que admite cada GatewayClass, consulta Capacidades de GatewayClass.

  • Un Service no es compatible como backendRefs con una puerta de enlace de varios clústeres. La puerta de enlace de varios clústeres solo admite ServiceImport como backendRefs válido.

  • No se admite el balanceo de cargas entre proyectos. Todos los clústeres (clúster de configuración y clústeres de destino) conectados a la misma puerta de enlace de varios clústeres deben implementarse en el mismo proyecto host de VPC compartida o en el proyecto de servicio. Para obtener más información sobre las topologías de VPC compartida compatibles con puerta de enlace de varios clústeres, consulta Usa la puerta de enlace de varios clústeres con VPC compartida.

  • La puerta de enlace de varios clústeres depende de MCS para controlar el descubrimiento de servicios entre clústeres. Por lo tanto, los servicios que expone la puerta de enlace de varios clústeres están sujetos a todos los requisitos del servicio de varios clústeres.

Cuotas

GKE puerta de enlace usa cuotas de Cloud Load Balancing para limitar la cantidad de recursos que el controlador de puerta de enlace puede crear a fin de administrar el tráfico de entrada enrutado a los clústeres de GKE.

Configura el entorno para las puertas de enlace de varios clústeres

Se requiere que varios clústeres de GKE completen los ejemplos en Implementa puertas de enlace de varios clústeres. Todos los clústeres están registrados en la misma flota para que los Services y las puertas de enlace de varios clústeres puedan operar en ellos.

Con los siguientes pasos, se implementarán tres clústeres de GKE en dos regiones diferentes de tu proyecto:

  • us-west1-a/gke-west-1
  • us-west1-a/gke-west-2
  • us-east1-b/gke-east-1

Esto creará la siguiente topología de clúster:

La topología del clúster que muestra la relación entre las regiones, la flota y el proyecto.

Estos clústeres de GKE se usan para demostrar el balanceo de cargas multirregional y la división del tráfico de varios clústeres azul-verde mediante puertas de enlace internas y externas.

Implementa clústeres

En estos pasos, implementarás tres clústeres de GKE en las regiones us-east1 y us-west1.

  1. Crea un clúster de GKE en us-west1 llamado gke-west-1:

    gcloud container clusters create gke-west-1 \
        --gateway-api=standard \
        --zone=us-west1-a \
        --workload-pool=PROJECT_ID.svc.id.goog \
        --cluster-version=VERSION \
        --project=PROJECT_ID
    

    Reemplaza lo siguiente:

    • PROJECT_ID: el ID del proyecto en el que se ejecutan los clústeres de GKE.
    • VERSION: la versión de GKE, 1.24 o posterior.
  2. Crea otro clúster de GKE en us-west1 (o la misma región que el clúster anterior) llamado gke-west-2:

    gcloud container clusters create gke-west-2 \
        --gateway-api=standard \
        --zone=us-west1-a \
        --workload-pool=PROJECT_ID.svc.id.goog \
        --cluster-version=VERSION \
        --project=PROJECT_ID
    
  3. Crea un clúster de GKE en us-east1 (o una región diferente de la anterior) llamada gke-east-1.

    gcloud container clusters create gke-east-1 \
        --gateway-api=standard \
        --zone=us-east1-b \
        --workload-pool=PROJECT_ID.svc.id.goog \
        --cluster-version=VERSION \
        --project=PROJECT_ID
    

Configura las credenciales del clúster

En este paso, se configuran las credenciales del clúster con nombres fáciles de recordar. Esto facilita el cambio entre clústeres cuando se implementan recursos en varios clústeres.

  1. Recupera las credenciales para el clúster gke-west-1, gke-west-2 y gke-east-1:

    gcloud container clusters get-credentials gke-west-1 --zone=us-west1-a --project=PROJECT_ID
    gcloud container clusters get-credentials gke-west-2 --zone=us-west1-a --project=PROJECT_ID
    gcloud container clusters get-credentials gke-east-1 --zone=us-east1-b --project=PROJECT_ID
    

    Esto almacena las credenciales de forma local para que puedas usar tu cliente kubectl a fin de acceder a los servidores de la API del clúster. De forma predeterminada, se crea un nombre generado automáticamente para la credencial.

  2. Cambia el nombre de los contextos del clúster para que sea más fácil referirse a ellos más adelante:

    kubectl config rename-context gke_PROJECT_ID_us-west1-a_gke-west-1 gke-west-1
    kubectl config rename-context gke_PROJECT_ID_us-west1-a_gke-west-2 gke-west-2
    kubectl config rename-context gke_PROJECT_ID_us-east1-b_gke-east-1 gke-east-1
    

    Reemplaza PROJECT_ID por el ID del proyecto en el que se implementan tus clústeres.

Registra clústeres en la flota

  1. Una vez que los tres clústeres se hayan creado correctamente, deberás registrar estos clústeres en la flota de tu proyecto. Agrupar tus clústeres de GKE en una flota les permite ser el destino de una puerta de enlace de varios clústeres.

    gcloud container fleet memberships register gke-west-1 \
         --gke-cluster us-west1-a/gke-west-1 \
         --enable-workload-identity \
         --project=PROJECT_ID
    
    gcloud container fleet memberships register gke-west-2 \
         --gke-cluster us-west1-a/gke-west-2 \
         --enable-workload-identity \
         --project=PROJECT_ID
    
    gcloud container fleet memberships register gke-east-1 \
         --gke-cluster us-east1-b/gke-east-1 \
         --enable-workload-identity \
         --project=PROJECT_ID
    
  2. Confirma que los clústeres se hayan registrado de forma correcta en la flota:

    gcloud container fleet memberships list --project=PROJECT_ID
    

    El resultado será similar al siguiente ejemplo:

    NAME        EXTERNAL_ID                           LOCATION
    gke-east-1  45a80b37-4b00-49aa-a68b-b430fce1e3f0  us-east1
    gke-west-2  ac7087a5-f5ee-401e-b430-57f3af141239  us-west1
    gke-west-1  549efe3a-b18e-4eb9-8796-e50b7967cde2  us-west1
    

Habilita services de varios clústeres en la flota

  1. Habilita los servicios de varios clústeres en tu flota para los clústeres registrados. Esto habilita el controlador MCS para los tres clústeres que están registrados en tu flota para poder comenzar a escuchar y exportar los Services.

    gcloud container fleet multi-cluster-services enable \
        --project PROJECT_ID
    
  2. Otorga los permisos de Identity and Access Management (IAM) que requiere el controlador de puerta de enlace:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member "serviceAccount:PROJECT_ID.svc.id.goog[gke-mcs/gke-mcs-importer]" \
        --role "roles/compute.networkViewer" \
        --project=PROJECT_ID
    

    Reemplaza PROJECT_ID por el ID del proyecto en el que se implementan tus clústeres.

  3. Confirma que MCS esté habilitado para los clústeres registrados. Verás las membresías de los tres clústeres registrados. Es posible que todos los clústeres tarden varios minutos en aparecer.

    gcloud container fleet multi-cluster-services describe --project=PROJECT_ID
    

    El resultado es similar a este:

    createTime: '2023-10-12T06:14:33.466903587Z'
    membershipStates:
      projects/441323991697/locations/us-east1/memberships/gke-east-1:
        state:
          code: OK
          description: Firewall successfully updated
          updateTime: '2023-10-12T06:15:28.395318091Z'
      projects/441323991697/locations/us-west1/memberships/gke-west-1:
        state:
          code: OK
          description: Firewall successfully updated
          updateTime: '2023-10-12T06:15:30.534594027Z'
      projects/441323991697/locations/us-west1/memberships/gke-west-2:
        state:
          code: OK
          description: Firewall successfully updated
          updateTime: '2023-10-12T06:15:29.110582109Z'
    name: projects/pierre-louis-playground/locations/global/features/multiclusterservicediscovery
    resourceState:
      state: ACTIVE
    spec: {}
    updateTime: '2023-10-12T06:15:31.027276757Z'
    

Habilita puertas de enlace de varios clústeres en la flota

El controlador de puerta de enlace de GKE de varios clústeres rige la implementación de las puertas de enlace de varios clústeres.

Cuando habilitas el controlador de puerta de enlace de varios clústeres, debes seleccionar tu clúster de configuración. El clúster de configuración es el clúster de GKE en el que se encuentran los recursos de puerta de enlace (Puerta de enlace, Rutas, Políticas). implementados. Es un lugar central que controla el enrutamiento entre clústeres. Consulta Diseño del clúster de configuración para ayudarte a decidir qué clúster elegir como clúster de configuración.

  1. Habilita la puerta de enlace de varios clústeres y especifica el clúster de configuración en tu flota. Ten en cuenta que puedes actualizar el clúster de configuración cuando quieras más adelante. En este ejemplo se especifica gke-west-1 como el clúster de configuración que alojará los recursos de las puertas de enlace de varios clústeres.

    gcloud container fleet ingress enable \
        --config-membership=projects/PROJECT_ID/locations/us-west1-a/memberships/gke-west-1 \
        --project=PROJECT_ID
    
  2. Otorga los permisos de Identity and Access Management (IAM) que requiere el controlador de puerta de enlace de varios clústeres:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member "serviceAccount:service-PROJECT_NUMBER@gcp-sa-multiclusteringress.iam.gserviceaccount.com" \
        --role "roles/container.admin" \
        --project=PROJECT_ID
    

    Reemplaza PROJECT_ID y PROJECT_NUMBER por el ID y el número de proyecto en los que se implementan tus clústeres.

  3. Confirma que GKE Gateway Controller esté habilitado para tu flota:

    gcloud container fleet ingress describe --project=PROJECT_ID
    

    El resultado es similar a este:

    createTime: '2023-10-12T06:23:06.732858524Z'
    membershipStates:
      projects/441323991697/locations/us-east1/memberships/gke-east-1:
        state:
          code: OK
          updateTime: '2023-10-12T06:30:08.815839024Z'
      projects/441323991697/locations/us-west1/memberships/gke-west-1:
        state:
          code: OK
          updateTime: '2023-10-12T06:30:08.815837031Z'
      projects/441323991697/locations/us-west1/memberships/gke-west-2:
        state:
          code: OK
          updateTime: '2023-10-12T06:30:08.815840985Z'
    name: projects/pierre-louis-playground/locations/global/features/multiclusteringress
    resourceState:
      state: ACTIVE
    spec:
      multiclusteringress:
        configMembership: projects/pierre-louis-playground/locations/us-west1/memberships/gke-west-1
    state:
      state:
        code: OK
        description: Ready to use
        updateTime: '2023-10-12T06:23:51.317464415Z'
    updateTime: '2023-10-12T06:30:09.439319551Z'
    
  4. Confirma que las GatewayClasses existen en tu clúster de configuración:

    kubectl get gatewayclasses --context=gke-west-1
    

    El resultado es similar a este:

    NAME                                  CONTROLLER                  ACCEPTED   AGE
    gke-l7-global-external-managed        networking.gke.io/gateway   True       78m
    gke-l7-global-external-managed-mc     networking.gke.io/gateway   True       4m22s
    gke-l7-gxlb                           networking.gke.io/gateway   True       78m
    gke-l7-gxlb-mc                        networking.gke.io/gateway   True       4m23s
    gke-l7-regional-external-managed      networking.gke.io/gateway   True       78m
    gke-l7-regional-external-managed-mc   networking.gke.io/gateway   True       4m22s
    gke-l7-rilb                           networking.gke.io/gateway   True       78m
    gke-l7-rilb-mc                        networking.gke.io/gateway   True       4m22s
    

    Este resultado incluye el gke-l7-global-external-managed-mc, gke-l7-regional-external-managed-mc, gke-l7-gxlb-mc para puertas de enlace de varios clústeres externos GatewayClass gke-l7-rilb-mc para puertas de enlace de varios clústeres internos.

  5. Cambia el contexto de kubectl al clúster de control:

    kubectl config use-context gke-west-1
    

Ahora puedes comenzar a implementar puertas de enlace de varios clústeres en el clúster de configuración.

Soluciona problemas

En esta sección se muestra cómo resolver problemas relacionados con la habilitación del controlador de la puerta de enlace de varios clústeres.

GatewayClasses no están disponibles en el clúster de configuración

El siguiente error puede ocurrir cuando ejecutas el comando kubectl get gatewayclasses:

error: the server doesn't have a resource type "gatewayclasses"

Para resolver este problema, instala la API de Gateway en tu clúster:

gcloud container clusters update CLUSTER_NAME \
    --gateway-api=standard \
    --region=COMPUTE_REGION

Reemplaza lo siguiente:

  • CLUSTER_NAME: es el nombre de tu clúster.
  • COMPUTE_REGION: La región de Compute Engine del clúster. Para los clústeres zonales, usa --zone=COMPUTE_ZONE.

Problemas conocidos

  • Existe un problema conocido con el controlador de la puerta de enlace de varios clústeres en el que puede no iniciarse. Para evitar este problema, habilita la API de la puerta de enlace en el clúster de configuración y, luego, incluye las CRD antes de que la función de Ingress de Hub (flota) esté habilitada.
  • Las puertas de enlace de varios clústeres pueden filtrar recursos del balanceador de cargas en los siguientes casos:
    • La función de entrada de la flota se actualiza con un clúster de configuración nuevo que no tiene todos los recursos Gateway que existen en el clúster de configuración actual.
    • La función de entrada de la flota está inhabilitada, mientras que los recursos Gateway que hacen referencia a GatewayClass de varios clústeres existen en el clúster de configuración.
  • Gateway de varios clústeres se ejecuta como un servicio global. Si el controlador de la puerta de enlace de varios clústeres encuentra una falla del plano de control de Hub (Fleet) regional, responderá con una falla estática y no realizará más cambios en el balanceador de cargas hasta que la región se haya regresado al servicio.

¿Qué sigue?