Migrer un plan de contrôle intégré vers un plan de contrôle géré sur un nouveau cluster

Ce tutoriel explique comment migrer une application depuis un cluster Google Kubernetes Engine (GKE) utilisant Cloud Service Mesh dans le cluster vers un nouveau cluster utilisant Cloud Service Mesh géré, le maillage de services entièrement géré et compatible avec Istio de Google.

Dans ce tutoriel, vous allez :

  1. Créez un cluster Google Kubernetes Engine, puis installez Cloud Service Mesh intégré au cluster et la passerelle d'entrée Cloud Service Mesh sur le cluster. Ce cluster servira de cluster existant à partir duquel vous souhaitez migrer.
  2. Déployez l'exemple d'application Online Boutique sur le cluster avec Cloud Service Mesh intégré.
  3. Créez un autre cluster Google Kubernetes Engine dans le même projet Google Cloud .
  4. Provisionnez Cloud Service Mesh géré sur le deuxième cluster et déployez la passerelle d'entrée Cloud Service Mesh.
  5. Déployez Online Boutique sur le cluster avec Cloud Service Mesh géré pour répliquer le déploiement à partir du cluster avec Cloud Service Mesh intégré au cluster.
  6. Transférez 50 % du trafic utilisateur du cluster avec Cloud Service Mesh dans le cluster vers celui avec Cloud Service Mesh géré, en utilisant les fonctionnalités de répartition du trafic d'Istio sur le cluster avec Cloud Service Mesh dans le cluster.
  7. Pour finaliser la migration de Cloud Service Mesh dans le cluster vers Cloud Service Mesh géré, pointez l'entrée DNS (Domain Name System) du cluster avec Cloud Service Mesh dans le cluster vers le cluster avec Cloud Service Mesh géré.

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

Déploiement Canary

Le "déploiement Canary" est une technique utilisée dans le développement de logiciels pour tester une nouvelle version d'un logiciel avant de la publier pour tous les utilisateurs. Il s'agit d'augmenter progressivement le pourcentage de trafic envoyé à la nouvelle version. Dans ce tutoriel, vous allez configurer un cluster avec Cloud Service Mesh géré 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 nombreux. Si, à un moment donné, vous constatez que le nouveau cluster n'est pas en mesure de gérer un pourcentage de trafic, vous pouvez effectuer un rollback en réduisant le pourcentage à 0 %.

Plan de contrôle Canary et cluster Canary

