Utiliser Istio avec Google Compute Engine

Istio est un framework Open Source qui permet de connecter, surveiller et sécuriser des microservices. Grâce à lui, vous pouvez créer un réseau, ou maillage, de services déployés dotés d'un équilibrage de charge, d'une authentification de service à service, d'une surveillance, et bien plus, sans avoir à modifier le code des services. Pour rendre des services compatibles avec Istio, vous devez déployer Envoy, un proxy side-car spécial, sur chaque pod de votre application. Le proxy Envoy intercepte toutes les communications réseau entre les microservices. Vous pouvez le configurer et le gérer à l'aide du plan de contrôle d'Istio.

À l'heure actuelle, le plan de contrôle d'Istio ne peut être installé que sur des mises en œuvre Kubernetes, telles que Google Kubernetes Engine (GKE). Toutefois, sa fonctionnalité d'extension de maillage vous permet d'ajouter des services fonctionnant sur des plates-formes autres que Kubernetes au maillage, y compris des services s'exécutant sur des VM Compute Engine. Cela vous permet de contrôler les services de machine virtuelle (VM) et Kubernetes au sein d'un seul maillage. Ce tutoriel décrit comment configurer Istio pour qu'il utilise l'extension de maillage, et comment configurer des instances de VM Compute Engine de façon à les ajouter à un maillage Istio. Nous partons du principe que vous disposez déjà d'une installation Istio sur GKE.

Pour plus d'informations sur Istio et sur son fonctionnement, consultez le site istio.io. Pour en savoir plus sur la configuration de l'extension de maillage utilisée dans ce tutoriel, consultez la section Fonctionnement. Cette étape n'est toutefois pas nécessaire pour effectuer ce tutoriel.

Objectifs

  • Mettre à jour une installation Istio existante sur GKE afin d'utiliser l'extension de maillage
  • Configurer des instances de VM Compute Engine pour les ajouter à un maillage de services Istio
  • Exécuter un service maillé Istio sur une instance de VM Compute Engine

Coûts

Ce tutoriel utilise des composants facturables de Google Cloud Platform, y compris Compute Engine.

Les nouveaux utilisateurs de GCP peuvent bénéficier d'un essai gratuit.

Avant de commencer

  • Vous devez disposer d'une installation Istio existante sur GKE. Pour en savoir plus, consultez la page Installer Istio sur un cluster GKE.
  • L'exemple d'application BookInfo doit être installé et en cours d'exécution, comme décrit sur la page Installer Istio sur un cluster GKE. PATH doit également contenir istioctl.
  • Vous devez disposer d'un quota d'adresses IP et de services de backend suffisant pour pouvoir exécuter quatre équilibreurs de charge internes (ayant chacun une adresse IP), ainsi que le service d'entrée de BookInfo (avec un équilibreur de charge et une adresse IP) présenté dans le tutoriel précédent.
  • Assurez-vous que votre contexte kubectl est défini sur votre cluster Istio.

    kubectl config current-context              # Display the current-context
    kubectl config use-context [CLUSTER_NAME]   # set the default context to [CLUSTER_NAME]
    

Définir des valeurs par défaut pour l'outil de ligne de commande gcloud

Pour gagner du temps lors de la saisie de vos options d'ID de projet et de zone Compute Engine dans l'outil de ligne de commande gcloud,vous pouvez définir les valeurs par défaut suivantes :
gcloud config set project [PROJECT_ID]
gcloud config set compute/zone [COMPUTE_ENGINE_ZONE]

Configurer le maillage pour l'extension

