Qu'est ce qu'Istio?

"Les plates-formes cloud offrent de nombreux avantages aux organisations qui les utilisent. Il est indéniable que l’adoption du cloud peut mettre à rude épreuve les équipes DevOps. Les développeurs doivent utiliser des microservices pour concevoir la portabilité, tandis que les opérateurs gèrent des déploiements hybrides et multi-cloud extrêmement volumineux. Istio vous permet de connecter, sécuriser, contrôler et observer des services.

À un niveau élevé, Istio aide à réduire la complexité de ces déploiements et facilite la tâche de vos équipes de développement. Il s’agit d’un service entièrement open source qui se superpose de manière transparente aux applications distribuées existantes. Il s’agit également d’une plate-forme, comprenant des API qui permettent son intégration dans toute plate-forme de journalisation, système de télémétrie ou de stratégie. Les différentes fonctionnalités d'Istio vous permettent d'exécuter avec succès et efficacement une architecture de microservices distribuée et fournissent un moyen uniforme de sécuriser, de connecter et de surveiller les microservices."

Voici la définition donnée par le site officiel du projet Istio pour expliquer ce qu'est Istio et comment il s'intègre pleinement à Kubernetes. Avec ce petit schéma nous allons comprendre aisèment son importante dans cet ecosystème :

istio-1-1

Mais au fait, pourquoi utiliser Istio?

Istio facilite la création d'un réseau de services déployés avec un load-balancing, une authentification de service à service, un monitoring, etc., sans aucune modification du code de service. Vous ajoutez le support Istio aux services en déployant un proxy sidecar spécial dans votre environnement qui intercepte toutes les communications réseau entre les microservices, puis configure et gère Istio à l'aide de sa fonctionnalité de control plane, qui comprend:

  • Équilibrage automatique de la charge pour le trafic HTTP, gRPC, WebSocket et TCP.

  • Contrôle précis du comportement du trafic avec des rich routing rules, retries, failovers, and fault injection.

  • Une couche de stratégie enfichable et une API de configuration prenant en charge les contrôles d'accès, les limites de taux et les quotas.

  • Mesures automatiques, journaux et logs pour tout le trafic au sein d'un cluster, y compris l'entrée et la sortie du cluster.

  • Communication de service à service sécurisée dans un cluster avec authentification et autorisation basées sur l'identité.

  • Istio est conçu pour être extensible et répond à divers besoins de déploiement.

arch

*Architecture d'Istio *

Allez maintenant on teste l'installation sur un cluster GKE évidemment.

Installation

Comme d'habitude depuis le terminal de son Mac on lance les commandes suivantes :

gcloud init

Si besoin on met à jour le SDK :

gcloud components update

Puis :

gcloud config set compute/zone europe-west-3a
gcloud config set compute/region europe-west3

Et on choisit le bon projet:

gcloud config set project your-project-id

ATTENTION : Kubectl doit être installé :

gcloud components install kubectl

Autoriser Compute Engine et Kubernetes Engine API :

gcloud services enable \
  compute.googleapis.com \
  container.googleapis.com

Créer le cluster :

gcloud container clusters create istio-tutorial \
--machine-type=n1-standard-2 \
--num-nodes=4 \
--no-enable-legacy-authorization

Puis les Rbac:

kubectl create clusterrolebinding cluster-admin-binding \
 --clusterrole=cluster-admin \
 --user=$(gcloud config get-value core/account)

Installer Istio sur le cluster

curl -L https://git.io/getLatestIstio | ISTIO_VERSION=1.0.0 sh -

Puis pour finir le PATH :

export PATH="$PATH:/Users/admin/istio-1.0.0/bin"

On se met dans le dossier :

cd istio-1.0.0

Et on lance l'installation :

kubectl apply -f install/kubernetes/istio-demo-auth.yaml

On checke ensuite l'état de déploiement avec :

kubectl get pods -n istio-system

soit :

