Provisionner Cloud Service Mesh sur un cluster GKE Autopilot


Ce guide explique comment configurer Cloud Service Mesh géré sur un cluster Google Kubernetes Engine (GKE) Autopilot. Cloud Service Mesh est un maillage de services entièrement géré basé sur Istio.

Ce tutoriel explique comment configurer un maillage de services prêt pour la production et exécuté sur un seul cluster GKE Autopilot avec les paramètres par défaut. Nous vous recommandons également de consulter le guide de provisionnement complet de Cloud Service Mesh lorsque vous concevez votre environnement.

Avantages de l'exécution de Cloud Service Mesh géré avec GKE Autopilot

Lorsque vous utilisez GKE en mode Autopilot, Google gère automatiquement la configuration et la gestion de votre cluster. Le mode Autopilot simplifie l'expérience d'exploitation d'un cluster et vous permet de vous concentrer sur vos applications. De la même manière, Cloud Service Mesh géré est un maillage de services entièrement géré que vous pouvez provisionner en suivant quelques étapes.

  • Vous provisionnez Cloud Service Mesh géré à l'aide de l'API Fleet, sans avoir besoin d'outils côté client tels que istioctl.
  • Cloud Service Mesh injecte automatiquement des proxys side-car dans les charges de travail sans qu'il soit nécessaire d'accorder des privilèges élevés à vos conteneurs.
  • Vous pouvez afficher des tableaux de bord enrichis pour votre réseau maillé et vos services sans aucune configuration supplémentaire, puis utiliser ces métriques pour configurer des objectifs de niveau de service (SLO) et des alertes pour surveiller l'état de vos applications.
  • Le plan de contrôle géré Cloud Service Mesh est mis à niveau automatiquement pour vous assurer que vous disposez des derniers correctifs et fonctionnalités de sécurité.
  • Le plan de données géré de Cloud Service Mesh met automatiquement à niveau les proxys side-car dans vos charges de travail. Vous n'avez ainsi pas besoin de redémarrer les services vous-même lorsque des mises à niveau de proxy et des correctifs de sécurité sont disponibles.
  • Cloud Service Mesh est un produit compatible et peut être configuré à l'aide des API Istio Open Source standards. Consultez la section Fonctionnalités compatibles.

Objectifs

  • Créer un cluster GKE Autopilot
  • Provisionner Cloud Service Mesh géré à l'aide de l'API Fleet
  • Déployer des passerelles d'entrée de réseau maillé dans un espace de noms dédié
  • Déployer un exemple d'application
  • Configurer Cloud Service Mesh pour appliquer l'authentification TLS mutuelle stricte (mTLS) pour la communication de service à service
  • Afficher les tableaux de bord Cloud Service Mesh et vérifier que les services se connectent avec mTLS

Coûts

Dans ce document, vous utilisez les composants facturables suivants de Google Cloud :

Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût. Les nouveaux utilisateurs de Google Cloud peuvent bénéficier d'un essai gratuit.

Une fois que vous avez terminé les tâches décrites dans ce document, vous pouvez éviter de continuer à payer des frais en supprimant les ressources que vous avez créées. Pour en savoir plus, consultez la section Effectuer un nettoyage.

Avant de commencer

Les logiciels dont vous avez besoin pour ce tutoriel sont préinstallés sur Cloud Shell, y compris kubectl, la gcloud CLI, Helm et Terraform. Si vous n'utilisez pas Cloud Shell, vous devez installer la gcloud CLI.

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. Install the Google Cloud CLI.
  3. To initialize the gcloud CLI, run the following command:

    gcloud init
  4. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  5. Make sure that billing is enabled for your Google Cloud project.

  6. Install the Google Cloud CLI.
  7. To initialize the gcloud CLI, run the following command:

    gcloud init
  8. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  9. Make sure that billing is enabled for your Google Cloud project.

  10. Grant roles to your user account. Run the following command once for each of the following IAM roles: roles/container.containerAdmin, roles/gkehub.admin, roles/serviceusage.serviceUsageAdmin

    gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
    • Replace PROJECT_ID with your project ID.
    • Replace USER_IDENTIFIER with the identifier for your user account. For example, user:myemail@example.com.

    • Replace ROLE with each individual role.

Configurer votre environnement

Vous pouvez configurer votre environnement à l'aide de gcloud CLI ou de Terraform.

