Configurar Ingress con varios clústeres

En esta página se muestra cómo enrutar el tráfico entre varios clústeres de Google Kubernetes Engine (GKE) en diferentes regiones mediante Multi Cluster Ingress. En el ejemplo se usan dos clústeres.

Para ver una comparación detallada entre Multi Cluster Ingress (MCI), Multi-cluster Gateway (MCG) y el balanceador de carga con grupos de endpoints de red independientes (LB y Standalone NEGs), consulta Elegir la API de balanceo de carga multiclúster para GKE.

Para obtener más información sobre cómo desplegar Ingress de varios clústeres, consulta Desplegar objetos Ingress en clústeres.

Estos pasos requieren permisos elevados y debe llevarlos a cabo un administrador de GKE.

Antes de empezar

Antes de empezar, asegúrate de que has realizado las siguientes tareas:

  • Habilita la API de Google Kubernetes Engine.
  • Habilitar la API de Google Kubernetes Engine
  • Si quieres usar Google Cloud CLI para esta tarea, instálala y, a continuación, inicialízala. Si ya has instalado la gcloud CLI, obtén la versión más reciente ejecutando gcloud components update.

Requisitos y limitaciones

Multi Cluster Ingress tiene los siguientes requisitos:

  • Google Cloud CLI versión 290.0.0 y posteriores.

Si usas clústeres en modo Estándar, asegúrate de que cumples los siguientes requisitos. Los clústeres de Autopilot ya cumplen estos requisitos.

  • Los clústeres deben tener habilitado el complemento HttpLoadBalancing. Este complemento está habilitado de forma predeterminada, por lo que no debes inhabilitarlo.
  • Los clústeres deben ser nativos de VPC.
  • Los clústeres deben tener habilitada la opción Workload Identity Federation for GKE.

Ingress de varios clústeres tiene las siguientes limitaciones:

  • Solo se admite con un balanceador de carga de aplicación externo.
  • No crees balanceadores de carga de Compute Engine en el mismo proyecto con el prefijo mci- que no estén gestionados por Ingress de varios clústeres, ya que se eliminarán. Google Cloud usa el prefijo mci-[6 char hash] para gestionar los recursos de Compute Engine que despliega Ingress de varios clústeres.
  • Para configurar HTTPS, se necesita una dirección IP estática preasignada. HTTPS no se admite con direcciones IP efímeras.

Información general

En este ejercicio, seguirás estos pasos:

  1. Selecciona los precios que quieras usar.
  2. Despliega clústeres.
  3. Configura las credenciales del clúster.
  4. Registra los clústeres en una flota.
  5. Especifica un clúster de configuración. Este clúster puede ser un plano de control dedicado o puede ejecutar otras cargas de trabajo.

En el siguiente diagrama se muestra el aspecto que tendrá tu entorno después de completar el ejercicio:

Topología del clúster que muestra las relaciones entre regiones, flotas y proyectos.

En el diagrama, hay dos clústeres de GKE llamados gke-us y gke-eu en las regiones europe-west1 y us-central1. Los clústeres se registran en una flota para que el controlador de entrada multi-clúster pueda reconocerlos. Una flota te permite agrupar y normalizar lógicamente tus clústeres de GKE, lo que facilita la administración de la infraestructura y permite usar funciones de varios clústeres, como la entrada multi-clúster. Puede consultar más información sobre las ventajas de las flotas y cómo crearlas en la documentación sobre gestión de flotas.

Habilitar APIs

Habilita las APIs necesarias en tu proyecto:

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

Desplegar clústeres

Crea dos clústeres de GKE llamados gke-us y gke-eu en las regiones europe-west1 y us-central1.

Autopilot

  1. Crea el clúster gke-us en la región us-central1:

    gcloud container clusters create-auto gke-us \
        --location=us-central1 \
        --release-channel=stable \
        --project=PROJECT_ID
    

    Sustituye PROJECT_ID por el ID de tu proyecto. Google Cloud

  2. Crea el clúster gke-eu en la región europe-west1:

    gcloud container clusters create-auto gke-eu \
        --location=europe-west1 \
        --release-channel=stable \
        --project=PROJECT_ID
    