Lorsque vous ajoutez des services autres que Google Kubernetes Engine à un maillage Istio, vous devez tout d'abord configurer l'installation Istio et générer les fichiers de configuration qui permettront aux instances de VM Compute Engine d'exploiter le framework. Votre téléchargement d'Istio comprend un script qui vous aide à effectuer ces opérations sur GKE. Il est disponible dans /install/tools/setupMeshEx.sh. Suivez ces étapes sur la machine qui contient le répertoire d'installation d'Istio et vos identifiants de cluster. Il s'agit de la machine d'administration du cluster.

  1. À l'aide du déploiement mesh-expansion fourni, configurez des équilibreurs de charge internes pour Pilot, Mixer, l'autorité de certification Istio, ainsi que le serveur Cloud DNS GKE. Cela permettra aux instances de VM d'accéder à ces services.

    kubectl apply -f install/kubernetes/mesh-expansion.yaml
    
  2. Vérifiez que les services s'exécutent correctement et que tous les équilibreurs de charge internes possèdent des valeurs EXTERNAL-IP (vous devrez peut-être attendre une minute) :

    $ kubectl -n istio-system get services
    NAME              TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)                                                  AGE
    istio-ca-ilb      LoadBalancer   10.47.245.69    10.150.0.9       8060:32174/TCP                                           3m
    istio-egress      ClusterIP      10.47.252.251   <none>           80/TCP                                                   7m
    istio-ingress     LoadBalancer   10.47.254.41    35.197.249.113   80:31822/TCP,443:30637/TCP                               7m
    istio-mixer       ClusterIP      10.47.244.179   <none>           9091/TCP,9093/TCP,9094/TCP,9102/TCP,9125/UDP,42422/TCP   8m
    istio-pilot       ClusterIP      10.47.241.19    <none>           8080/TCP,443/TCP                                         7m
    istio-pilot-ilb   LoadBalancer   10.47.243.136   10.150.0.6       8080:30064/TCP                                           3m
    mixer-ilb         LoadBalancer   10.47.242.213   10.150.0.8       9091:31278/TCP                                           3m
  3. À partir du répertoire d'installation d'Istio, lancez le script d'aide pour générer la configuration Istio cluster.env à déployer sur les instances de VM, puis spécifiez le nom de votre cluster. Ce fichier contient les plages d'adresses IP du cluster à intercepter.

    install/tools/setupMeshEx.sh generateClusterEnv [CLUSTER_NAME]
    

    Un fichier composé d'une seule ligne est alors créé :

    $ cat cluster.env
    ISTIO_SERVICE_CIDR=10.63.240.0/20
  4. En utilisant ce même script, générez ensuite le fichier de configuration Cloud DNS pour les instances de VM. Cela permet aux applications de la VM Compute Engine de résoudre les noms de service du cluster à l'aide de dnsmasq. Ces noms seront alors interceptés par le side-car, puis transférés.

    install/tools/setupMeshEx.sh generateDnsmasq
    

    Exemple de fichier généré :

    $ cat kubedns
    server=/svc.cluster.local/10.150.0.7
    address=/istio-mixer/10.150.0.8
    address=/istio-pilot/10.150.0.6
    address=/istio-ca/10.150.0.9
    address=/istio-mixer.istio-system/10.150.0.8
    address=/istio-pilot.istio-system/10.150.0.6
    address=/istio-ca.istio-system/10.150.0.9

Configurer une VM d'extension de maillage

