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. Toutefois, sa fonctionnalité d'extension de maillage vous permet d'ajouter des services fonctionnant sur des plates-formes autres que Kubernetes au réseau maillé, y compris des services s'exécutant sur des VM Compute Engine. Cela vous permet de contrôler les services de VM et Kubernetes au sein d'un seul maillage. Ce tutoriel décrit comment configurer le framework Istio pour qu'il utilise l'extension de maillage, et vous explique la procédure à suivre pour ajouter des VM Compute Engine à un maillage Istio. Il part du principe que vous disposez déjà d'une installation Istio sur Kubernetes Engine.

Vous trouverez de plus amples informations au sujet d'Istio et de son fonctionnement sur le site Web officiel du framework, disponible à l'adresse 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 Kubernetes Engine afin d'utiliser l'extension de maillage
  • Configurer des VM Compute Engine pour les ajouter à un maillage de services Istio
  • Exécuter un service maillé Istio sur une VM Compute Engine

Coûts

Ce tutoriel utilise des composants facturables de Cloud Platform, tels que Compute Engine.

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

Avant de commencer

  • Vous devez disposer d'une installation Istio existante sur Kubernetes Engine. Consultez la section Installer Istio sur Google Kubernetes Engine pour effectuer cette étape et en savoir plus sur la configuration et les exigences associées.
  • L'exemple d'application BookInfo doit être installé et en cours d'exécution, comme décrit dans la section Installer Istio sur Google Kubernetes Engine. Votre chemin istioctl doit également contenir le client PATH.
  • 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 bien 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 dans 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 us-central1-b

Configurer le maillage pour l'extension

Lorsque vous ajoutez des services autres que Kubernetes à un maillage Istio, vous devez tout d'abord configurer l'installation d'Istio et générer les fichiers de configuration qui permettront aux VM Compute Engine d'exploiter le framework. Votre téléchargement d'Istio comprend un script qui vous aide à effectuer ces opérations sur Kubernetes Engine. Il est disponible sur la page /install/tools/setupMeshEx.sh. Suivez ces étapes sur la machine qui contient votre répertoire d'installation d'Istio et vos identifiants de cluster : il s'agit de votre 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 DNS Kubernetes. Cela permettra aux 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) avant de passer à l'étape suivante :

    $ 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 de votre répertoire d'installation d'Istio, lancez le script d'aide pour générer la configuration Istio cluster.env à déployer sur les VM, et 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 DNS pour les VM. Il permettra aux applications de la VM Compute Engine de résoudre les noms de service du cluster à l'aide du serveur 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 le maillage configuré et les fichiers de configuration appropriés générés, vous devez configurer les VM Compute Engine pour les ajouter au maillage, et copier les fichiers générés sur les VM. Dans ce tutoriel, vous pouvez effectuer ces opérations à l'aide du script setupMeshEx.sh. Toutefois, lorsque vous ajoutez vos propres VM à une réelle application de maillage, vous devez suivre les étapes manuellement afin de les intégrer à vos flux de travail et à votre provisionnement. Pour découvrir la procédure détaillée, consultez le guide relatif à l'extension de maillage d'Istio. Vous trouverez également le script que setupMeshEx.sh exécute sur chaque VM dans /install/tools/setupIstioVM.sh.

  1. Assurez-vous tout d'abord de disposer 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 dans plusieurs espaces de noms Kubernetes. Dans cet exemple, vous allez placer le service de VM (même s'il ne se trouve pas sur Kubernetes) dans l'espace de noms vm, où les règles de routage fournies par BookInfo le rechercheront. L'utilisation de plusieurs espaces de nom vous aide à séparer vos services de VM de vos services Kubernetes 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 votre 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 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 à la VM Compute Engine via SSH à l'aide de gcloud ou de l'une des autres options disponibles sur la page Informations sur l'instance de VM (accessible depuis la page Instances de VM) de la console :

    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 Kubernetes Engine. Par exemple, si vous exécutez l'application BookInfo (abordée dans la section Installer Istio sur Google Kubernetes Engine) 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, le nom default est utilisé dans l'URL de la page du produit, car nous avons créé l'exemple BookInfo dans l'espace de noms par défaut lors du précédent tutoriel. Si vous avez choisi un espace de noms différent, 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

Voyons maintenant la procédure à suivre pour exécuter un service sur une machine d'extension de maillage. Dans cet exemple, vous allez ajouter une base de données de notes MySQL s'exécutant sur une VM Compute Engine à l'application BookInfo (présentée dans la section Installer Istio sur Google Kubernetes Engine). Vous allez pour cela utiliser la VM configurée dans la section précédente.

  1. Vérifiez que vous avez bien configuré istio-vm 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. Enregistrez le nouveau service auprès de votre installation Istio à l'aide du client 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 votre machine d'administration du cluster, exécutez ensuite la commande suivante en remplaçant l'adresse IP par la vôtre :

    $ 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 votre 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 de la VM 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 devrait utiliser 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 la VM veut envoyer une requête à un autre service du maillage, elle doit résoudre le nom en utilisant un DNS et 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 du serveur dnsmasq, qui redirige toutes les adresses .cluster.local vers Kubernetes. La configuration du serveur dnsmasq ajoute également 127.0.0.1 à resolv.conf et, si nécessaire, configure le protocole DHCP de façon à insérer cette adresse 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.

Effectuer un nettoyage

Afin d'éviter que des frais ne soient facturés sur votre compte Google Cloud Platform pour les ressources utilisées dans ce tutoriel, procédez comme suit :

Si vous ne souhaitez pas continuer à utiliser 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. En voici quelques-uns :

  • 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 statistiques, 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