Migrer d'Istio 1.11 ou d'une version ultérieure vers Cloud Service Mesh

Ce tutoriel explique comment migrer une application Cluster Google Kubernetes Engine (GKE) utilisant Istio vers un nouveau cluster utilisant des ressources Cloud Service Mesh : le maillage de services entièrement géré et conforme à Istio de Google.

Dans ce tutoriel, vous allez :

  1. Créez un cluster Google Kubernetes Engine, puis installez Istio et la passerelle d'entrée Istio sur le cluster. Ce cluster servira de cluster existant à partir duquel vous souhaitez migrer.
  2. Déployez l'exemple d'application Boutique en ligne sur le cluster avec Istio.
  3. Créer un autre cluster Google Kubernetes Engine dans le même projet Google Cloud
  4. Activez le service géré Cloud Service Mesh sur le deuxième cluster et déployez le Passerelle d'entrée Cloud Service Mesh.
  5. Déployez Online Boutique sur le cluster à l'aide de Cloud Service Mesh pour répliquer le à partir du cluster avec Istio.
  6. Déplacez 50 % du trafic utilisateur du cluster avec Istio vers le cluster avec Cloud Service Mesh, en utilisant les fonctionnalités de fractionnement du trafic d'Istio sur le cluster avec Istio.
  7. Finalisez la migration d'Istio vers Cloud Service Mesh en pointant le domaine l'entrée du système de noms (DNS) du cluster avec Istio sur le cluster avec Cloud Service Mesh.

Le trafic utilisateur est réparti à 50/50 entre un cluster avec Istio et un cluster avec Cloud Service Mesh. Chaque cluster contient son propre déploiement
Boutique.

Déploiement Canary

Le "déploiement Canary" est une technique utilisée dans le développement logiciel pour tester une nouvelle version d'un logiciel avant de la publier pour tous les utilisateurs. Il consiste à augmenter progressivement le pourcentage de trafic envoyé à la nouvelle version. Dans ce tutoriel, vous allez configurer un nouveau cluster avec Cloud Service Mesh et y transférer progressivement le trafic utilisateur. Vous commencerez par rediriger 0 % du trafic utilisateur vers le nouveau cluster, puis 50 %, et enfin 100 %. En production, vous devez utiliser des incréments plus petits et plus importants. Si, à un moment donné, notez que le nouveau cluster est incapable de gérer un pourcentage de trafic, vous pouvez effectuer un rollback en réduisant le pourcentage à 0%.

Plan de contrôle Canary par rapport au cluster Canary

Il existe deux stratégies couramment utilisées pour migrer d'Istio vers Cloud Service Mesh géré:

  • Migration du plan de contrôle Canary : dans cette stratégie, vous provisionnez Cloud Service Mesh géré sur le même cluster que celui sur lequel Istio est installé.
  • Migration de cluster Canary: dans cette stratégie, vous créez un cluster et puis de provisionner Cloud Service Mesh géré sur celui-ci.

Dans ce tutoriel, vous allez découvrir la stratégie de migration des clusters Canary.

Coûts

Ce tutoriel utilise les composants facturables suivants de Google Cloud :

Une fois que vous aurez terminé ce tutoriel, évitez de 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

  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. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

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

  4. Enable the required APIs.

    Enable the APIs

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

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

  7. Enable the required APIs.

    Enable the APIs

Lancer Cloud Shell

Dans ce tutoriel, vous allez utiliser Cloud Shell, un shell hébergé sur Google Cloud qui vous permet de gérer aux ressources Google Cloud.

Cloud Shell est préinstallé avec les outils de ligne de commande Google Cloud CLI, kubectl et istioctl. La CLI gcloud fournit la CLI principale pour Google Cloud.

Ouvrez une session Cloud Shell en haut à droite page, cliquez sur , puis sur Confirmer. Une session Cloud Shell s'ouvre dans un cadre situé en bas de la page. Exécutez les commandes suivantes dans cette session Cloud Shell.

Télécharger l'exemple de code

Clonez les dépôts Git contenant les ressources Kubernetes et Istio que vous utiliserez :

  git clone https://github.com/GoogleCloudPlatform/anthos-service-mesh-samples.git
  git clone https://github.com/GoogleCloudPlatform/microservices-demo.git

Configurer le cluster avec Istio

Créer le cluster et installer Istio