Une fois que vous avez configuré le maillage et généré les fichiers de configuration appropriés, vous devez configurer les instances de VM Compute Engine pour les ajouter au maillage, y compris copier ces fichiers sur les VM. Dans ce tutoriel, vous pouvez effectuer ces opérations à l'aide du script setupMeshEx.sh fourni. Toutefois, lorsque vous ajoutez vos propres VM à une application de maillage réelle, suivez les étapes manuellement pour intégrer les instances à vos workflows et à votre provisionnement. Pour découvrir la procédure détaillée, consultez le guide d'Istio sur l'extension de maillage. Vous trouverez également le script que setupMeshEx.sh exécute sur chaque VM dans /install/tools/setupIstioVM.sh.

  1. Assurez-vous tout d'abord que vous disposez d'une VM Compute Engine au sein du même projet et du même réseau que votre installation Istio. Elle vous servira de machine d'extension de maillage. Si vous n'avez pas encore de VM, créez-en une :

    gcloud compute instances create istio-vm
    
  2. Istio peut administrer des services sur plusieurs espaces de noms GKE. Dans cet exemple, vous allez placer le service de VM (même s'il ne se trouve pas sur GKE) dans l'espace de noms vm, où les règles de routage BookInfo fournies le rechercheront. L'utilisation de plusieurs espaces de noms vous aide à séparer vos services de VM de vos services GKE habituels. Si vous souhaitez utiliser un espace de noms autre que celui par défaut pour une machine d'extension de maillage, vous devez le spécifier avant d'exécuter les scripts de configuration. Dans le répertoire d'installation d'Istio situé sur votre machine d'administration du cluster, commencez par définir la variable SERVICE_NAMESPACE :

    export SERVICE_NAMESPACE=vm
    

    Créez ensuite l'espace de noms :

    kubectl create namespace $SERVICE_NAMESPACE
    
  3. Toujours sur la machine d'administration du cluster, exécutez la commande suivante avec le script de configuration setupMeshEx.sh. Les opérations suivantes s'effectuent alors :

    • Les fichiers générés et le script de configuration de la VM sont copiés vers la VM.
    • Les paramètres Cloud DNS sont configurés et vérifiés afin de permettre à la VM de se connecter aux composants Istio.
    • Les codes secrets d'authentification Istio sont copiés vers la VM.
    • Les fichiers Debian Istio sont installés sur la VM, y compris le proxy side-car Istio.
    install/tools/setupMeshEx.sh machineSetup istio-vm
  4. Connectez-vous en SSH à la VM Compute Engine à l'aide de l'outil de ligne de commande gcloud ou de l'une des autres options indiquées sur la page Informations sur l'instance de VM de la console (accessible depuis la page Instances de VM) :

    gcloud compute ssh istio-vm
    
  5. Sur la VM Compute Engine, vérifiez que la machine configurée peut accéder aux services qui s'exécutent dans le cluster GKE. Par exemple, si vous exécutez l'exemple d'application BookInfo (de la page Installer Istio sur GKE) dans le cluster Kubernetes Engine, vous devriez être en mesure d'accéder au service productpage depuis la VM à l'aide de curl, comme décrit ci-dessous :

    $ curl -v -w "\n" http://productpage.default.svc.cluster.local:9080/api/v1/products/0/ratings
    *   Trying 10.63.251.156...
    * Connected to productpage.default.svc.cluster.local (10.63.251.156) port 9080 (#0)
    > GET /api/v1/products/0/ratings HTTP/1.1
    > Host: productpage.default.svc.cluster.local:9080
    > User-Agent: curl/7.47.0
    > Accept: /
    >
    < HTTP/1.1 200 OK
    < content-type: application/json
    < content-length: 54
    < server: envoy
    < date: Sun, 15 Oct 2017 00:04:49 GMT
    < x-envoy-upstream-service-time: 17
    <

    • Connection #0 to host productpage.default.svc.cluster.local left intact {"ratings": {"Reviewer2": 4, "Reviewer1": 5}, "id": 0}
  6. Ici, default est utilisé dans l'URL de la page du produit, car l'exemple d'application BookInfo a été créé dans l'espace de noms par défaut dans le précédent tutoriel. Si vous avez choisi d'utiliser un autre espace de noms, saisissez-le à la place.

  7. Toujours sur la VM, vérifiez que les processus Istio sont en cours d'exécution :

    $ sudo systemctl status istio-auth-node-agent
    istio-auth-node-agent.service - istio-auth-node-agent: The Istio auth node agent
      Loaded: loaded (/lib/systemd/system/istio-auth-node-agent.service; disabled; vendor preset: enabled)
      Active: active (running) since Fri 2017-10-13 21:32:29 UTC; 9s ago
      Docs: http://istio.io/
    Main PID: 6941 (node_agent)
      Tasks: 5
      Memory: 5.9M
      CPU: 92ms
      CGroup: /system.slice/istio-auth-node-agent.service
              └─6941 /usr/local/istio/bin/node_agent --logtostderr
    
    Oct 13 21:32:29 demo-vm-1 systemd[1]: Started istio-auth-node-agent: The Istio auth node agent.
    Oct 13 21:32:29 demo-vm-1 node_agent[6941]: I1013 21:32:29.469314    6941 main.go:66] Starting Node Agent
    Oct 13 21:32:29 demo-vm-1 node_agent[6941]: I1013 21:32:29.469365    6941 nodeagent.go:96] Node Agent starts successfully.
    Oct 13 21:32:29 demo-vm-1 node_agent[6941]: I1013 21:32:29.483324    6941 nodeagent.go:112] Sending CSR (retrial #0) ...
    Oct 13 21:32:29 demo-vm-1 node_agent[6941]: I1013 21:32:29.862575    6941 nodeagent.go:128] CSR is approved successfully. Will renew cert in 29m59.137732603s

