Installer Istio

Cette page explique comment installer Istio dans votre cluster GKE On-Prem.

Présentation

[Istio](https://istio.io) est un framework Open Source permettant de connecter, surveiller et sécuriser des microservices, y compris des services exécutés sur GKE On-Prem. Grâce à lui, vous pouvez créer un réseau 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](https://www.envoyproxy.io), 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.

Ce guide vous explique comment installer et configurer Istio sur GKE On-Prem puis déployer une application de démonstration multiservice compatible avec Istio.

Avant de commencer

Vérifiez que vous avez installé le SDK Cloud.

Installer Helm

Pour installer Istio, nous vous recommandons d'utiliser Helm avec l'un des profils configurables d'Istio.

Si vous n'avez pas encore installé Helm, suivez les instructions du fichier README de Helm pour installer le binaire helm sur la machine sur laquelle vous disposez de vos identifiants de cluster.

Autorisations et identifiants

  1. Assurez-vous de disposer des identifiants kubectl pour le cluster d'utilisateur GKE On-Prem sur lequel vous souhaitez installer Istio. Notez qu'Istio ne peut être installé que sur un cluster d'utilisateur GKE On-Prem, et non sur un cluster d'administrateur.
1. Accordez des autorisations d'administrateur de cluster à l'utilisateur actuel. Vous avez besoin de ces autorisations pour créer les règles de [contrôle d'accès basé sur les rôles (RBAC)](/kubernetes-engine/docs/role-based-access-control) nécessaires pour Istio :
    kubectl create clusterrolebinding cluster-admin-binding \
      --clusterrole=cluster-admin \
      --user="$(gcloud config get-value core/account)"
    
Bien que vous puissiez exécuter l'application de démonstration sans accorder d'autorisations d'administrateur de cluster, ces autorisations sont requises si vous souhaitez accéder aux données de télémétrie et aux autres fonctionnalités d'Istio.

Télécharger Istio

Pour GKE On-Prem, nous vous recommandons d'utiliser la version 1.1.13 d'Istio.

Suivez ces étapes sur la machine qui contient les identifiants de cluster Istio : il s'agit de la machine d'administration du cluster.

  1. Téléchargez et décompressez le package Istio 1.1.13 dans votre répertoire actuel à l'aide de la commande suivante :

    curl -L https://github.com/istio/istio/releases/download/1.1.13/istio-1.1.13-linux.tar.gz | tar xz
    

    Le répertoire d'installation contient les éléments suivants :

    • Les fichiers d'installation .yaml pour Kubernetes dans install/
    • Des exemples d'application dans samples/
    • Le binaire du client istioctl dans le répertoire bin/. istioctl est utilisé lors de l'injection manuelle d'Envoy en tant que proxy side-car et lors de la création de règles et de stratégies de routage
    • Le fichier de configuration istio.VERSION
  2. Accédez au répertoire racine d'installation et ajoutez istioctl à votre PATH :

    cd  istio-1.1.13
    export PATH=$PATH:${PWD}/bin
    

Configurer l'espace de noms et le certificat

Sur votre machine d'administration de cluster, procédez comme suit pour configurer l'espace de noms istio-system pour les composants du plan de contrôle :

kubectl create namespace istio-system

Copiez ensuite le certificat racine requis dans istio-system pour Citadel. Cette opération est nécessaire pour les clusters GKE On-Prem :

kubectl get secret istio-ca-secret --namespace=kube-system --export -o yaml | kubectl apply --validate=false --namespace=istio-system -f -

Installer Istio

Remarque : Assurez-vous que Helm v2.*x* est installé. Actuellement, Helm v3 n'est pas compatible. Pour obtenir le numéro de version de Helm, exécutez "helm version". Vous êtes maintenant prêt à installer Istio. Istio est installé dans l'espace de noms "istio-system" que vous venez de créer et peut gérer les microservices de tous les autres espaces de noms. L'installation comprend des composants de base, des outils et des exemples d'installations Istio. 1. Assurez-vous d'être dans le répertoire racine de l'installation Istio. 1. Installez les définitions de ressources personnalisées (CRD, Custom Resource Definitions) d'Istio :
    helm template install/kubernetes/helm/istio-init \
      --name istio-init --namespace istio-system | kubectl apply -f -
    
1. Attendez quelques secondes que tous les fichiers CRD soient validés sur le serveur d'API Kubernetes. 1. Installez Istio avec le profil [profil] par défaut (https://istio.io/docs/setup/kubernetes/additional-setup/config-profiles/). Bien que vous puissiez choisir un autre profil, nous vous recommandons le profil par défaut pour les déploiements de production.
    helm template install/kubernetes/helm/istio \
      --name istio --namespace istio-system | kubectl apply -f -
    
Ce service déploie les composants principaux d'Istio : * [Istio-Pilot](https://istio.io/docs/concepts/what-is-istio/#pilot){:.external}, responsable de la découverte du service et de la configuration des proxys side-car Envoy dans un maillage de services Istio. * Les composants [Mixer](https://istio.io/docs/concepts/what-is-istio/#mixer){:.external} Istio-Policy et Istio-Telemetry, qui appliquent des règles d'utilisation et recueillent des données de télémétrie sur le maillage de services. * [Istio-Ingressgateway](https://istio.io/docs/tasks/traffic-management/ingress.html){:.external}, qui fournit un point d'entrée pour le trafic provenant de l'extérieur du cluster. * [Istio-Citadel](https://istio.io/docs/concepts/what-is-istio/#citadel){:.external}, qui automatise la gestion des clés et des certificats pour Istio.

Vérifier l'installation d'Istio

1. Assurez-vous que les services Kubernetes suivants sont déployés : "istio-citadel", "istio-pilot", "istio-ingressgateway", "istio-policy" et istio-telemetry" (vous verrez également les autres services déployés) :
    kubectl get service -n istio-system
    
Sortie :
NAME                       TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                                                               AGE
    ...
    istio-citadel              ClusterIP      10.19.253.95            8060/TCP,9093/TCP                                                     37s
    istio-galley               ClusterIP      10.19.245.2             443/TCP,15014/TCP,9901/TCP                                            37s
    istio-ingressgateway       LoadBalancer   10.19.247.233        80:31380/TCP,443:31390/TCP,31400:31400/TCP                            40s
    istio-pilot                ClusterIP      10.19.243.14            15003/TCP,15005/TCP,15007/TCP,15010/TCP,15011/TCP,8080/TCP,9093/TCP   38s
    istio-policy               ClusterIP      10.19.254.117           9091/TCP,15004/TCP,9093/TCP                                           39s
    istio-sidecar-injector     ClusterIP      10.19.248.228           443/TCP                                                               37s
    istio-statsd-prom-bridge   ClusterIP      10.19.252.35            9102/TCP,9125/UDP                                                     39s
    istio-telemetry            ClusterIP      10.19.250.11            9091/TCP,15004/TCP,9093/TCP,42422/TCP                                 39s
    ...
2. Assurez-vous que les pods Kubernetes correspondants sont déployés et que tous les conteneurs sont opérationnels : "istio-pilot-*", istio-policy-*", "istio-telemetry-*", "istio-ingressgateway-*" et istio-citadel-*".
    kubectl get pods -n istio-system
    
Sortie :
NAME                                        READY     STATUS      RESTARTS   AGE
    istio-citadel-54f4678f86-4549b              1/1       Running     0          12m
    istio-cleanup-secrets-5pl77                 0/1       Completed   0          12m
    istio-galley-7bd8b5f88f-nhwlc               1/1       Running     0          12m
    istio-ingressgateway-665699c874-l62rg       1/1       Running     0          12m
    istio-pilot-68cbbcd65d-l5298                2/2       Running     0          12m
    istio-policy-7c5b5bb744-k6vm9               2/2       Running     0          12m
    istio-security-post-install-g9l9p           0/1       Completed   3          12m
    istio-sidecar-injector-85ccf84984-2hpfm     1/1       Running     0          12m
    istio-telemetry-5b6c57fffc-9j4dc            2/2       Running     0          12m
    istio-tracing-77f9f94b98-jv8vh              1/1       Running     0          12m
    prometheus-7456f56c96-7hrk5                 1/1       Running     0          12m
    ...

Configurer une adresse IP externe

L'installation d'Istio par défaut suppose qu'une adresse IP externe est automatiquement attribuée aux services LoadBalancer. Ce n'est pas le cas dans les clusters GKE On-Prem. Par conséquent, vous devez attribuer une adresse IP manuellement pour la ressource de passerelle d'entrée Istio.

Pour configurer une adresse IP externe, suivez les instructions de l'une des sections ci-dessous, en fonction du mode d'équilibrage de charge de votre cluster :

Mode d'équilibrage de charge intégré

  1. Ouvrez la configuration du service istio-ingressgateway :

    kubectl edit svc -n istio-system istio-ingressgateway
    

    La configuration du service istio-ingressgateway s'ouvre dans l'éditeur de texte par défaut de votre interface système.

  2. Ajoutez la ligne suivante au fichier sous le bloc de spécification (spec) :

    loadBalancerIP: <your static external IP address>
    

    Exemple :

    spec:
     loadBalancerIP: 203.0.113.1
    
  3. Enregistrez le fichier.

Mode d'équilibrage de charge manuel

Pour exposer un service de type NodePort sur une adresse IP virtuelle de l'équilibreur de charge sélectionné, vous devez d'abord déterminer les valeurs de nodePort :

  1. Affichez la configuration du service istio-ingressgateway dans votre interface système :

    kubectl get svc -n istio-system istio-ingressgateway -o yaml
    

    Les ports des passerelles d'Istio sont tous affichés. Le résultat de la commande ressemble à ceci :

     ...
     ports:

    • name: status-port nodePort: 30391 port: 15020 protocol: TCP targetPort: 15020
    • name: http2 nodePort: 31380 port: 80 protocol: TCP targetPort: 80
    • name: https nodePort: 31390 port: 443 protocol: TCP targetPort: 443
    • name: tcp nodePort: 31400 port: 31400 protocol: TCP targetPort: 31400
    • name: https-kiali nodePort: 31073 port: 15029 protocol: TCP targetPort: 15029
    • name: https-prometheus nodePort: 30253 port: 15030 protocol: TCP targetPort: 15030
    • name: https-grafana nodePort: 30050 port: 15031 protocol: TCP targetPort: 15031
    • name: https-tracing nodePort: 31204 port: 15032 protocol: TCP targetPort: 15032
    • name: tls nodePort: 30158 port: 15443 protocol: TCP targetPort: 15443 ...
  2. Accordez l'accès à ces ports via votre équilibreur de charge.

    Par exemple, le port de service http2 utilise le port 80 et le nodePort 31380. Supposons que les adresses des nœuds de votre cluster d'utilisateur soient 192.168.0.10, 192.168.0.11 et 192.168.0.12, et que l'adresse IP virtuelle de votre équilibreur de charges soit 203.0.113.1.

    Configurez votre équilibreur de charge de sorte que le trafic dirigé vers 203.0.113.1:80 soit transféré vers 192.168.0.10:31380, 192.168.0.11:31380 ou 192.168.0.12:31380. Vous pouvez sélectionner les ports de service auxquels vous souhaitez donner l'accès à cette adresse IP virtuelle.

Déployer l'exemple d'application

Une fois qu'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'application fournis avec l'installation. Dans ce tutoriel, nous allons installer [BookInfo](https://istio.io/docs/guides/bookinfo.html). Il s'agit d'une simple application de librairie fictive composée de quatre services qui fournissent une page produit Web, des informations sur les livres, des avis de lecteurs (avec plusieurs versions du service de communication d'avis) et des évaluations. Tous ces services sont gérés par Istio. Vous trouverez le code source et tous les autres fichiers utilisés dans cet exemple dans le répertoire [samples/bookinfo](https://github.com/istio/istio/tree/master/samples/bookinfo) de votre installation Istio. Suivez les étapes suivantes pour déployer les services de l'application BookInfo dans un environnement compatible avec Istio, et avec des proxys side-car Envoy injectés avec chaque service pour fournir une fonctionnalité Istio. 1. Assurez-vous de toujours être à la racine du répertoire d'installation d'Istio sur la machine d'administration du cluster. 1. Déployez l'application à l'aide de "kubectl apply" et "istioctl kube-inject". La commande "kube-inject" met à jour le déploiement de BookInfo afin qu'un side-car soit déployé avec le service dans chaque pod d'application.
    kubectl apply -f <(istioctl kube-inject -f samples/bookinfo/platform/kube/bookinfo.yaml)
    
1. Confirmez que l'application a été correctement déployée en exécutant les commandes suivantes :
kubectl get services
Sortie :
    NAME                       CLUSTER-IP   EXTERNAL-IP   PORT(S)              AGE
    details                    10.0.0.31    <none>        9080/TCP             6m
    kubernetes                 10.0.0.1     <none>        443/TCP              7d
    productpage                10.0.0.120   <none>        9080/TCP             6m
    ratings                    10.0.0.15    <none>        9080/TCP             6m
    reviews                    10.0.0.170   <none>        9080/TCP             6m
et
kubectl get pods
Sortie :
    NAME                                        READY     STATUS    RESTARTS   AGE
    details-v1-1520924117-48z17                 2/2       Running   0          6m
    productpage-v1-560495357-jk1lz              2/2       Running   0          6m
    ratings-v1-734492171-rnr5l                  2/2       Running   0          6m
    reviews-v1-874083890-f0qf0                  2/2       Running   0          6m
    reviews-v2-1343845940-b34q5                 2/2       Running   0          6m
    reviews-v3-1813607990-8ch52                 2/2       Running   0          6m
1. Enfin, définissez le routage de la passerelle d'entrée pour l'application :
    kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
    

Valider le déploiement de l'application

Maintenant qu'elle est déployée, observons l'application BookInfo en action. Vous connaissez déjà l'adresse IP externe de la passerelle d'entrée puisque vous l'avez configurée précédemment. Par exemple, si vous avez utilisé 203.0.113.1 comme adresse IP externe :

export GATEWAY_URL=203.0.113.1
### Essayer l'application 1. Vérifiez que l'application BookInfo s'exécute avec "curl" :
    curl -I http://${GATEWAY_URL}/productpage
    
Si la réponse indique "200", cela signifie que l'application fonctionne correctement avec Istio. 1. Utilisez maintenant votre navigateur pour accéder à "http://$GATEWAY_URL/productpage" et afficher la page Web BookInfo. Si vous actualisez la page plusieurs fois, vous devriez voir différentes versions des avis s'afficher sur la page produit, chacune affichée à tour de rôle (étoiles rouges, étoiles noires, aucune étoile), car nous n'avons pas encore contrôlé le routage des versions avec Istio. ## Déployer votre propre application Si vous souhaitez déployer l'une de vos propres applications, il vous suffit de suivre la même procédure avec votre propre déploiement YAML : Istio ne nécessite aucune modification de l'application elle-même. Notez que l'application doit utiliser les protocoles HTTP/1.1 ou HTTP/2.0 pour tout son trafic HTTP, car le proxy Envoy n'est pas compatible avec HTTP/1.0. Pour le routage, il utilise en effet des en-têtes non présents dans HTTP/1.0. Vous pouvez utiliser "kube-inject" pour ajouter les side-cars lors du déploiement de l'application, comme dans notre exemple, ou activer l'[injection de side-car automatique d'Istio](/istio/docs/istio-on-gke/installing#enabling_sidecar_injection) pour l'espace de noms où votre application est exécutée.

Désinstallation

  1. Utilisez la commande suivante pour désinstaller les composants d'Istio :

    helm template install/kubernetes/helm/istio --name istio --namespace istio-system | kubectl delete -f -
    
  2. Supprimez ensuite l'espace de noms istio-system :

    kubectl delete namespace istio-system
    

Et ensuite ?

Pour en savoir plus sur Istio, consultez le site Web d'Istio et la documentation d'Istio pour Google Cloud Platform.