gcloud

  1. Définissez les variables d'environnement :

    PROJECT_ID=PROJECT_ID
    gcloud config set project ${PROJECT_ID}
    
  2. Activez l'API Mesh :

    gcloud services enable mesh.googleapis.com
    

    L'activation de mesh.googleapis.com active les API suivantes :

    API Objectif Peut-être désactivé
    meshconfig.googleapis.com Cloud Service Mesh utilise l'API Mesh Configuration pour relayer les données de configuration de votre réseau maillé vers Google Cloud. En outre, l'activation de l'API Mesh Configuration vous permet d'accéder aux pages Cloud Service Mesh dans la console Google Cloud et d'utiliser l'autorité de certification Cloud Service Mesh (Mesh CA). Non
    meshca.googleapis.com Lié à l'autorité de certification Cloud Service Mesh utilisée par Cloud Service Mesh géré. Non
    container.googleapis.com Obligatoire pour créer des clusters Google Kubernetes Engine (GKE). Non
    gkehub.googleapis.com Obligatoire pour gérer le réseau maillé en tant que parc. Non
    monitoring.googleapis.com Obligatoire pour capturer la télémétrie pour les charges de travail du réseau maillé. Non
    stackdriver.googleapis.com Obligatoire pour utiliser l'interface utilisateur des services. Non
    opsconfigmonitoring.googleapis.com Obligatoire pour utiliser l'interface utilisateur des services pour les clusters hors Google Cloud. Non
    connectgateway.googleapis.com Obligatoire pour que le plan de contrôle Cloud Service Mesh géré puisse accéder aux charges de travail du réseau maillé. Oui*
    trafficdirector.googleapis.com Active un plan de contrôle géré hautement disponible et évolutif. Oui*
    networkservices.googleapis.com Active un plan de contrôle géré hautement disponible et évolutif. Oui*
    networksecurity.googleapis.com Active un plan de contrôle géré hautement disponible et évolutif. Oui*

Terraform

gcloud config set project PROJECT_ID
GOOGLE_CLOUD_PROJECT=$(gcloud config get-value project)
export GOOGLE_CLOUD_PROJECT

Créer un cluster GKE

Créer un cluster GKE en mode Autopilot

gcloud

  1. Créez un cluster enregistré en tant que membre d'un parc :

    gcloud container clusters create-auto asm-cluster \
        --location="us-central1" \
        --enable-fleet
    
  2. Vérifiez que le cluster est enregistré auprès du parc :

    gcloud container fleet memberships list
    

    Le résultat ressemble à ce qui suit :

    NAME: asm-cluster
    EXTERNAL_ID: 
    LOCATION: us-central1
    

    Notez le nom d'appartenance, car vous en aurez besoin pour configurer Cloud Service Mesh.

Terraform

Pour créer un cluster GKE, vous pouvez utiliser la ressource google_container_cluster. Vous définissez le bloc fleet afin que le cluster soit ajouté à un parc lors de sa création.

resource "google_container_cluster" "cluster" {
  name                = "asm-cluster"
  location            = var.region
  deletion_protection = false # Warning: Do not set deletion_protection to false for production clusters

  enable_autopilot = true
  fleet {
    project = data.google_project.project.name
  }
}

data "google_project" "project" {}

Pour savoir comment appliquer ou supprimer une configuration Terraform, consultez la page Commandes Terraform de base.

Provisionner Cloud Service Mesh géré

Vous provisionnez Cloud Service Mesh géré à l'aide de la fonctionnalité servicemesh sur l'appartenance à un parc pour votre cluster.

gcloud

  1. Activez la fonctionnalité de parc Cloud Service Mesh sur le projet :

    gcloud container fleet mesh enable
    
  2. Activez la gestion automatique du réseau maillé :

    gcloud container fleet mesh update \
        --management=automatic \
        --memberships=MEMBERSHIP_NAME \
        --location=us-central1
    

    Remplacez MEMBERSHIP_NAME par le nom d'appartenance répertorié après avoir vérifié que votre cluster est enregistré dans le parc.

Terraform

Pour activer l'API de réseau maillé, vous pouvez utiliser la ressource google_project_service.

Vous utilisez les ressources google_gke_hub_feature et google_gke_hub_feature_membership pour configurer Cloud Service Mesh géré sur votre cluster.

resource "google_project_service" "mesh_api" {
  service = "mesh.googleapis.com"

  disable_dependent_services = true
}

resource "google_gke_hub_feature" "feature" {
  name     = "servicemesh"
  location = "global"

  depends_on = [
    google_project_service.mesh_api
  ]
}

resource "google_gke_hub_feature_membership" "feature_member" {
  location   = "global"
  feature    = google_gke_hub_feature.feature.name
  membership = google_container_cluster.cluster.fleet.0.membership
  membership_location = google_container_cluster.cluster.location
  mesh {
    management = "MANAGEMENT_AUTOMATIC"
  }
}