grafana-fc6b5998-7rsj8                      1/1       Running   0          8m
istio-citadel-b4f89f4c6-zbmnk               1/1       Running   0          8m
istio-egressgateway-596c59c644-v2ns4        1/1       Running   0          8m
istio-galley-56489777f7-jzq4h               1/1       Running   0          8m
istio-ingressgateway-77b7447dbf-jk8br       1/1       Running   0          8m
istio-pilot-56cbf84f5b-vz8wc                2/2       Running   0          8m
istio-policy-df48c5786-rqg5r                2/2       Running   0          8m
istio-sidecar-injector-7fd89585b5-xrrfl     1/1       Running   0          8m
istio-statsd-prom-bridge-55965ff9c8-hqv9h   1/1       Running   0          8m
istio-telemetry-fdd5867dc-s9j67             2/2       Running   0          8m
istio-telemetry-fdd5867dc-wvvhf             2/2       Running   0          5m
istio-tracing-77f9f94b98-vdgfd              1/1       Running   0          8m
prometheus-7456f56c96-6bshv                 1/1       Running   0          8m
servicegraph-58fdb745c4-jlgxl               1/1       Running   0          8m

Activer l'injection de sidecar

Lorsque nous configurons et exécutons les services, les sidecars Envoy peuvent être automatiquement injectés dans chaque module du service. Pour que cela fonctionne, nous devons activer l’injection de sidecar pour l’espace de noms («default») que nous utiliserons pour nos microservices. Nous faisons cela en appliquant une étiquette:

kubectl label namespace default istio-injection=enabled

Puis on vérifie si tout s'est bien passé :

kubectl get namespace -L istio-injection

Déployer l'application BookInfo

Une fois que Istio est installé et que tous ses composants sont en cours d'exécution, vous pouvez essayer de déployer l'un des exemples d'applications fournis avec l'installation. Dans ce tutoriel, nous allons installer BookInfo. Il s'agit d'une application de librairie simple constituée de quatre services fournissant une page Web, des détails sur les livres, des reviews (avec plusieurs versions du service de révision) et des évaluations - tous gérés à l'aide d'Istio. Vous pouvez trouver le code source et tous les autres fichiers utilisés dans cet exemple dans le répertoire samples/bookinfo de votre installation Istio.

Assurez-vous que vous êtes toujours à la racine du répertoire d'installation d'Istio sur votre ordinateur administrateur de cluster.

cd istio-1.0.0

Déployez l'application en utilisant kubectl apply :

kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml

Confirmez que l'application a été déployée correctement en exécutant les commandes suivantes:

kubectl get services 

Et :

kubectl get pods

Déployer BookInfo Gateway

Dans Istio 1.0.0, vous devez créer une passerelle pour le trafic entrant. Créons une passerelle pour l’application BookInfo:

kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml

Utilisez l'application BookInfo

withistio

Nous pouvons enfin regarder l'application. Nous devons trouver l'adresse IP et le port de la passerelle d'ingress:

kubectl get svc istio-ingressgateway -n istio-system

Pour faciliter la tâche, définissons une variable GATEWAY_URL:

export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT

Voyons si l'application fonctionne. Vous devriez obtenir 200 avec curl:

curl -o /dev/null -s -w "%{http_code}\n" http://${GATEWAY_URL}/productpage

Vous pouvez également ouvrir un navigateur et voir la page Web frontend pour le produit. À ce stade, l'application a été déployée et gérée par une installation de base d'Istio.

Capture-d-e-cran-2018-09-15-a--09.48.26

Ensuite, nous examinerons certains des modules complémentaires. Contrairement aux versions précédentes, les modules complémentaires sont déjà installés automatiquement. Commençons par envoyer du trafic:

MBP-de-admin:istio-1.0.0 admin$ for i in {1..100}; do curl -o /dev/null -s -w "%{http_code}\n" http://35.198.108.245/productpage; done
200
200
200
200
200
200
200

Monitorer

