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 una comparación detallada entre Ingress de varios clústeres (MCI), la puerta de enlace de varios clústeres (MCG) y el balanceador de cargas con grupos de extremos de red independientes (LB y NEG independientes), consulta Elige tu clúster múltiple API de balanceo de cargas para GKE.

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:

  • 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 y limitaciones

Ingress de varios clústeres tiene los siguientes requisitos:

  • Google Cloud CLI versión 290.0.0 y posteriores.

Si usas clústeres de modo Standard, asegúrate de cumplir con los siguientes requisitos. Los clústeres de Autopilot ya cumplen con estos requisitos.

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

  • Solo es compatible con un balanceador de cargas de aplicaciones externo.
  • 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] con el cual se administran 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 regiones 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 GKE Enterprise que estás usando, te recomendamos que uses los precios independientes. Si tu proyecto usa otros componentes o funciones de GKE Enterprise en Google Cloud, debes habilitar toda la plataforma de GKE Enterprise. Esto te permite usar todas las funciones de GKE Enterprise por un solo cargo por CPU virtual.

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

  • Si la API de GKE Enterprise (anthos.googleapis.com) está habilitada, tu proyecto se factura según la cantidad de CPU virtuales del clúster y los precios de GKE Enterprise.
  • Si se inhabilita la API de GKE Enterprise, 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 GKE Enterprise, o de GKE Enterprise a independiente en cualquier momento sin afectar los recursos o el tráfico de Ingress de varios clústeres.

Precios independientes

Para habilitar los precios independientes, sigue estos pasos:

  1. Confirma que la API de GKE Enterprise 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 GKE Enterprise se inhabilita en tu proyecto y cualquier recurso de Ingress de varios clústeres se factura con precios independientes.

  2. Habilita las APIs obligatorias en tu proyecto:

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

Precios de GKE Enterprise

Para habilitar los precios de GKE Enterprise, habilita las APIs obligatorias en tu proyecto:

gcloud services enable \
    anthos.googleapis.com \
    multiclusteringress.googleapis.com \
    gkehub.googleapis.com \
    container.googleapis.com \
    multiclusterservicediscovery.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 GKE Enterprise.

Implementa 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 \
        --region=us-central1 \
        --release-channel=stable \
        --project=PROJECT_ID
    

    Reemplaza PROJECT_ID por el ID del proyecto de Google Cloud.

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

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

Standard

Crea los dos clústeres con la federación de identidades para cargas de trabajo para GKE habilitada.

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

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

    Reemplaza PROJECT_ID por el ID del proyecto de Google Cloud.

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

    gcloud container clusters create gke-eu \
        --region=europe-west1 \
        --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 \
        --region=us-central1 \
        --project=PROJECT_ID
    
    gcloud container clusters get-credentials gke-eu \
        --region=europe-west1 \
        --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_gke-us gke-us
    kubectl config rename-context gke_PROJECT_ID_europe-west1_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/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 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 el Pod gke-mcs-importer en tu clúster.

Puedes obtener más información para 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 \
    --location=us-central1 \
    --project=PROJECT_ID

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 \
    --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 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

En esta sección, se describen problemas conocidos para el Ingress de varios clústeres

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?