Il existe deux stratégies couramment utilisées pour migrer de Cloud Service Mesh intégré au cluster 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 Cloud Service Mesh intégré au cluster est installé.
  • Migration dans un cluster Canary : dans cette stratégie, vous créez un cluster, puis vous provisionnez Cloud Service Mesh géré dessus.

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

  8. Lancer Cloud Shell

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

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

    Ouvrez une session Cloud Shell. Pour ce faire, en haut à droite de cette 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 Cloud Service Mesh intégré

    Créer le cluster et installer Cloud Service Mesh intégré au cluster

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

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

      gcloud container clusters create cluster-with-in-cluster-asm \
        --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 faciliter son utilisation :

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

      kubectl config get-contexts --output="name"
      
    4. Téléchargez la version qui installe Cloud Service Mesh 1.25.3 dans le répertoire de travail actuel :

      curl https://storage.googleapis.com/csm-artifacts/asm/asmcli_1.25 > asmcli
      

      Vous serez invité à saisir "y", puis à appuyer sur Entrée.

      Le résultat est semblable à :

      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                    Dload  Upload   Total   Spent    Left  Speed
      100  167k  100  167k    0     0   701k      0 --:--:-- --:--:-- --:--:--  701k
      
    5. Rendez le script asmcli exécutable :

      chmod +x asmcli
      
    6. Installez Cloud Service Mesh intégré au cluster à l'aide de asmcli :

      ./asmcli install \
        --project_id PROJECT_ID \
        --cluster_name cluster-with-in-cluster-asm \
        --cluster_location us-central1-a \
        --output_dir . \
        --enable_all \
        --ca mesh_ca
      

      L'exécution de l'outil asmcli peut prendre plusieurs minutes. L'outil génère des messages d'information pour que vous puissiez suivre sa progression.

      En cas de réussite, le résultat est semblable à ce qui suit :

      ...
      asmcli: Successfully installed ASM.
      

    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 un espace de noms distinct appelé asm-ingress. Créez l'espace de noms :

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

      kubectl \
        --context cluster-with-in-cluster-asm \
        label --overwrite namespace asm-ingress istio.io/rev=asm-1253-8
      

      Le résultat est semblable à :

      namespace/asm-ingress labeled
      
      .
    3. Déployez la passerelle d'entrée Cloud Service Mesh :

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

      Le résultat est semblable à :

      serviceaccount/asm-ingressgateway created
      service/asm-ingressgateway created
      deployment.apps/asm-ingressgateway created
      gateway.networking.istio.io/asm-ingressgateway created
      

    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-in-cluster-asm \
        create namespace onlineboutique
      
    2. Utilisez le libellé istio.io/rev=asm-1253-8 pour ajouter l'espace de noms onlineboutique au service mesh et activer l'injection automatique du proxy side-car.

      kubectl \
        --context cluster-with-in-cluster-asm \
        label --overwrite namespace onlineboutique istio.io/rev=asm-1253-8
      

      Le résultat est semblable à :

      namespace/onlineboutique labeled
      
    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-in-cluster-asm \
        --namespace=onlineboutique \
        apply -f anthos-service-mesh-samples/docs/shared/online-boutique/kubernetes-manifests.yaml
      kubectl \
        --context cluster-with-in-cluster-asm \
        --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 Cloud Service Mesh :

      kubectl \
        --context cluster-with-in-cluster-asm \
        --namespace asm-ingress \
        get service --output jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}'
      
    5. Copiez l'adresse IP externe de la passerelle d'entrée et accédez-y via votre navigateur Web. L'exemple d'application Online Boutique s'affiche.

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

    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 allez provisionner Cloud Service Mesh géré et déployer Online Boutique afin de répliquer les déploiements à partir du cluster qui utilise Cloud Service Mesh intégré au cluster.

    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 faciliter son utilisation :

      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. Un parc est un regroupement logique de clusters Kubernetes et d'autres ressources qui peuvent être gérés 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
      

      Il peut s'écouler environ 10 minutes avant que Cloud Service Mesh ne soit provisionné et prêt à être utilisé 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 un espace de noms distinct 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 proxy side-car.

      kubectl \
        --context cluster-with-csm \
        label namespace asm-ingress 'istio.io/rev=asm-managed'
      
    3. Déployez la passerelle d'entrée Cloud Service Mesh :

      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 du proxy 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 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, puis accédez-y via votre navigateur Web. L'exemple d'application Boutique en ligne s'affiche. Vous utiliserez l'adresse IP externe dans la section suivante. Copiez-la donc dans une 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 Cloud Service Mesh intégré au cluster de sorte que 50 % du trafic utilisateur vers Online Boutique soit redirigé vers l'instance d'Online Boutique sur le cluster avec Cloud Service Mesh géré. Pour ce faire, vous déployez deux ressources Istio dans le cluster avec Cloud Service Mesh intégré au cluster :

    • une entrée de service pour informer Cloud Service Mesh intégré au cluster du point de terminaison Online Boutique du cluster Cloud Service Mesh géré.
    • un VirtualService pour indiquer à la passerelle d'entrée Cloud Service Mesh du cluster de répartir le trafic à 50/50.
    1. Définissez 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 Cloud Service Mesh intégré :

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

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

      kubectl \
        --context cluster-with-in-cluster-asm \
        --namespace asm-ingress \
        get service
      

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

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

    Cette section suppose que vous possédez un nom de domaine et que vous avez accès à ses paramètres DNS (Domain Name Server).

    1. Ajoutez un enregistrement A aux paramètres DNS pour faire pointer le nom de domaine (par exemple, example.com) vers l'adresse IP de la passerelle d'entrée exécutée sur le cluster avec Cloud Service Mesh dans le cluster.

    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) des enregistrements DNS pour vous assurer de pouvoir rétablir rapidement l'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 réussie, supprimez le cluster avec Cloud Service Mesh dans le cluster :

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

    Effectuer un nettoyage

    Pour éviter que les ressources utilisées dans ce tutoriel ne 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
    

    Étapes suivantes