Cette page explique comment installer Istio dans votre cluster GKE On-Prem.
Présentation
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
v2.x sur la machine sur laquelle vous disposez de vos identifiants de cluster. Notez que Helm v3 n'est pas compatible pour le moment.
Autorisations et identifiants
Assurez-vous de disposer des identifiants
kubectl
pour le cluster d'utilisateurs GKE On-Prem sur lequel vous souhaitez installer Istio. Notez qu'Istio ne peut être installé que sur un cluster d'utilisateurs GKE On-Prem, et non sur un cluster d'administrateur.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.
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 dansinstall/
- Des exemples d'application dans
samples/
- Le binaire du client
istioctl
dans le répertoirebin/
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
- Les fichiers d'installation
Accédez au répertoire racine d'installation et ajoutez
istioctl
à votrePATH
: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.
Assurez-vous d'être dans le répertoire racine de l'installation Istio.
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 -
Attendez quelques secondes que tous les fichiers CRD soient validés sur le serveur de l'API Kubernetes.
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
Vérifiez que les services Kubernetes suivants sont déployés :
istio-citadel
,istio-pilot
,istio-ingressgateway
,istio-policy
etistio-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 ... 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-*
etistio-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é
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.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
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
:
Affichez la configuration du service
istio-ingressgateway
dans votre interface système :kubectl get svc -n istio-system istio-ingressgateway -o yaml
Tous les ports des passerelles d'Istio sont 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 ...
Accordez l'accès à ces ports via votre équilibreur de charge.
Par exemple, le port de service
http2
utilise leport
80 et lenodePort
31380. Supposons que les adresses des nœuds de votre cluster d'utilisateur soient192.168.0.10
,192.168.0.11
et192.168.0.12
, et que l'adresse IP virtuelle de votre équilibreur de charges soit203.0.113.1
.Configurez votre équilibreur de charge de sorte que le trafic dirigé vers
203.0.113.1:80
soit transféré vers192.168.0.10:31380
,192.168.0.11:31380
ou192.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.
Assurez-vous de toujours être à la racine du répertoire d'installation d'Istio sur la machine d'administration du cluster.
Déployez l'application en utilisant
kubectl apply
etistioctl kube-inject
. La commandekube-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)
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
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
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.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
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 -
Supprimez ensuite l'espace de noms
istio-system
:kubectl delete namespace istio-system
Étape suivante
Pour en savoir plus sur Istio, consultez le site Web d'Istio et la documentation d'Istio pour Google Cloud Platform.