Configura Ingress de varios clústeres

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

Para obtener más información sobre la implementación de Ingress de varios clústeres, consulta Implementa Ingress en varios clústeres.

Estos pasos requieren privilegios elevados y un administrador de GKE los debe realizar.

Antes de comenzar

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

  • Asegúrate de que habilitaste la API de Google Kubernetes Engine.
  • Habilitar la API de Google Kubernetes Engine
  • Asegúrate de que instalaste Google Cloud CLI.
  • Establece la configuración predeterminada de Google Cloud CLI para tu proyecto mediante uno de los siguientes métodos:
    • Usa gcloud init si deseas ver una explicación sobre cómo configurar los valores predeterminados del proyecto.
    • Usa gcloud config para configurar el ID, la zona y la región del proyecto de manera individual.

    gcloud init

    1. Ejecuta gcloud init y sigue las instrucciones:

      gcloud init

      Si usas SSH en un servidor remoto, usa la marca --console-only para evitar que el comando abra un navegador:

      gcloud init --console-only
    2. Sigue las instrucciones para autorizar a la CLI de gcloud a usar tu cuenta de Google Cloud.
    3. Crea una configuración nueva o selecciona una existente.
    4. Elige un proyecto de Google Cloud.
    5. Elige una zona de Compute Engine predeterminada.
    6. Elige una región de Compute Engine predeterminada.

    gcloud config

    1. Establece tu ID del proyecto predeterminado:
      gcloud config set project PROJECT_ID
    2. Configura la región de Compute Engine predeterminada (por ejemplo, us-central1):
      gcloud config set compute/region COMPUTE_REGION
    3. Configura la zona de Compute Engine predeterminada (por ejemplo, us-central1-c):
      gcloud config set compute/zone COMPUTE_ZONE
    4. Actualiza gcloud a la versión más reciente:
      gcloud components update

    Cuando configuras las ubicaciones predeterminadas, puedes evitar errores en la CLI de gcloud como el siguiente: One of [--zone, --region] must be supplied: Please specify location.

Requisitos y limitaciones

Ingress de varios clústeres tiene los siguientes requisitos:

  • Google Cloud CLI versión 290.0.0 y posteriores.
  • Los clústeres deben tener el complemento HttpLoadBalancing habilitado. Este complemento está habilitado de forma predeterminada; no debes inhabilitarlo.
  • Los clústeres deben ser nativos de la VPC.
  • Los clústeres deben tener habilitada Workload Identity.

Ingress de clústeres múltiples tiene las siguientes limitaciones:

  • Solo es compatible con un balanceador de cargas de HTTP(S) externo.
  • Solo puedes implementar una instancia de Ingress de varios clústeres por proyecto. Puedes implementar recursos MultiClusterIngress en subconjuntos de clústeres específicos dentro de un proyecto si controlas el alcance de los clústeres con la selección de clústeres.
  • No crees balanceadores de cargas de Compute Engine en el mismo proyecto con el prefijo mci- que no estén administrados por Ingress de varios clústeres o se borrarán. Google Cloud usa el prefijo mci-[6 char hash] para administrar los recursos de Compute Engine que implementa Ingress de varios clústeres.
  • La configuración de HTTPS requiere una dirección IP estática asignada previamente. HTTPS no es compatible con direcciones IP efímeras.

Descripción general

En este ejercicio, debes realizar los siguientes pasos:

  1. Seleccionar los precios que deseas usar.
  2. Implementar clústeres.
  3. Configurar credenciales de clústeres.
  4. Registra los clústeres en una flota.
  5. Especificar 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 cómo se verá el entorno después de completar el ejercicio:

Topología del clúster que muestra las relaciones entre las regiones, la flota y el proyecto.

En el diagrama, hay dos clústeres de GKE llamados gke-us y gke-eu en las zonas europe-west1 y us-central1. Los clústeres se registran en una flota para que el controlador de Ingress de varios clústeres pueda reconocerlos. Una flota te permite agrupar y normalizar de forma lógica tus clústeres de GKE, lo que facilita la administración de la infraestructura y habilita el uso de funciones de varios clústeres, como Ingress de varios clústeres. Puedes obtener más información sobre los beneficios de las flotas y cómo crearlas en la documentación de administración de flotas.

Selecciona precios

Si Ingress de varios clústeres es la única función de Anthos que estás usando, te recomendamos que uses los precios independientes. Si tu proyecto usa otros componentes o funciones de Anthos en Google Cloud, debes habilitar toda la plataforma de Anthos. Esto te permite usar todas las funciones de Anthos por un solo cargo por CPU virtual.

Las API que debes habilitar dependen de los precios de Ingress de varios clústeres que usas.

  • Si la API de Anthos (anthos.googleapis.com) está habilitada, tu proyecto se factura según la cantidad de CPU virtuales del clúster y los precios de Anthos.
  • Si se inhabilita la API de Anthos, tu proyecto se factura según la cantidad de Pods de backend de Ingress de varios clústeres en tu proyecto.

