Configurer Ingress multicluster

Cette page explique comment acheminer le trafic sur plusieurs clusters Google Kubernetes Engine (GKE) dans différentes régions à l'aide de Multi Cluster Ingress.

Pour en savoir plus sur le déploiement de Multi Cluster Ingress, consultez la sectionDéployer Ingress dans les clusters.

Ces étapes nécessitent des privilèges élevés et doivent être effectuées par un administrateur GKE.

Avant de commencer

Avant de commencer, effectuez les tâches suivantes :

  • Assurez-vous d'avoir activé l'API Google Kubernetes Engine.
  • Activer l'API Google Kubernetes Engine
  • Assurez-vous d'avoir installé Google Cloud CLI.
  • Configurez les paramètres par défaut de Google Cloud CLI pour votre projet en utilisant l'une des méthodes suivantes :
    • Utilisez gcloud init si vous souhaitez suivre les étapes de définition des paramètres par défaut du projet.
    • Utilisez gcloud config pour définir individuellement l'ID, la zone et la région de votre projet.

    gcloud init

    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 CLI à 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.
    6. Choisissez une région Compute Engine par défaut.

    gcloud config

    1. Définissez votre ID de projet par défaut :
      gcloud config set project PROJECT_ID
    2. Définissez votre région Compute Engine par défaut (par exemple, us-central1) :
      gcloud config set compute/region COMPUTE_REGION
    3. Définissez votre zone Compute Engine par défaut (par exemple, us-central1-c) :
      gcloud config set compute/zone COMPUTE_ZONE
    4. Mettez à jour gcloud vers la dernière version :
      gcloud components update

    En définissant des emplacements par défaut, vous pouvez éviter les erreurs dans gCloud CLI, telles que celle-ci : One of [--zone, --region] must be supplied: Please specify location.

Conditions requises et limites

Multi Cluster Ingress présente les exigences suivantes :

  • Google Cloud CLI version 290.0.0 et ultérieure.
  • Le module complémentaire HttpLoadBalancing doit être activé sur les clusters. Il est activé par défaut. Vous ne devez pas le désactiver.
  • Les clusters doivent être VPC natifs.
  • Workload Identity doit être activé sur les clusters.

Multi Cluster Ingress présente les limites suivantes :

  • Compatible uniquement avec un équilibreur de charge HTTP(S) externe.
  • Vous ne pouvez déployer qu'une seule instance de Multi Cluster Ingress par projet. Vous pouvez déployer des ressources MultiClusterIngress sur des sous-ensembles spécifiques de clusters au sein d'un projet en contrôlant le champ d'application des clusters à l'aide de la sélection des clusters.
  • Ne créez pas d'équilibreurs de charge Compute Engine dans le même projet avec le préfixe mci- qui ne sont pas gérés par Multi Cluster Ingress, car ils seront supprimés. Google Cloud utilise le préfixe mci-[6 char hash] pour gérer les ressources Compute Engine déployées par Multi Cluster Ingress.
  • La configuration du protocole HTTPS nécessite une adresse IP statique pré-allouée. HTTPS n'est pas compatible avec les adresses IP éphémères.

Présentation

Dans cet exercice, vous allez effectuer les tâches suivantes :

  1. Sélectionner la tarification que vous souhaitez utiliser.
  2. Déployer des clusters.
  3. Configurer les identifiants du cluster.
  4. Enregistrer les clusters dans un parc.
  5. Spécifier un cluster de configuration. Ce cluster peut être un plan de contrôle dédié ou exécuter d'autres charges de travail.

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 enregistrés dans un parc de manière à ce que Multi Cluster Ingress puisse les reconnaître.

Sélectionner des tarifs

Si Multi Cluster Ingress est la seule fonctionnalité Anthos que vous utilisez, nous vous recommandons d'utiliser une tarification autonome. Si votre projet utilise d'autres composants ou fonctionnalités Anthos sur Google Cloud, vous devez utiliser une licence Anthos.

Les API que vous devez activer dépendent de la tarification Multi Cluster Ingress que vous utilisez.

  • Si l'API Anthos (anthos.googleapis.com) 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 Multi Cluster Ingress de backend dans votre projet.

Vous pouvez modifier le modèle de facturation de Multi Cluster Ingress 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 Multi Cluster Ingress.

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

Créez 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

Configurez les identifiants de vos clusters et renommez les contextes de clusters afin de faciliter le basculement entre les clusters lors du déploiement des ressources.

  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

Enregistrez vos clusters dans un parc à l'aide de Connect.

Vous pouvez enregistrer des clusters à l'aide de Workload Identity ou manuellement à l'aide d'un compte de service Google Cloud.

Workload Identity

  1. Enregistrez 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
    

Manuel

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
    

Une fois vos clusters enregistrés, GKE déploie les composants suivants sur votre cluster : gke-mcs-importer, mcs-core-dns et mcs-core-dns-autoscaler.

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. Ce cluster doit déjà être enregistré dans le parc. Pour en savoir plus, consultez la section Conception du cluster de configuration.

Activez Multi Cluster Ingress et sélectionnez gke-us comme cluster de configuration :

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

L'enregistrement du cluster de configuration peut prendre jusqu'à 15 minutes. Le résultat renvoyé en cas de succès ressemble à ce qui suit :

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

Le résultat renvoyé en cas d'échec ressemble à ce qui suit :

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é :

gcloud beta container hub ingress describe

Le résultat renvoyé en cas de succès 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 la résolution des erreurs avec Multi Cluster Ingress, consultez la section Dépannage et opérations.

VPC partagé

Vous pouvez déployer une ressource MultiClusterIngress pour les clusters d'un réseau VPC partagé, mais tous les clusters GKE de backend 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 Multi Cluster Ingress gère les règles de pare-feu pour permettre la transmission des vérifications d'état de l'équilibreur de charge aux charges de travail de conteneurs.

Dans un réseau VPC partagé, un administrateur de projet hôte doit créer manuellement les règles de pare-feu pour le trafic de l'équilibreur de charge pour le compte du contrôleur Multi Cluster Ingress.

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 l'équilibreur de charge pour envoyer du trafic aux backends. Cette règle doit exister pour la durée de vie opérationnelle d'une ressource MultiClusterIngress.

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 les éléments suivants :

  • FIREWALL_RULE_NAME : nom de la nouvelle règle de pare-feu que vous choisissez.
  • 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 Google Cloud CLI 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 gcloud CLI 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