Configurer un objet Ingress multicluster

Cette page vous explique comment configurer l'entrée multi-cluster pour acheminer le trafic sur plusieurs clusters Google Kubernetes Engine (GKE) dans différentes régions.

L'objet d'entrée multicluster est un contrôleur d'entrée multicluster hébergé dans le cloud pour les clusters GKE. Il permet de déployer des ressources d'équilibrage partagées entre plusieurs clusters et régions.

Pour en savoir plus sur l'entrée multicluster, consultez la page Entrée multicluster. Vous pouvez également en savoir plus sur le déploiement d'une entrée dans les clusters.

Exigences

Un objet Ingress multicluster est compatible avec les éléments suivants :

  • Clusters GKE uniquement.
  • Clusters en mode VPC natif (adresses IP d'alias). Pour en savoir plus, consultez la page Créer un cluster de VPC natif.
  • Clusters pour lesquels l'équilibrage de charge HTTP est activé (paramètre par défaut). Notez que l'objet Ingress multicluster n'est compatible qu'avec l'équilibreur de charge HTTP(S) externe.
  • Clusters GKE activés avec Workload Identity.
  • SDK Cloud version 290 ou ultérieure (gcloud --version). Pour effectuer la mise à jour vers la dernière version, utilisez la commande gcloud components update.

Avant de commencer

Avant de commencer, effectuez les tâches suivantes :

Configurez les paramètres gcloud par défaut à l'aide de l'une des méthodes suivantes :

  • Utilisez gcloud init pour suivre les instructions permettant de définir les paramètres par défaut.
  • Utilisez gcloud config pour définir individuellement l'ID, la zone et la région de votre projet.

Utiliser gcloud init

Si le message d'erreur One of [--zone, --region] must be supplied: Please specify location s'affiche, effectuez les tâches ci-dessous.

  1. Exécutez gcloud init et suivez les instructions :

    gcloud init

    Si vous utilisez SSH sur un serveur distant, utilisez l'option --console-only pour empêcher la commande d'ouvrir un navigateur :

    gcloud init --console-only
  2. Suivez les instructions pour autoriser gcloud à utiliser votre compte Google Cloud.
  3. Créez ou sélectionnez une configuration.
  4. Choisissez un projet Google Cloud.
  5. Choisissez une zone Compute Engine par défaut pour les clusters zonaux ou une région pour les clusters régionaux ou Autopilot.

Utiliser gcloud config

  • Définissez votre ID de projet par défaut :
    gcloud config set project PROJECT_ID
  • Si vous utilisez des clusters zonaux, définissez votre zone de calcul par défaut :
    gcloud config set compute/zone COMPUTE_ZONE
  • Si vous utilisez des clusters Autopilot ou régionaux, définissez votre région de calcul par défaut :
    gcloud config set compute/region COMPUTE_REGION
  • Mettez à jour gcloud vers la dernière version :
    gcloud components update

Exercice de déploiement

Dans cet exercice, vous allez déployer des composants et préparer l'infrastructure requise pour utiliser la ressource d'entrée multicluster. Ces étapes sont nécessaires pour utiliser la ressource d'entrée multicluster dans votre environnement. Ces étapes nécessitent des privilèges élevés et doivent être effectuées par un administrateur GKE.

Voici un résumé des étapes de cet exercice :

  1. Activer les API requises.
  2. Déployer des clusters GKE pour héberger des charges de travail.
  3. Regrouper les clusters dans un parc
  4. Configurez les paramètres d'administration de l'entrée multicluster.

Le diagramme suivant montre à quoi ressemblera votre environnement une fois l'exercice terminé :

Topologie de cluster montrant les relations entre les régions, le parc et le projet

Dans le schéma, il existe deux clusters GKE nommés gke-us et gke-eu dans les zones europe-west1 et us-central1. Les clusters sont regroupés dans un parc afin que le contrôleur d'entrée multicluster puisse les reconnaître.

Activer les API

Les API que vous activez pour l'entrée multicluster dépendent des tarifs d'entrée multicluster que vous utilisez.

Si l'entrée multicluster est la seule fonctionnalité d'Anthos que vous utilisez, il peut être plus rentable d'utiliser la tarification autonome. La facturation de votre projet varie selon que l'API Anthos (anthos.googleapis.com) est activée ou désactivée.

  • Si l'API Anthos est activée, votre projet est facturé en fonction du nombre de processeurs virtuels du cluster et des tarifs d'Anthos.
  • Si l'API Anthos est désactivée, votre projet est facturé en fonction du nombre de pods d'entrée multi-cluster de backend dans votre projet.

Si votre projet utilise d'autres composants ou fonctionnalités Anthos sur Google Cloud, vous devez utiliser une licence Anthos.

Vous pouvez modifier le modèle de facturation de l'entrée multi-cluster pour passer de la facturation autonome à l'utilisation d'une licence Anthos ou inversement, à tout moment et sans que cela n'affecte les ressources ou le trafic de l'entrée multi-cluster. Pour modifier le modèle de facturation, vous devez activer ou désactiver l'API Anthos, comme indiqué dans les instructions suivantes.

Tarifs d'Anthos

Pour activer la tarification Anthos, procédez comme suit :

  1. Activez les API Anthos et GKE ainsi que les API d'entrée et de connexion multicluster dans votre projet :

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

    Une fois l'API anthos.googleapis.com activée dans votre projet, tous les clusters enregistrés dans Connect sont facturés conformément aux tarifs d'Anthos.

Tarification autonome

Pour activer la tarification autonome, procédez comme suit :

  1. Vérifiez que l'API Anthos est désactivée dans votre projet :

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

    Remplacez PROJECT_ID par l'ID de projet dans lequel les clusters GKE sont exécutés.

    Si le résultat est une réponse vide, l'API Anthos est désactivée dans votre projet et toutes les ressources d'entrée multicluster sont facturées selon une tarification autonome.

  2. Activez l'API GKE ainsi que les API d'entrée et de connexion multicluster dans votre projet :

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

Déployer des clusters

Dans cette section, vous allez créer deux clusters GKE nommés gke-us et gke-eu dans les zones europe-west1 et us-central1.

Nous vous recommandons de créer vos clusters avec Workload Identity activé afin de permettre aux charges de travail de votre cluster de s'authentifier sans que vous n'ayez besoin de télécharger, d'administrer ou de gérer la rotation des clés de compte de service Google Cloud. Si vous créez vos clusters sans activer Workload Identity, vous devez les enregistrer manuellement dans le parc à l'aide des clés de compte de service.

Workload Identity

  1. Créez le cluster gke-us dans la zone 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. Créez le cluster gke-eu dans la zone 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
    

Manuelle

  1. Créez le cluster gke-us dans la zone us-central1-b :

    gcloud container clusters create gke-us \
        --zone=us-central1-b \
        --enable-ip-alias \
        --release-channel=stable \
        --project=PROJECT_ID
    
  2. Créez le cluster gke-eu dans la zone europe-west1-b :

    gcloud container clusters create gke-eu \
        --zone=europe-west1-b \
        --enable-ip-alias \
        --release-channel=stable \
        --project=PROJECT_ID
    

Configurer les identifiants du cluster

Dans cette section, vous allez configurer les identifiants du cluster avec des noms faciles à mémoriser. Cela facilite le basculement entre les clusters lors du déploiement de ressources sur plusieurs clusters.

  1. Récupérez les identifiants de vos clusters :

    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
    

    Les identifiants sont stockés localement pour que vous puissiez utiliser votre client kubectl afin d'accéder aux serveurs d'API du cluster. Par défaut, un nom généré automatiquement est créé pour les identifiants.

  2. Renommez les contextes de cluster :

    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
    

Enregistrer des clusters dans un parc

Vous devez enregistrer vos clusters dans un parc à l'aide de Connect. Vous pouvez enregistrer des clusters manuellement à l'aide d'un compte de service Google Cloud ou via Workload Identity.

Workload Identity

  1. Si Workload Identity est activé pour vos clusters, exécutez les commandes suivantes pour enregistrer vos clusters :

    gcloud container hub memberships register gke-us \
        --gke-cluster us-central1-b/gke-us \
        --enable-workload-identity \
        --project=PROJECT_ID
    
    gcloud container hub memberships register gke-eu \
        --gke-cluster europe-west1-b/gke-eu \
        --enable-workload-identity \
        --project=PROJECT_ID
    
  2. Vérifiez que vos clusters sont bien enregistrés dans Connect :

    gcloud container hub memberships list --project=PROJECT_ID
    

    Le résultat ressemble à ce qui suit :

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

Manuelle

Si vous n'avez pas activé Workload Identity pour vos clusters, procédez comme suit pour enregistrer vos clusters :

  1. Assurez-vous de remplir les conditions préalables à l'enregistrement d'un cluster.

  2. Créez un compte de service et téléchargez le fichier JSON de clé privée du compte de service.

  3. Enregistrez vos clusters dans le parc à l'aide du fichier JSON de clé privée que vous avez téléchargé :

    gcloud container hub memberships register gke-us \
         --gke-cluster us-central1-b/gke-us \
         --service-account-key-file=SERVICE_ACCOUNT_KEY_PATH \
         --project=PROJECT_ID
    
    gcloud container hub memberships register gke-eu \
        --gke-cluster europe-west1-b/gke-eu \
        --service-account-key-file=SERVICE_ACCOUNT_KEY_PATH \
        --project=PROJECT_ID
    

    Remplacez l'élément suivant :

    • SERVICE_ACCOUNT_KEY_PATH : chemin d'accès local au fichier JSON de clé privée de compte de service que vous avez téléchargé dans les conditions préalables à l'enregistrement. Cette clé de compte de service est stockée sous la forme d'un secret nommé creds-gcp dans l'espace de noms gke-connect.
  4. Vérifiez que vos clusters sont bien enregistrés dans Connect :

    gcloud container hub memberships list --project=PROJECT_ID
    

    Le résultat ressemble à ce qui suit :

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

Spécifier un cluster de configuration

Le cluster de configuration est un cluster GKE que vous choisissez comme point de contrôle central pour Ingress parmi les clusters membres. Contrairement au contrôleur d'entrée GKE, le contrôleur d'entrée multicluster ne réside pas dans un seul cluster, mais est un service géré par Google qui surveille les ressources du cluster de configuration. Ce cluster GKE est utilisé comme serveur d'API multicluster pour stocker des ressources telles que MultiClusterIngress et MultiClusterService. Tout cluster membre peut devenir un cluster de configuration, mais il ne peut y avoir qu'un seul cluster de configuration à la fois.

Pour en savoir plus sur les clusters de configuration, consultez la page Conception du cluster de configuration.

Si le cluster de configuration est inactif ou inaccessible, les objets MultiClusterIngress et MultiClusterService ne peuvent pas être mis à jour dans les clusters membres. Les équilibreurs de charge peuvent continuer à fonctionner et le trafic peut se poursuivre indépendamment du cluster de configuration en cas de panne.

L'activation de l'objet Ingress multicluster et la sélection du cluster de configuration ont lieu à la même étape. Le cluster GKE que vous choisissez comme cluster de configuration doit déjà être enregistré dans une flotte.

  1. Identifiez l'URI du cluster que vous souhaitez définir comme cluster de configuration :

    gcloud container hub memberships list
    

    Le résultat ressemble à ce qui suit :

    NAME                                  EXTERNAL_ID
    gke-us                                0375c958-38af-11ea-abe9-42010a800191
    gke-eu                                d3278b78-38ad-11ea-a846-42010a840114
    
  2. Activez l'objet Ingress multicluster et sélectionnez gke-us comme cluster de configuration :

    gcloud beta container hub ingress enable \
      --config-membership=gke-us
    

    Notez que ce processus peut prendre quelques minutes pendant l'amorçage du contrôleur. Si l'opération réussit, le résultat est semblable à celui-ci :

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

    En cas d'échec, la commande expire comme indiqué ci-dessous :

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

    Si une erreur s'est produite à l'étape précédente, vérifiez l'état de la fonctionnalité. Il doit indiquer exactement ce qui s'est passé :

    gcloud beta container hub ingress describe
    

    Le résultat ressemble à ce qui suit :

    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'
    

    Pour en savoir plus sur ces messages d'erreur, consultez la section Dépannage et opérations.

Déploiement sur un VPC partagé

Un objet Ingress multicluster peut être déployé pour des clusters dans un réseau VPC partagé, mais tous les clusters de backend GKE participants doivent faire partie du même projet. Il n'est pas possible d'avoir des clusters GKE dans différents projets en utilisant la même adresse IP virtuelle pour Cloud Load Balancing.

Dans les réseaux VPC non partagés, le contrôleur Ingress multicluster gère les règles de pare-feu pour permettre la transmission des vérifications d'état de Cloud Load Balancing aux charges de travail de conteneurs.

Dans un réseau VPC partagé, l'entrée multicluster n'est pas en mesure de gérer ces règles de pare-feu, car le pare-feu est géré par le projet hôte, auquel les administrateurs du service n'ont pas accès. Le modèle de sécurité centralisé des réseaux VPC partagés centralise délibérément le contrôle du réseau. Dans les réseaux VPC partagés, un administrateur de projet hôte doit créer manuellement les règles de pare-feu nécessaires à l'acheminement du trafic Cloud Load Balancing pour le compte de l'objet Ingress multicluster.

La commande suivante indique la règle de pare-feu que vous devez créer si vos clusters résident dans un réseau VPC partagé. Les plages sources correspondent aux plages utilisées par Cloud Load Balancing pour envoyer le trafic vers les backends dans Google Cloud. Cette règle doit exister pour la durée de vie opérationnelle des objets Ingress multicluster. Elle ne peut être supprimée que si l'objet Ingress multicluster ou l'équilibrage de charge Cloud Load Balancing sur GKE n'est plus utilisé.

Si vos clusters résident dans un réseau VPC partagé, créez la règle de pare-feu :

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

Remplacez l'élément suivant :

  • FIREWALL_RULE_NAME : nom de la nouvelle règle de pare-feu.
  • HOST_PROJECT : ID du projet hôte de VPC partagé.
  • SHARED_VPC : nom du réseau VPC partagé.

Problèmes connus

InvalidValueError pour le champ config_membership

Un problème connu empêche l'outil de ligne de commande gcloud d'interagir avec l'objet Ingress multicluster. Ce problème a été introduit dans la version 346.0.0 et résolu dans la version 348.0.0. Nous vous déconseillons d'utiliser les versions 346.0.0 et 347.0.0 de l'outil gcloud avec l'objet Ingress multicluster.

Valeur non valide pour le champ "resource"

Google Cloud Armor ne peut pas communiquer avec les clusters de configuration d'objets Ingress multiclusters exécutés sur les versions suivantes de GKE :

  • 1.18.19-gke.1400 et versions ultérieures
  • 1.19.10-gke.700 et versions ultérieures
  • 1.20.6-gke.700 et versions ultérieures

Lorsque vous configurez une stratégie de sécurité Google Cloud Armor, le message suivant s'affiche :

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

Pour éviter ce problème, mettez à niveau votre cluster de configuration vers la version 1.21 ou une version ultérieure, ou exécutez la commande suivante pour mettre à jour la ressource 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"}}]'

Étape suivante