Puedes cambiar el modelo de facturación de Ingress de varios clústeres de independiente a Anthos, o de Anthos a independiente en cualquier momento sin afectar los recursos o el tráfico de Ingress de varios clústeres.

Precios de Anthos

Para habilitar los precios de Anthos, sigue estos pasos:

  1. Habilita las API de Anthos, Ingress de varios clústeres, Connect y GKE en tu proyecto:

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

    Después de habilitar anthos.googleapis.com en tu proyecto, cualquier clúster registrado en Connect se factura de acuerdo con los precios de Anthos.

Precios independientes

Para habilitar los precios independientes, sigue estos pasos:

  1. Confirma que la API de Anthos esté inhabilitada en tu proyecto:

    gcloud services list --project=PROJECT_ID | grep anthos.googleapis.com
    

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

    Si el resultado es una respuesta vacía, la API de Anthos se inhabilita en tu proyecto y cualquier recurso de Ingress de varios clústeres se factura con precios independientes.

  2. Habilita las API de Ingress de varios clústeres, Connect y GKE en tu proyecto:

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

Implementa clústeres

Crea dos clústeres de GKE llamados gke-us y gke-eu en las zonas europe-west1 y us-central1, con Workload Identity habilitado.

  1. Crea el clúster gke-us en la zona us-central1-b:

    gcloud container clusters create gke-us \
        --zone=us-central1-b \
        --enable-ip-alias \
        --workload-pool=PROJECT_ID.svc.id.goog \
        --release-channel=stable \
        --project=PROJECT_ID
    
  2. Crea el clúster gke-eu en la zona europe-west1-b:

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

Configura las credenciales del clúster

Configura las credenciales de los clústeres y cambia el nombre de los contextos de clúster para facilitar el cambio entre clústeres cuando se implementan recursos.

  1. Recupera las credenciales para tus clústeres:

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

    Las credenciales se almacenan de forma local para que puedas usar el cliente de 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 las credenciales.

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

    kubectl config rename-context gke_PROJECT_ID_us-central1-b_gke-us gke-us
    kubectl config rename-context gke_PROJECT_ID_europe-west1-b_gke-eu gke-eu
    

Registra 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-b/gke-us \
        --enable-workload-identity \
        --project=PROJECT_ID
    
    gcloud container fleet memberships register gke-eu \
        --gke-cluster europe-west1-b/gke-eu \
        --enable-workload-identity \
        --project=PROJECT_ID
    
  2. Confirma que tus clústeres se hayan registrado de forma correcta en la flota:

    gcloud container fleet memberships list --project=PROJECT_ID
    

    El resultado es similar a este:

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

Después de registrar tus clústeres, GKE implementa los siguientes componentes en tu clúster: gke-mcs-importer, mcs-core-dns y mcs-core-dns-autoscaler.

Puedes obtener más información sobre cómo registrar clústeres en Registra un clúster de GKE en tu flota.

Especifica un clúster de configuración

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

Habilita Ingress de varios clústeres y selecciona gke-us como el clúster de configuración:

gcloud container fleet ingress enable \
   --config-membership=gke-us

El clúster de configuración puede tardar hasta 15 minutos en registrarse. El resultado correcto es similar a este:

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

El resultado incorrecto 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 produjo un error en el paso anterior, verifica el estado de la función:

gcloud container fleet ingress describe

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 Ingress de varios clústeres, consulta Solución de problemas y operaciones.

VPC compartida

Puedes implementar un recurso MultiClusterIngress para clústeres en una red de VPC compartida, pero todos los clústeres de GKE de backend participantes deben estar en el mismo proyecto. No se admiten los clústeres de GKE en diferentes proyectos que usen el mismo VIP de Cloud Load Balancing.

En las redes de VPC no compartidas, el controlador de Ingress de varios clústeres administra las reglas de firewall para permitir que las verificaciones de estado pasen del balanceador de cargas a las cargas de trabajo del contenedor.

En una red de VPC compartida, el administrador de un proyecto host debe crear de forma manual las reglas de firewall para el tráfico del balanceador de cargas en nombre del controlador de Ingress de varios clústeres.

El siguiente comando muestra la regla de firewall que debes crear si tus clústeres están en una red de VPC compartida. Los rangos de origen son los que usa el balanceador de cargas para enviar tráfico a los backends. Esta regla debe existir durante la vida útil de un recurso MultiClusterIngress.

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

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

Reemplaza lo siguiente:

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

Problemas conocidos

InvalidValueError para el campo cconfig_membership

Un problema conocido impide que Google Cloud CLI interactúe con Ingress de varios clústeres. 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 el Ingress de varios clústeres.

Valor no válido para el campo 'resource'

Google Cloud Armor no puede comunicarse con los clústeres de configuración del Ingress de varios clústeres que se ejecutan en las siguientes versiones de GKE:

  • 1.18.19-gke.1400 y posteriores
  • 1.19.10-gke.700 y posteriores
  • 1.20.6-gke.700 y 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

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

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"}}]'

¿Qué sigue?