Exécuter un service sur une machine d'extension de maillage

L'exemple suivant montre comment exécuter un service sur une machine d'extension de maillage. Dans cet exemple, vous allez utiliser la VM configurée dans la section précédente pour étendre l'exemple d'application BookInfo (de la page Installer Istio sur GKE) avec une base de données de notes MySQL exécutée sur une VM Compute Engine.

  1. Assurez-vous que istio-vm est configuré en tant que VM d'extension de maillage pour le cluster sur lequel BookInfo s'exécute, comme décrit ci-dessus.

  2. Installez un serveur MySQL sur la VM Compute Engine :

    sudo apt-get update && sudo apt-get install --no-install-recommends -y mariadb-server
    
  3. Pour les besoins de ce tutoriel (ne le faites pas en dehors de cet exercice), configurez le serveur MySQL de façon à attribuer le mot de passe "password" à l'utilisateur "root" :

    sudo mysql -e "grant all privileges on *.* to 'root'@'localhost' identified by 'password'; flush privileges"
    
  4. À l'aide du schéma mysqldb-init.sql fourni, configurez ensuite la base de données de notes BookInfo.

    curl https://raw.githubusercontent.com/istio/istio/master/samples/bookinfo/src/mysql/mysqldb-init.sql| mysql -u root --password=password -h 127.0.0.1
    
  5. Ensuite, enregistrez le nouveau service auprès de votre installation Istio à l'aide de istioctl. Récupérez tout d'abord l'adresse IP interne principale de la VM (disponible sur la page Informations sur l'instance de VM) de la console, ou grâce à la commande hostname --ip-address). Sur la machine d'administration du cluster, exécutez ensuite la commande suivante en indiquant l'adresse IP appropriée :

    $ istioctl register -n vm mysqldb 10.150.0.5 3306
    I1014 22:54:12.176972   18162 register.go:44] Registering for service 'mysqldb' ip '10.150.0.5', ports list [{3306 mysql}]
  6. Toujours sur la machine d'administration du cluster, mettez à jour le déploiement BookInfo avec une version du service de notes qui utilise la base de données MySQL, et modifiez le routage de manière à envoyer le trafic vers BookInfo.

    $ kubectl apply -f <(istioctl kube-inject -f samples/bookinfo/kube/bookinfo-ratings-v2-mysql-vm.yaml)
    deployment "ratings-v2-mysql-vm" created
    $ kubectl get pods -lapp=ratings
    NAME                                   READY     STATUS    RESTARTS   AGE
    ratings-v1-3016823457-mqbfx            2/2       Running   0          24m
    ratings-v2-mysql-vm-1319199664-9jxkp   2/2       Running   0          19s
    $ istioctl create -f samples/bookinfo/kube/route-rule-ratings-mysql-vm.yaml
    Created config route-rule/default/ratings-test-v2-mysql-vm at revision 4398
    Created config route-rule/default/reviews-test-ratings-v2-vm at revision 4399
  7. Enfin, sur la VM Compute Engine, configurez le proxy side-car Istio de istio-vm pour qu'il intercepte le trafic sur le port approprié (3306 dans notre exemple, comme spécifié lors de l'enregistrement du service). Vous pouvez configurer ces paramètres dans /var/lib/istio/envoy/sidecar.env en ajoutant les trois lignes suivantes au fichier.

    $ sudo vi /var/lib/istio/envoy/sidecar.env
    ...
    ISTIO_INBOUND_PORTS=3306
    ISTIO_SERVICE=mysqldb
    ISTIO_NAMESPACE=vm
    

    Vous devez redémarrer le side-car après avoir modifié la configuration.

    sudo systemctl restart istio
    
  8. Une fois ces étapes effectuées, le service de notes de l'application BookInfo utilise la nouvelle base de données d'extension de maillage. Si vous modifiez les valeurs de la base de données de notes sur la VM, vous verrez qu'elles apparaissent sur les pages de produits de l'application BookInfo.

    $ mysql -u root -h 127.0.0.1 --password=password test -e "select * from ratings"
    +----------+--------+
    | ReviewID | Rating |
    +----------+--------+
    |        1 |      5 |
    |        2 |      4 |
    +----------+--------+
    # Change to 1 star:
    $ mysql -u root --password=password test -e "update ratings set rating=1 where reviewid=1"
    

    Notes à jour dans l'interface utilisateur