Pour savoir comment appliquer ou supprimer une configuration Terraform, consultez la page Commandes Terraform de base.

Vérifier que le plan de contrôle est actif

Attendez que la valeur de controlPlaneManagement.state soit ACTIVE. Cela peut prendre jusqu'à 15 minutes.

watch -n 30 gcloud container fleet mesh describe

Le résultat est semblable à :

membershipSpecs:
  projects/746296320118/locations/us-central1/memberships/asm-cluster:
    mesh:
      management: MANAGEMENT_AUTOMATIC
membershipStates:
  projects/746296320118/locations/us-central1/memberships/asm-cluster:
    servicemesh:
      controlPlaneManagement:
        details:
        - code: REVISION_READY
          details: 'Ready: asm-managed'
        state: ACTIVE
      dataPlaneManagement:
        details:
        - code: PROVISIONING
          details: Service is provisioning.
        state: PROVISIONING
    state:
      code: OK
      description: 'Revision(s) ready for use: asm-managed.'

La section dataPlaneManagement reste à l'état PROVISIONING jusqu'à ce que vous déployiez la passerelle d'entrée, car les clusters Autopilot ne provisionnent aucun nœud tant que vous n'avez pas déployé une charge de travail.

Déployer une passerelle d'entrée de réseau maillé

Dans cette section, vous allez déployer une passerelle d'entrée de réseau maillé pour gérer le trafic entrant pour l'exemple d'application. Une passerelle d'entrée est un équilibreur de charge qui fonctionne à la périphérie du réseau maillé et reçoit des connexions HTTP/TCP entrantes ou sortantes.

Vous déployez la passerelle dans un espace de noms dédié et attribuez un libellé au déploiement pour vous assurer que votre passerelle peut être gérée de manière sécurisée et automatiquement mise à niveau par le plan de contrôle de Cloud Service Mesh.

  1. Téléchargez les identifiants afin de pouvoir accéder au cluster :

    gcloud container clusters get-credentials asm-cluster --location=us-central1
    
  2. Créez un espace de noms pour la passerelle :

    kubectl create namespace bank-gateways
    
  3. Ajoutez un libellé à l'espace de noms afin que le plan de contrôle de Cloud Service Mesh injecte automatiquement la configuration de passerelle dans le déploiement.

    kubectl label namespace bank-gateways istio-injection=enabled
    
  4. Déployez la passerelle d'entrée dans l'espace de noms :

    Helm

    helm repo add istio https://istio-release.storage.googleapis.com/charts
    helm repo update
    helm install --wait --namespace bank-gateways \
        --set resources.requests.cpu=250m \
        --set resources.requests.memory=512Mi \
        --set resources.requests.ephemeral-storage=1Gi \
        --set resources.limits.cpu=250m \
        --set resources.limits.memory=512Mi \
        --set resources.limits.ephemeral-storage=1Gi \
        istio-ingressgateway istio/gateway
    

    kubectl

    kubectl apply -n bank-gateways \
        -k https://github.com/GoogleCloudPlatform/anthos-service-mesh-packages/tree/main/samples/gateways/istio-ingressgateway
    kubectl -n bank-gateway wait "deployment/istio-ingressgateway"  \
        --for=condition=available --timeout=240s
    

    Veillez à définir des demandes de ressources adéquates lorsque vous effectuez un déploiement dans un environnement de production. GKE Autopilot ne prend en compte que les valeurs de ressources définies dans requests et non dans limits. Le projet Istio publie des informations sur les performances et l'évolutivité.