Via Grafana

Il y a Grafana pour le dashboard. Commencez par configurer le transfert de port:

kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=grafana -o jsonpath='{.items[0].metadata.name}') 8080:3000

Accédez à http://localhost:8080 pour afficher le tableau de bord:

Capture-d-e-cran-2018-09-15-a--11.01.02

Métriques Prometheus

Ensuite, regardons Prometheus pour les métriques. Définir le transfert de port:

kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=prometheus -o jsonpath='{.items[0].metadata.name}') 8083:9090

Naviguez jusqu'à http://localhost:8083/graph pour voir Prometheus:

Capture-d-e-cran-2018-09-16-a--09.09.43

ServiceGraph

Pour la visualisation des dépendances, nous pouvons examiner ServiceGraph:

kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=servicegraph -o jsonpath='{.items[0].metadata.name}') 8082:8088

Naviguez vers http://localhost:8082/dotviz:

screen-shot-2018-06-07-at-10-02-38-am

Tracing

Pour le traçage HTTP, il y a Jaeger et Zipkin. Jetons un coup d’œil à Jaeger. Configurez le transfert de port comme d'habitude:

kubectl port-forward -n istio-system $(kubectl get pod -n istio-system -l app=jaeger -o jsonpath='{.items[0].metadata.name}') 8084:16686

Naviguez vers http://localhost:8084

Capture-d-e-cran-2018-09-16-a--09.12.54

Gestion du trafic

Avant de pouvoir utiliser Istio pour contrôler le routage de l'app' Bookinfo, vous devez définir les versions disponibles, appelées sous-ensembles, dans les règles de destination. Exécutez la commande suivante pour créer des règles de destination par défaut pour les services Bookinfo:

kubectl apply -f samples/bookinfo/networking/destination-rule-all-mtls.yaml

Vous pouvez alors voir les VirtualServices et DestinationRules existants comme ceci:

kubectl get virtualservices -o yaml
kubectl get destinationrules -o yaml

Lorsque vous accédez à la page produit de l'application BookInfo et que vous effectuez une actualisation du navigateur à plusieurs reprises, vous verrez que la section des commentaires à droite change constamment (les étoiles changent de couleur).

Capture-d-e-cran-2018-09-16-a--21.18.24

En effet, il existe 3 microservices différents et chaque fois, un microservice différent est appelé. Branchez tous les microservices à la version 1:

kubectl apply -f samples/bookinfo/networking/virtual-service-all-v1.yaml

Cela crée VirtualServices et DestinationRules, nécessaires pour épingler tous les microservices à la version1. Maintenant, si vous revenez à la page du produit et effectuez un rafraîchissement du navigateur, rien ne change car les avis microservice sont épinglés à la version 1.

Pour épingler un utilisateur spécifique (par exemple, Gabriel) à une version spécifique (v2), nous pouvons procéder comme suit:

kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml

Avec cette règle, si vous vous connectez à la page du produit avec le nom d'utilisateur «Gabriel», vous devriez voir la version v2 des commentaires microservice.

Pour nettoyer toutes les règles de destination, exécutez les opérations suivantes et nous revenons au début avec 3 versions différentes des microservices:

kubectl delete -f samples/bookinfo/networking/virtual-service-all-v1.yaml

Nettoyage

Cela englobe toutes les fonctionnalités de base d'Istio 1.0.0 que je voulais montrer sur GKE. Pour nettoyer, supprimons d'abord l'application BookInfo:

kubectl delete -f samples/bookinfo/networking/bookinfo-gateway.yaml
kubectl delete -f samples/bookinfo/platform/kube/bookinfo.yaml

Confirmez que l'application BookInfo a disparu:

kubectl get gateway
kubectl get virtualservices
kubectl get nodes

Enfin, nettoyage Istio:

kubectl delete -f install/kubernetes/istio-demo.yaml

Confirmez que Istio a été effacé:

kubectl get pods -n istio-system

Documentation :