Dans cette section, vous allez créer un cluster qui utilise Istio. En pratique, il s'agit du ou des clusters que vous utilisez déjà.

  1. Remplacez PROJECT_ID par votre ID du projet et créez un Nouveau cluster:

    gcloud container clusters create cluster-with-istio \
      --project=PROJECT_ID \
      --zone=us-central1-a \
      --machine-type=e2-standard-2 --num-nodes=3
    
  2. Renommez le contexte du cluster pour qu'il soit plus facile à utiliser:

    kubectl config rename-context \
      gke_PROJECT_ID_us-central1-a_cluster-with-istio \
      cluster-with-istio
    
  3. Vérifiez que le contexte du cluster a été renommé:

    kubectl config get-contexts --output="name"
    
  4. Installez Istio sur le cluster. Par souci de simplicité, vous allez installer le profil par défaut d'Istio et la version correspondant à votre installation istioctl.

    istioctl install
    

    Vous êtes invité à saisir "y". puis appuyez sur Entrée.

    Le résultat est semblable à :

    This will install the Istio X.Y.Z default profile with ["Istio core" "Istiod" "Ingress gateways"] components into the cluster. Proceed? (y/N)
    ✔ Istio core installed
    ✔ Istiod installed
    ✔ Ingress gateways installed
    ✔ Installation complete
    Making this installation the default for injection and validation.
    

Déployer Online Boutique

  1. Vous allez déployer la boutique en ligne dans un espace de noms distinct appelé onlineboutique. Créez l'espace de noms :

    kubectl \
      --context cluster-with-istio \
      create namespace onlineboutique
    
  2. Déployez les 12 services d'Online Boutique, dont un générateur de charge imite le trafic utilisateur:

    kubectl \
      --namespace=onlineboutique \
      --context=cluster-with-istio \
      apply -f microservices-demo/release/kubernetes-manifests.yaml
    
  3. L'étape précédente a également déployé un service appelé frontend-external (de type LoadBalancer) auquel une adresse IP externe est attribuée. Cependant, vous autoriser uniquement l'entrée publique via la passerelle d'entrée Istio le déploiement. Supprimez la ressource de service frontend-external :

    kubectl \
      --namespace=onlineboutique \
      --context=cluster-with-istio \
      delete service frontend-external
    
  4. Déployer une ressource Istio Gateway et une ressource Istio VirtualService pour que le trafic public accède à Online Boutique:

    kubectl \
      --namespace=onlineboutique \
      --context=cluster-with-istio \
      apply -f microservices-demo/istio-manifests/frontend-gateway.yaml
    
  5. Récupérez l'adresse IP externe de la passerelle d'entrée Istio :

    kubectl \
      --namespace istio-system \
      --context=cluster-with-istio \
      get service --output jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}'
    
  6. Copiez l'adresse IP externe du service istio-ingressgateway, puis y accéder via votre navigateur Web. L'exemple d'application Online Boutique s'affiche.

Configurer le nouveau cluster avec le service géré Cloud Service Mesh

Créer le cluster et provisionner Cloud Service Mesh géré