Déployer l'exemple d'application

  1. Créez un espace de noms Kubernetes pour le déploiement :

    kubectl create namespace bank-sample
    
  2. Ajoutez un libellé à l'espace de noms afin que Cloud Service Mesh injecte automatiquement des proxys side-car dans les exemples de pods :

    kubectl label namespace bank-sample istio-injection=enabled
    
  3. Déployez l'exemple d'application :

    git clone https://github.com/GoogleCloudPlatform/bank-of-anthos.git
    kubectl apply -n bank-sample -f bank-of-anthos/extras/jwt/jwt-secret.yaml
    kubectl apply -n bank-sample -f bank-of-anthos/kubernetes-manifests/
    
  4. Attendez que l'application soit prête. L'opération prend quelques minutes.

    watch kubectl -n bank-sample get pods
    

    Une fois l'application prête, le résultat ressemble à ce qui suit :

    NAME                                 READY   STATUS    RESTARTS   AGE
    accounts-db-0                        2/2     Running   0          2m16s
    balancereader-5c695f78f5-x4wlz       2/2     Running   0          3m8s
    contacts-557fc79c5-5d7fg             2/2     Running   0          3m7s
    frontend-7dd589c5d7-b4cgq            2/2     Running   0          3m7s
    ledger-db-0                          2/2     Running   0          3m6s
    ledgerwriter-6497f5cf9b-25c6x        2/2     Running   0          3m5s
    loadgenerator-57f6896fd6-lx5df       2/2     Running   0          3m5s
    transactionhistory-6c498965f-tl2sk   2/2     Running   0          3m4s
    userservice-95f44b65b-mlk2p          2/2     Running   0          3m4s
    
  5. Créez les ressources Istio Gateway et VirtualService pour exposer l'application derrière la passerelle d'entrée :

    kubectl apply -n bank-sample -f bank-of-anthos/extras/istio/frontend-ingress.yaml
    
  6. Obtenez un lien vers l'exemple d'application :

    INGRESS_HOST=$(kubectl -n bank-gateways get service istio-ingressgateway \
        -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
    echo "http://$INGRESS_HOST"
    
  7. Dans un navigateur, suivez le lien pour ouvrir l'exemple d'application. Connectez-vous avec le nom d'utilisateur et le mot de passe par défaut pour afficher l'application.

Appliquer le protocole TLS mutuel

Assurez-vous que le mode TLS mutuel (mTLS) STRICT est activé. Appliquez une règle PeerAuthentication par défaut pour le réseau maillé dans l'espace de noms istio-system.

  1. Enregistrez le manifeste suivant sous le nom mesh-peer-authn.yaml :

    apiVersion: "security.istio.io/v1beta1"
    kind: "PeerAuthentication"
    metadata:
      name: "default"
      namespace: "istio-system"
    spec:
      mtls:
        mode: STRICT
    
  2. Appliquez le fichier manifeste au cluster :

    kubectl apply -f mesh-peer-authn.yaml
    

Vous pouvez remplacer cette configuration en créant des ressources PeerAuthentication dans des espaces de noms spécifiques.

Explorer les tableaux de bord Cloud Service Mesh

  1. Dans la console Google Cloud, accédez à Cloud Service Mesh pour afficher les tableaux de bord de votre réseau maillé :

    Accéder à Cloud Service Mesh

  2. Sélectionnez le projet dans la liste déroulante de la barre de menu.

    Vous voyez un tableau récapitulatif contenant tous les microservices de votre réseau maillé ainsi qu'une visualisation graphique des connexions entre les microservices. Pour chaque microservice, le tableau présente trois des signaux clés d'ingénierie SRE :

    • Trafic - requêtes par seconde
    • Taux d'erreur - un pourcentage
    • Latence - millisecondes

    Elles sont basées sur le trafic réel traité par les microservices. Le trafic de test constant est automatiquement envoyé au service frontend par un client loadgenerator déployé dans le cadre de l'exemple d'application. Cloud Service Mesh envoie automatiquement des métriques, des journaux et (éventuellement) des traces à Google Cloud Observability.

  3. Cliquez sur le service frontend dans le tableau pour afficher un tableau de bord de présentation du service. Des métriques supplémentaires s'affichent pour le service, ainsi qu'une visualisation des connexions entrantes et sortantes. Vous pouvez également créer un objet de niveau de service (SLO) pour la surveillance et les alertes sur le service.

Vérifier que mTLS est activé

Cliquez sur le lien de sécurité dans le panneau pour afficher une présentation de la sécurité du service frontend. Le tableau et la visualisation affichent une icône en forme de cadenas vert pour chacune des connexions entrantes et sortantes entre les microservices. Cette icône indique que la connexion utilise mTLS pour l'authentification et le chiffrement.

Effectuer un nettoyage

Pour éviter que les ressources utilisées lors de ce tutoriel soient facturées sur votre compte Google Cloud, supprimez le projet contenant les ressources, ou conservez le projet et supprimez les ressources individuelles.

Pour éviter que les ressources utilisées dans ce tutoriel soient facturées sur votre compte Google Cloud, procédez comme suit :

Supprimer le projet

    Delete a Google Cloud project:

    gcloud projects delete PROJECT_ID

Supprimer les ressources individuelles

Si vous avez utilisé un projet existant et que vous ne souhaitez pas le supprimer, supprimez les ressources individuelles.

gcloud

  1. Supprimez l'exemple d'application et les passerelles :

    kubectl delete namespace bank-sample
    kubectl delete namespace bank-gateways
    
  2. Suivez les instructions pour désinstaller Cloud Service Mesh.

  3. Supprimez le cluster GKE :

    gcloud container clusters delete --region us-central1 asm-cluster --quiet
    

Terraform

Supprimez les ressources que vous avez créées avec Terraform :

  terraform destroy

Étape suivante