Vous consultez la documentation d'une version précédente de GKE On-Prem. Consultez la documentation la plus récente.

Installer Istio

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

Aperçu

Istio 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, 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 et 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.

  2. 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 des accès basé sur les rôles 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'applications dans samples/
    • Le binaire client istioctl dans le répertoire bin/ istioctl est utilisé lors de l'injection manuelle d'Envoy en tant que proxy side-car et 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

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.

  2. 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 -
    
  3. Attendez quelques secondes que tous les fichiers CRD soient validés sur le serveur de l'API Kubernetes.

  4. Installez Istio avec le profil par défaut. 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 profil de configuration déploie les composants principaux d'Istio :

    • Istio-Pilot, 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 Istio-Policy et Istio-Telemetry, qui appliquent des règles d'utilisation et collectent des données de télémétrie sur l'ensemble du maillage de services
    • Istio-Ingressgateway, qui fournit un point d'entrée pour le trafic provenant de l'extérieur du cluster
    • Istio-Citadel, qui automatise la gestion des clés et des certificats pour Istio

Vérifier l'installation d'Istio

  1. Vérifiez 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, consultez 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 offrir l'accès à un service de type NodePort avec une adresse IP virtuelle sur l'équilibreur de charge sélectionné, vous devez d'abord rechercher les valeurs nodePort :

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

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

    Chacun des ports des passerelles d'Istio est affiché. 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. Il s'agit d'une application de librairie factice simple, composée de quatre services fournissant une page produits Web, des informations sur les livres, des avis de lecteurs (avec plusieurs versions du service de communication d'avis) et des évaluations. Tous sont gérés à l'aide d'Istio. Vous trouverez le code source et tous les autres fichiers utilisés dans cet exemple dans le répertoire samples/bookinfo de l'installation d'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.

  2. Déployez l'application en utilisant kubectl apply et istioctl kube-inject. La commande kube-inject met à jour le déploiement BookInfo afin qu'un side-car soit déployé dans chaque pod d'application avec le service.

    kubectl apply -f <(istioctl kube-inject -f samples/bookinfo/platform/kube/bookinfo.yaml)
    
  3. 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
  4. 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.

  2. Lancez votre navigateur, puis saisissez l'adresse http://$GATEWAY_URL/productpage pour afficher la page Web BookInfo. Si vous actualisez la page plusieurs fois, vous devriez voir différentes versions d'avis affichées sur la page produits, 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 essayer de déployer l'une de vos propres applications, suivez simplement 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 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.