Dans cette section, vous allez créer le cluster vers lequel vous allez migrer. Vous : provisionner Cloud Service Mesh géré et déployer Online Boutique répliquer les déploiements depuis le cluster qui utilise Istio.

  1. Créez un cluster :

    gcloud container clusters create cluster-with-csm \
      --project=PROJECT_ID --zone=us-central1-a \
      --machine-type=e2-standard-4 --num-nodes=2 \
      --workload-pool PROJECT_ID.svc.id.goog
    
  2. Renommez le contexte du cluster pour qu'il soit plus facile à utiliser:

    kubectl config rename-context \
      gke_PROJECT_ID_us-central1-a_cluster-with-csm \
      cluster-with-csm
    
  3. Vérifiez que le contexte du cluster a été renommé:

    kubectl config get-contexts --output="name"
    
  4. Activez Cloud Service Mesh sur le parc de votre projet. A fleet est un opérateur logique regroupement de clusters Kubernetes et d'autres ressources pouvant être gérées ensemble.

    gcloud container fleet mesh enable --project PROJECT_ID
    

    Le résultat est semblable à :

    Waiting for Feature Service Mesh to be created...done.
    
  5. Enregistrez le cluster dans le parc du projet :

    gcloud container fleet memberships register cluster-with-csm-membership \
      --gke-cluster=us-central1-a/cluster-with-csm \
      --enable-workload-identity \
      --project PROJECT_ID
    

    Le résultat est semblable à :

    Waiting for membership to be created...done.
    Finished registering to the Fleet.
    
  6. Activez Cloud Service Mesh géré sur le cluster :

    gcloud container fleet mesh update \
      --management automatic \
      --memberships cluster-with-csm-membership \
      --project PROJECT_ID
    

    Le résultat est semblable à :

    Waiting for Feature Service Mesh to be updated...done.
    
  7. Vérifiez que Cloud Service Mesh géré a été provisionné pour le cluster et qu'il est prêt à être utilisé :

    gcloud container fleet mesh describe --project PROJECT_ID
    

    Le provisionnement et le déploiement de Cloud Service Mesh prêts à être utilisés sur le cluster. Si controlPlaneManagement.state: DISABLED ou controlPlaneManagement.state: PROVISIONING s'affiche, vous devez relancer la commande précédente toutes les deux ou trois minutes jusqu'à ce que controlPlaneManagement.state: ACTIVE s'affiche.

    Le résultat est semblable à :

    createTime: '2022-07-06T01:05:39.110120474Z'
    membershipSpecs:
      projects/123456789123/locations/global/memberships/cluster-with-csm-membership:
        mesh:
          management: MANAGEMENT_AUTOMATIC
    membershipStates:
      projects/123456789123/locations/global/memberships/cluster-with-csm-membership:
        servicemesh:
          controlPlaneManagement:
            details:
            - code: REVISION_READY
              details: 'Ready: asm-managed'
            state: ACTIVE
          dataPlaneManagement:
            details:
            - code: OK
              details: Service is running.
            state: ACTIVE
        state:
          code: OK
          description: 'Revision(s) ready for use: asm-managed.'
          updateTime: '2022-07-06T01:19:24.243993678Z'
    name: projects/your-project-id/locations/global/features/servicemesh
    resourceState:
      state: ACTIVE
    spec: {}
    state:
      state: {}
    updateTime: '2022-07-06T01:19:27.475885687Z'
    

Déployer la passerelle d'entrée de Cloud Service Mesh

  1. Vous allez déployer la passerelle d'entrée de Cloud Service Mesh dans espace de noms appelé asm-ingress. Créez l'espace de noms:

    kubectl \
      --context cluster-with-csm \
      create namespace asm-ingress
    
  2. Utilisez le libellé istio.io/rev=asm-managed pour ajouter l'espace de noms asm-ingress au service mesh et activer l'injection automatique de proxys side-car.

    kubectl \
      --context cluster-with-csm \
      label namespace asm-ingress 'istio.io/rev=asm-managed'
    
  3. Déployer le maillage de services Cloud passerelle d'entrée:

    kubectl \
      --context cluster-with-csm \
      --namespace=asm-ingress \
      apply -f anthos-service-mesh-samples/docs/shared/asm-ingress-gateway/asm-gateway-deployment-svc.yaml
    kubectl \
      --context cluster-with-csm \
      --namespace=asm-ingress \
      apply -f anthos-service-mesh-samples/docs/shared/asm-ingress-gateway/gateway.yaml
    

    Le résultat est semblable à :

    namespace/asm-ingress configured
    serviceaccount/asm-ingressgateway configured
    service/asm-ingressgateway configured
    deployment.apps/asm-ingressgateway configured
    gateway.networking.istio.io/asm-ingressgateway configured
    