Fonctionnement

Lorsque l'application sur l'instance de VM envoie une requête à un autre service du maillage, elle doit résoudre le nom à l'aide de Cloud DNS, en récupérant l'adresse IP du service (ou l'adresse IP du cluster, l'adresse IP virtuelle attribuée au service). Dans la configuration de la VM spéciale d'extension de maillage Istio, l'application de VM résout le nom à l'aide de dnsmasq, qui redirige toutes les adresses .cluster.local vers GKE. La configuration de dnsmasq ajoute également 127.0.0.1 à resolv.conf et, si nécessaire, configure le protocole DHCP de façon à insérer 127.0.0.1 après chaque résolution DHCP.

Lorsque l'application envoie la requête, la configuration de la VM Istio la redirige via le proxy Envoy à l'aide de ipnames. Le proxy se connecte ensuite au service Istio-Pilot pour obtenir la liste des points de terminaison et, après avoir appliqué les règles, transmet la requête au point de terminaison approprié dans le maillage.

Nettoyer

Pour éviter que les ressources utilisées dans ce tutoriel soient facturées sur votre compte Google Cloud Platform :

Si vous ne souhaitez pas continuer à explorer l'application BookInfo dans la section Étapes suivantes, procédez comme suit :

  1. Supprimez les différents équilibreurs de charge internes utilisés par l'exemple :

    kubectl -n istio-system delete service --all
    kubectl -n kube-system delete service dns-ilb
    
  2. Patientez jusqu'à la suppression de tous les équilibreurs de charge. Observez le résultat de la commande suivante pour confirmer la suppression :

    gcloud compute forwarding-rules list
    
  3. Supprimez le cluster de conteneurs :

    gcloud container clusters delete [CLUSTER_NAME]
    
  4. Supprimez la VM de la base de données :

    gcloud compute instances delete istio-vm
    

Étapes suivantes

Le site Istio contient davantage de guides et d'exemples de cas d'utilisation entièrement fonctionnels à tester avec Istio. y compris :

  • Routage intelligent : cet exemple vous montre comment utiliser les diverses fonctionnalités de gestion du trafic d'Istio avec BookInfo, y compris les règles de routage abordées dans la dernière section de ce tutoriel.

  • Télémétrie détaillée : cet exemple vous montre comment obtenir des métriques, des journaux et des traces uniformes pour les services de BookInfo à l'aide du composant Mixer et du proxy side-car d'Istio.

Cette page vous a-t-elle été utile ? Évaluez-la :

Envoyer des commentaires concernant…

Documentation Compute Engine