Estándar

Crea los dos clústeres con Workload Identity Federation para GKE habilitado.

  1. Crea el clúster gke-us en la región us-central1:

    gcloud container clusters create gke-us \
        --location=us-central1 \
        --enable-ip-alias \
        --workload-pool=PROJECT_ID.svc.id.goog \
        --release-channel=stable \
        --project=PROJECT_ID
    

    Sustituye PROJECT_ID por el ID de tu proyecto. Google Cloud

  2. Crea el clúster gke-eu en la región europe-west1:

    gcloud container clusters create gke-eu \
        --location=europe-west1 \
        --enable-ip-alias \
        --workload-pool=PROJECT_ID.svc.id.goog \
        --release-channel=stable \
        --project=PROJECT_ID
    

Configurar las credenciales del clúster

Configura las credenciales de tus clústeres y cambia el nombre de los contextos de clúster para que te resulte más fácil cambiar de clúster al implementar recursos.

  1. Obtén las credenciales de tus clústeres:

    gcloud container clusters get-credentials gke-us \
        --location=us-central1 \
        --project=PROJECT_ID
    
    gcloud container clusters get-credentials gke-eu \
        --location=europe-west1 \
        --project=PROJECT_ID
    

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

  2. Cambia el nombre de los contextos del clúster:

    kubectl config rename-context gke_PROJECT_ID_us-central1_gke-us gke-us
    kubectl config rename-context gke_PROJECT_ID_europe-west1_gke-eu gke-eu
    

Registrar clústeres en una flota

Registra tus clústeres en la flota de tu proyecto de la siguiente manera.

  1. Registra tus clústeres:

    gcloud container fleet memberships register gke-us \
        --gke-cluster us-central1/gke-us \
        --enable-workload-identity \
        --project=PROJECT_ID
    
    gcloud container fleet memberships register gke-eu \
        --gke-cluster europe-west1/gke-eu \
        --enable-workload-identity \
        --project=PROJECT_ID
    
  2. Confirma que tus clústeres se han registrado correctamente en la flota:

    gcloud container fleet memberships list --project=PROJECT_ID
    

    El resultado debería ser similar al siguiente:

    NAME                                  EXTERNAL_ID
    gke-us                                0375c958-38af-11ea-abe9-42010a800191
    gke-eu                                d3278b78-38ad-11ea-a846-42010a840114
    

Una vez que registres tus clústeres, GKE desplegará el gke-mcs-importer pod en tu clúster.

Para obtener más información sobre cómo registrar clústeres, consulta el artículo Registrar un clúster de GKE en tu flota.

Especificar un clúster de configuración

El clúster de configuración es un clúster de GKE que elijas para que sea el punto de control central de Ingress en los clústeres miembros. Este clúster ya debe estar registrado en la flota. Para obtener más información, consulta Configurar el diseño del clúster.

Habilita Multi Cluster Ingress y selecciona gke-us como clúster de configuración:

gcloud container fleet ingress enable \
    --config-membership=gke-us \
    --location=us-central1 \
    --project=PROJECT_ID

El registro del clúster de configuración tarda hasta 15 minutos. El resultado correcto es similar al siguiente:

Waiting for Feature to be created...done.
Waiting for controller to start...done.

El resultado fallido es similar al siguiente:

Waiting for controller to start...failed.
ERROR: (gcloud.container.fleet.ingress.enable) Controller did not start in 2 minutes. Please use the `describe` command to check Feature state for debugging information.

Si se ha producido un error en el paso anterior, comprueba el estado de la función:

gcloud container fleet ingress describe \
    --project=PROJECT_ID

El resultado correcto es similar al siguiente:

createTime: '2021-02-04T14:10:25.102919191Z'
membershipStates:
 projects/PROJECT_ID/locations/global/memberships/CLUSTER_NAME:
 state:
   code: ERROR
   description: '...is not a VPC-native GKE Cluster.'
   updateTime: '2021-08-10T13:58:50.298191306Z'
 projects/PROJECT_ID/locations/global/memberships/CLUSTER_NAME:
 state:
   code: OK
   updateTime: '2021-08-10T13:58:08.499505813Z'

Para obtener más información sobre cómo solucionar errores con Multi Cluster Ingress, consulta Solución de problemas y operaciones.

Impacto en los clústeres activos

Puedes habilitar Multi Cluster Ingress de forma segura con gcloud container fleet ingress enable en un clúster activo, ya que no provoca ningún tiempo de inactividad ni afecta al tráfico del clúster.

VPC compartida

Puedes desplegar un recurso MultiClusterIngress para los clústeres de una red de VPC compartida, pero todos los clústeres de GKE de backend participantes deben estar en el mismo proyecto. No se admite que los clústeres de GKE de diferentes proyectos usen la misma dirección IP virtual de Cloud Load Balancing.

En las redes de VPC que no son compartidas, el controlador Multi Cluster Ingress gestiona las reglas de cortafuegos para permitir que las comprobaciones del estado pasen del balanceador de carga a las cargas de trabajo de los contenedores.

En una red de VPC compartida, un administrador del proyecto host debe crear manualmente las reglas de cortafuegos para el tráfico del balanceador de carga en nombre del controlador Multi Cluster Ingress.

El siguiente comando muestra la regla de cortafuegos que debes crear si tus clústeres están en una red de VPC compartida. Los intervalos de origen son los intervalos que utiliza el balanceador de carga para enviar tráfico a los backends. Esta regla debe existir durante el tiempo de actividad de un recurso MultiClusterIngress.

Si tus clústeres están en una red de VPC compartida, crea la regla de cortafuegos:

gcloud compute firewall-rules create FIREWALL_RULE_NAME \
    --project=HOST_PROJECT \
    --network=SHARED_VPC \
    --direction=INGRESS \
    --allow=tcp:0-65535 \
    --source-ranges=130.211.0.0/22,35.191.0.0/16

Haz los cambios siguientes:

  • FIREWALL_RULE_NAME: el nombre que elijas para la nueva regla de cortafuegos.
  • HOST_PROJECT: el ID del proyecto host de la VPC compartida.
  • SHARED_VPC: el nombre de la red de VPC compartida.

Problemas conocidos

En esta sección se describen los problemas conocidos de Ingress de varios clústeres.

InvalidValueError para el campo config_membership

Hay un problema conocido que impide que la CLI de Google Cloud interactúe con Multi Cluster Ingress. Este problema se introdujo en la versión 346.0.0 y se solucionó en la versión 348.0.0. No recomendamos usar las versiones 346.0.0 y 347.0.0 de la CLI de gcloud con Multi Cluster Ingress.

Valor no válido para el campo "resource"

Google Cloud Armor no puede comunicarse con los clústeres de configuración de Multi Cluster Ingress que ejecutan las siguientes versiones de GKE:

  • 1.18.19-gke.1400 y versiones posteriores
  • 1.19.10-gke.700 y versiones posteriores
  • 1.20.6-gke.700 y versiones posteriores

Cuando configuras una política de seguridad de Google Cloud Armor, aparece el siguiente mensaje:

Invalid value for field 'resource': '{"securityPolicy": "global/securityPolicies/"}': The given policy does not exist

Para evitar este problema, actualiza tu clúster de configuración a la versión 1.21 o posterior, o usa el siguiente comando para actualizar el BackendConfig CustomResourceDefinition:

kubectl patch crd backendconfigs.cloud.google.com --type='json' -p='[{"op": "replace", "path": "/spec/versions/1/schema/openAPIV3Schema/properties/spec/properties/securityPolicy", "value":{"properties": {"name": {"type": "string"}}, "required": ["name" ],"type": "object"}}]'

Siguientes pasos