Déployer Online Boutique

  1. Vous allez déployer Online Boutique dans un espace de noms distinct appelé onlineboutique Créez l'espace de noms :

    kubectl \
      --context cluster-with-csm \
      create namespace onlineboutique
    
  2. Utilisez le libellé istio.io/rev=asm-managed pour ajouter l'espace de noms onlineboutique au service mesh et activer l'injection automatique de proxys side-car.

    kubectl \
      --context cluster-with-csm \
      label namespace onlineboutique 'istio.io/rev=asm-managed'
    
  3. Déployez les 12 services d'Online Boutique, y compris le générateur de charge qui imite le trafic utilisateur :

    kubectl \
      --context cluster-with-csm \
      --namespace=onlineboutique \
      apply -f anthos-service-mesh-samples/docs/shared/online-boutique/kubernetes-manifests.yaml
    kubectl \
      --context cluster-with-csm \
      --namespace=onlineboutique \
      apply -f anthos-service-mesh-samples/docs/shared/online-boutique/virtual-service.yaml
    
  4. Récupérez l'adresse IP externe de la passerelle d'entrée de Cloud Service Mesh :

    kubectl \
      --context cluster-with-csm \
      --namespace asm-ingress \
      get service --output jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}'
    
  5. Copiez l'adresse IP externe du service asm-ingressgateway et accédez via votre navigateur Web. L'application exemple Online Boutique s'affiche. Dans la section suivante, vous utiliserez l'adresse IP externe. Copiez-la donc d'variable d'environnement:

    export INGRESS_IP_OF_CLUSTER_WITH_MANAGED_ASM=$( \
      kubectl \
        --context cluster-with-csm \
        --namespace asm-ingress \
        get service --output jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}' \
      )
    

Tester le cluster avec Cloud Service Mesh à l'aide d'un déploiement Canary

Dans cette section, vous configurez le cluster avec Istio de sorte que 50 % du trafic utilisateur vers Online Boutique soit transféré vers l'instance d'Online Boutique sur le cluster avec Cloud Service Mesh géré. Pour ce faire, vous déployez deux ressources Istio vers le cluster avec Istio:

  • Une entrée ServiceEntry pour indiquer à Istio le maillage de services Cloud géré point de terminaison Boutique en ligne du cluster
  • un VirtualService pour indiquer à la passerelle d'entrée Istio de diviser le trafic en 50/50.
  1. Définir l'adresse IP de la passerelle d'entrée du cluster Cloud Service Mesh géré dans la ressource ServiceEntry:

    sed -i "s/1.2.3.4/${INGRESS_IP_OF_CLUSTER_WITH_MANAGED_ASM}/" anthos-service-mesh-samples/docs/migrate-to-managed-asm/service-entry.yaml
    
  2. Déployez ServiceEntry sur le cluster avec Istio:

    kubectl \
      --context cluster-with-istio \
      --namespace onlineboutique \
      apply -f anthos-service-mesh-samples/docs/migrate-to-managed-asm/service-entry.yaml
    
  3. Déployez VirtualService sur le cluster avec Istio :

    kubectl \
      --context cluster-with-istio \
      --namespace onlineboutique \
      apply -f anthos-service-mesh-samples/docs/migrate-to-managed-asm/virtual-service.yaml
    
  4. Accédez à l'adresse IP de la passerelle d'entrée du cluster avec Istio, dans votre navigateur Web:

    kubectl \
      --context cluster-with-istio \
      --namespace istio-system \
      get service
    

    Actualisez plusieurs fois la page d'accueil de la boutique en ligne et vérifiez le pied de page de la page à chaque fois. Notez que 50 % des requêtes sont gérées par un pod sur le cluster avec Cloud Service Mesh géré.

Migrer vers le cluster avec Cloud Service Mesh géré

Dans cette section, nous partons du principe que vous êtes propriétaire d'un nom de domaine et que vous avez accès à son (Domain Name Server).

  1. Ajoutez un enregistrement A aux paramètres DNS pour pointer le nom de domaine (tel que example.com) à l'adresse IP de la passerelle d'entrée exécutée sur le cluster avec Istio.

  2. Accédez à la Boutique en ligne en saisissant le nom de domaine dans votre navigateur Web.

  3. Réduisez la valeur TTL (Time To Live) de l'enregistrement DNS pour pouvoir rétablir rapidement la valeur une entrée DNS si vous devez effectuer un rollback.

  4. Définissez l'enregistrement A de votre nom de domaine sur l'adresse IP externe de la passerelle d'entrée du cluster avec Cloud Service Mesh géré.

  5. Une fois la migration terminée, supprimez le cluster avec Istio :

    gcloud container clusters delete cluster-with-istio \
      --zone=us-central1-a \
      --project=PROJECT_ID
    

Effectuer un nettoyage

Pour éviter que les ressources utilisées dans le cadre 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.

Supprimer le projet

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Supprimer les ressources

Supprimez le cluster avec Cloud Service Mesh géré :

  gcloud container clusters delete cluster-with-managed-asm \
    --zone=us-central1-a \
    --project=PROJECT_ID

Étape suivante