Comment installer et utiliser Istio avec Kubernetes

introduction

Un maillage de service est une couche d’infrastructure qui vous permet de gérer la communication entre les microservices de votre application. Tandis que de plus en plus de développeurs utilisent des microservices, les mailles de service ont évolué pour simplifier et rendre plus efficace ce travail en consolidant les tâches de gestion et d'administration courantes dans une configuration distribuée.

L'utilisation d'un maillage de services commeIstio peut simplifier des tâches telles que la découverte de services, le routage et la configuration du trafic, le chiffrement et l'authentification / autorisation, ainsi que la surveillance et la télémétrie. Istio, en particulier, est conçu pour fonctionner sans modifications majeures du code de service préexistant. Lorsque vous travaillez avecKubernetes, par exemple, il est possible d'ajouter des fonctionnalités de maillage de service aux applications exécutées dans votre cluster en créant des objets spécifiques à Istio qui fonctionnent avec les ressources d'application existantes.

Dans ce didacticiel, vous allez installer Istio à l'aide du gestionnaire de packagesHelm pour Kubernetes. Vous utiliserez ensuite Istio pour exposer une application de démonstrationNode.js au trafic externe en créant des ressourcesGateway etVirtual Service. Enfin, vous accéderez au module complémentaire de télémétrieGrafana pour visualiser les données de trafic de votre application.

Conditions préalables

Pour compléter ce tutoriel, vous aurez besoin de:

[.note] #Note: Nous recommandons vivement un cluster avec au moins 8 Go de mémoire disponible et 4 processeurs virtuels pour cette configuration. Ce didacticiel utilisera trois des droplets standard de 4 Go / 2vCPU de DigitalOcean comme nœuds.
#

[[step-1 -—- packaging-the-application]] == Étape 1 - Empaquetage de l'application

Pour utiliser notre application de démonstration avec Kubernetes, nous devrons cloner le code et le conditionner afin que leskubelet agent puissent extraire l'image.

Notre première étape sera de cloner lesnodejs-image-demo respository à partir desDigitalOcean Community GitHub account. Ce référentiel comprend le code de la configuration décrite dansHow To Build a Node.js Application with Docker, qui décrit comment créer une image pour une application Node.js et comment créer un conteneur à l'aide de cette image. Vous pouvez trouver plus d'informations sur l'application elle-même dans la sérieFrom Containers to Kubernetes with Node.js.

Pour commencer, clonez le référentiel nodejs-image-demo dans un répertoire appeléistio_project:

git clone https://github.com/do-community/nodejs-image-demo.git istio_project

Accédez au répertoireistio_project:

cd istio_project

Ce répertoire contient les fichiers et les dossiers d'une application d'informations sur les requins qui offre aux utilisateurs des informations de base sur les requins. Outre les fichiers de l'application, le répertoire contient un fichier Docker avec des instructions pour créer une image Docker avec le code de l'application. Pour plus d'informations sur les instructions du Dockerfile, consultezStep 3 of How To Build a Node.js Application with Docker.

Pour tester que le code de l'application et Dockerfile fonctionnent comme prévu, vous pouvez créer et baliser l'image à l'aide de la commandedocker build, puis utiliser l'image pour exécuter un conteneur de démonstration. L'utilisation de l'indicateur-t avecdocker build vous permettra de baliser l'image avec votre nom d'utilisateur Docker Hub afin de pouvoir la transmettre à Docker Hub une fois que vous l'avez testée.

Construisez l'image avec la commande suivante:

docker build -t your_dockerhub_username/node-demo .

Le. dans la commande spécifie que le contexte de construction est le répertoire courant. Nous avons nommé l'imagenode-demo, mais vous êtes libre de lui donner un autre nom.

Une fois le processus de construction terminé, vous pouvez lister vos images avecdocker images:

docker images

Vous verrez la sortie suivante confirmant la construction de l'image:

OutputREPOSITORY                          TAG                 IMAGE ID            CREATED             SIZE
your_dockerhub_username/node-demo   latest              37f1c2939dbf        5 seconds ago       77.6MB
node                                10-alpine           9dfa73010b19        2 days ago          75.3MB

Ensuite, vous utiliserezdocker run pour créer un conteneur basé sur cette image. Nous allons inclure trois drapeaux avec cette commande:

  • -p: Ceci publie le port sur le conteneur et le mappe à un port sur notre hôte. Nous utiliserons le port80 sur l'hôte, mais vous devriez vous sentir libre de le modifier si nécessaire si vous avez un autre processus en cours d'exécution sur ce port. Pour plus d'informations sur la façon dont cela fonctionne, consultez cette discussion dans la documentation Docker surport binding.

  • -d: Ceci exécute le conteneur en arrière-plan.

  • --name: Cela nous permet de donner au conteneur un nom personnalisé.

Exécutez la commande suivante pour construire le conteneur:

docker run --name node-demo -p 80:8080 -d your_dockerhub_username/node-demo

Inspectez vos conteneurs en cours d'exécution avecdocker ps:

docker ps

Vous verrez une sortie confirmant que votre conteneur d'application est en cours d'exécution:

OutputCONTAINER ID        IMAGE                               COMMAND                  CREATED             STATUS              PORTS                  NAMES
49a67bafc325        your_dockerhub_username/node-demo   "docker-entrypoint.s…"   8 seconds ago       Up 6 seconds        0.0.0.0:80->8080/tcp   node-demo

Vous pouvez maintenant visiter l'adresse IP de votre serveur pour tester votre configuration:http://your_server_ip. Votre application affichera la page de destination suivante:

Application Landing Page

Maintenant que vous avez testé l'application, vous pouvez arrêter le conteneur en cours d'exécution. Utilisez à nouveaudocker ps pour obtenir vosCONTAINER ID:

docker ps
OutputCONTAINER ID        IMAGE                               COMMAND                  CREATED              STATUS              PORTS                  NAMES
49a67bafc325        your_dockerhub_username/node-demo   "docker-entrypoint.s…"   About a minute ago   Up About a minute   0.0.0.0:80->8080/tcp   node-demo

Arrêtez le conteneur avecdocker stop. Assurez-vous de remplacer lesCONTAINER ID listés ici par votre propre applicationCONTAINER ID:

docker stop 49a67bafc325

Maintenant que vous avez testé l'image, vous pouvez la transférer vers Docker Hub. Commencez par vous connecter au compte Docker Hub que vous avez créé dans les conditions préalables:

docker login -u your_dockerhub_username

Lorsque vous y êtes invité, entrez le mot de passe de votre compte Docker Hub. La connexion de cette manière créera un fichier~/.docker/config.json dans le répertoire de base de votre utilisateur non root avec vos informations d'identification Docker Hub.

Poussez l'image de l'application vers Docker Hub avec lesdocker push command. N'oubliez pas de remplaceryour_dockerhub_username par votre propre nom d'utilisateur Docker Hub:

docker push your_dockerhub_username/node-demo

Vous disposez maintenant d'une image d'application que vous pouvez extraire pour exécuter votre application avec Kubernetes et Istio. Ensuite, vous pouvez installer Istio avec Helm.

[[step-2 -—- Installing-istio-with-helm]] == Étape 2 - Installation d'Istio avec Helm

Bien que Istio propose différentes méthodes d'installation, la documentation recommande d'utiliser Helm pour maximiser la flexibilité dans la gestion des options de configuration. Nous installerons Istio avec Helm et nous nous assurerons que l’addon Grafana est activé afin de pouvoir visualiser les données de trafic de notre application.

Premièrement, ajoutez le référentiel de versions d'Istio:

helm repo add istio.io https://storage.googleapis.com/istio-release/releases/1.1.7/charts/

Cela vous permettra d'utiliser les graphiques Helm du référentiel pour installer Istio.

Vérifiez que vous avez le repo:

helm repo list

Vous devriez voir le repoistio.io répertorié:

OutputNAME            URL
stable          https://kubernetes-charts.storage.googleapis.com
local           http://127.0.0.1:8879/charts
istio.io        https://storage.googleapis.com/istio-release/releases/1.1.7/charts/

Ensuite, installez lesCustom Resource Definitions (CRD) d'Istio avec le graphiqueistio-init en utilisant leshelm install command:

helm install --name istio-init --namespace istio-system istio.io/istio-init
OutputNAME:   istio-init
LAST DEPLOYED: Fri Jun  7 17:13:32 2019
NAMESPACE: istio-system
STATUS: DEPLOYED
...

Cette commande valide 53 CRD dans leskube-apiserver, les rendant disponibles pour une utilisation dans le maillage Istio. Il crée également unnamespace pour les objets Istio appelésistio-system et utilise l'option--name pour nommer les Helmreleaseistio-init. Une version dans Helm fait référence à un déploiement particulier d'un graphique avec des options de configuration spécifiques activées.

Pour vérifier que tous les CRD requis ont été validés, exécutez la commande suivante:

kubectl get crds | grep 'istio.io\|certmanager.k8s.io' | wc -l

Cela devrait afficher le nombre53.

Vous pouvez maintenant installer le graphiqueistio. Pour nous assurer que l'addon de télémétrie Grafana est installé avec le graphique, nous utiliserons l'option de configuration--set grafana.enabled=true avec notre commandehelm install. Nous utiliserons également le protocole d'installation pour nosconfiguration profile souhaités: le profil par défaut. Istio a un certain nombre de profils de configuration à choisir lors de l'installation avec Helm qui vous permettent de personnaliser les Istiocontrol plane and data plane sidecars. Le profil par défaut est recommandé pour les déploiements en production. Nous nous en servirons pour nous familiariser avec les options de configuration que nous utiliserions lors du passage à la production.

Exécutez la commandehelm install suivante pour installer le graphique:

helm install --name istio --namespace istio-system --set grafana.enabled=true istio.io/istio
OutputNAME:   istio
LAST DEPLOYED: Fri Jun  7 17:18:33 2019
NAMESPACE: istio-system
STATUS: DEPLOYED
...

Encore une fois, nous installons nos objets Istio dans l'espace de nomsistio-system et nommons la version - dans ce cas,istio.

Nous pouvons vérifier que lesService objects que nous attendons pour le profil par défaut ont été créés avec la commande suivante:

kubectl get svc -n istio-system

Les services que nous nous attendons à voir ici incluentistio-citadel,istio-galley,istio-ingressgateway,istio-pilot,istio-policy,istio-sidecar-injector,istio-telemetry etprometheus. Nous nous attendrions également à voir le servicegrafana, puisque nous avons activé cet addon lors de l'installation:

OutputNAME                     TYPE           CLUSTER-IP       EXTERNAL-IP       PORT(S)                                                                                                                                      AGE
grafana                  ClusterIP      10.245.85.162                3000/TCP                                                                                                                                     3m26s
istio-citadel            ClusterIP      10.245.135.45                8060/TCP,15014/TCP                                                                                                                           3m25s
istio-galley             ClusterIP      10.245.46.245                443/TCP,15014/TCP,9901/TCP                                                                                                                   3m26s
istio-ingressgateway     LoadBalancer   10.245.171.39    174.138.125.110   15020:30707/TCP,80:31380/TCP,443:31390/TCP,31400:31400/TCP,15029:30285/TCP,15030:31668/TCP,15031:32297/TCP,15032:30853/TCP,15443:30406/TCP   3m26s
istio-pilot              ClusterIP      10.245.56.97                 15010/TCP,15011/TCP,8080/TCP,15014/TCP                                                                                                       3m26s
istio-policy             ClusterIP      10.245.206.189               9091/TCP,15004/TCP,15014/TCP                                                                                                                 3m26s
istio-sidecar-injector   ClusterIP      10.245.223.99                443/TCP                                                                                                                                      3m25s
istio-telemetry          ClusterIP      10.245.5.215                 9091/TCP,15004/TCP,15014/TCP,42422/TCP                                                                                                       3m26s
prometheus               ClusterIP      10.245.100.132               9090/TCP                                                                                                                                     3m26s

Nous pouvons également vérifier les IstioPods correspondants avec la commande suivante:

kubectl get pods -n istio-system

Les pods correspondant à ces services doivent avoir unSTATUS deRunning, indiquant que les pods sont liés à des nœuds et que les conteneurs associés aux pods sont en cours d'exécution:

OutputNAME                                     READY   STATUS      RESTARTS   AGE
grafana-67c69bb567-t8qrg                 1/1     Running     0          4m25s
istio-citadel-fc966574d-v5rg5            1/1     Running     0          4m25s
istio-galley-cf776876f-5wc4x             1/1     Running     0          4m25s
istio-ingressgateway-7f497cc68b-c5w64    1/1     Running     0          4m25s
istio-init-crd-10-bxglc                  0/1     Completed   0          9m29s
istio-init-crd-11-dv5lz                  0/1     Completed   0          9m29s
istio-pilot-785694f946-m5wp2             2/2     Running     0          4m25s
istio-policy-79cff99c7c-q4z5x            2/2     Running     1          4m25s
istio-sidecar-injector-c8ddbb99c-czvwq   1/1     Running     0          4m24s
istio-telemetry-578b6f967c-zk56d         2/2     Running     1          4m25s
prometheus-d8d46c5b5-k5wmg               1/1     Running     0          4m25s

Le champREADY indique le nombre de conteneurs en cours d'exécution dans un pod. Pour plus d'informations, veuillez consulter lesdocumentation on Pod lifecycles.

[.Remarque]##

Note:
Si vous voyez des phases inattendues dans la colonneSTATUS, n'oubliez pas que vous pouvez dépanner vos pods avec les commandes suivantes:

kubectl describe pods your_pod -n pod_namespace
kubectl logs your_pod -n pod_namespace

La dernière étape de l'installation d'Istio consistera à permettre la création de proxysEnvoy, qui seront déployés en tant quesidecars vers les services exécutés dans le maillage.

Les sidecars sont généralement utilisés pour ajouter une couche supplémentaire de fonctionnalités dans les environnements de conteneur existants. Lesmesh architecture d'Istio reposent sur la communication entre les side-cars Envoy, qui comprennent le plan de données du maillage, et les composants du plan de contrôle. Pour que le maillage fonctionne, nous devons nous assurer que chaque pod du maillage exécutera également un sidecar Envoy.

Il existe deux façons d'atteindre cet objectif:manual sidecar injection etautomatic sidecar injection. Nous allons activer l'injection automatique de side-car parlabeling l'espace de noms dans lequel nous allons créer nos objets d'application avec l'étiquetteistio-injection=enabled. Cela garantira que le contrôleurMutatingAdmissionWebhook peut intercepter les requêtes adressées auxkube-apiserver et effectuer une action spécifique - dans ce cas, garantir que tous nos pods d'application démarrent avec un side-car.

Nous utiliserons l'espace de nomsdefault pour créer nos objets d'application, nous appliquerons donc l'étiquetteistio-injection=enabled à cet espace de noms avec la commande suivante:

kubectl label namespace default istio-injection=enabled

Nous pouvons vérifier que la commande a fonctionné comme prévu en lançant:

kubectl get namespace -L istio-injection

Vous verrez la sortie suivante:

OutputAME              STATUS   AGE   ISTIO-INJECTION
default           Active   47m   enabled
istio-system      Active   16m
kube-node-lease   Active   47m
kube-public       Active   47m
kube-system       Active   47m

Avec Istio installé et configuré, nous pouvons passer à la création de notre application Service et des objetsDeployment.

[[step-3 -—- creation-application-objects]] == Étape 3 - Création d'objets d'application

Avec le maillage Istio en place et configuré pour injecter des pods side-car, nous pouvons créer une applicationmanifest avecspecifications pour nos objets Service et Deployment. Les spécifications d’un manifeste Kubernetes décrivent l’état souhaité de chaque objet.

Notre service d’application veillera à ce que les pods exécutant nos conteneurs restent accessibles dans un environnement dynamique, au fur et à mesure de la création et de la destruction de pods individuels, tandis que notre déploiement décrira l’état souhaité de nos pods.

Ouvrez un fichier appelénode-app.yaml avecnano ou votre éditeur préféré:

nano node-app.yaml

Tout d'abord, ajoutez le code suivant pour définir le service d'applicationnodejs:

~/istio_project/node-app.yaml

apiVersion: v1
kind: Service
metadata:
  name: nodejs
  labels:
    app: nodejs
spec:
  selector:
    app: nodejs
  ports:
  - name: http
    port: 8080

Cette définition de service inclut unselector qui correspondra aux pods avec le libelléapp: nodejs correspondant. Nous avons également spécifié que le service ciblera le port8080 sur n'importe quel pod avec le libellé correspondant.

Nous nommons également le port de service, conformément auxrequirements for Pods and Services d'Istio. La valeurhttp est l'une des valeurs qu'Istio acceptera pour le champname.

Ensuite, sous le service, ajoutez les spécifications suivantes pour l'application Deployment. Assurez-vous de remplacer lesimage répertoriés sous la spécificationcontainers par l'image que vous avez créée et transférée vers Docker Hub dansStep 1:

~/istio_project/node-app.yaml

...
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nodejs
  labels:
    version: v1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nodejs
  template:
    metadata:
      labels:
        app: nodejs
        version: v1
    spec:
      containers:
      - name: nodejs
        image: your_dockerhub_username/node-demo
        ports:
        - containerPort: 8080

Les spécifications de ce déploiement incluent le nombre dereplicas (dans ce cas, 1), ainsi qu'unselector qui définit les pods que le déploiement gérera. Dans ce cas, il gérera les pods avec le labelapp: nodejs.

Le champtemplate contient des valeurs qui effectuent les opérations suivantes:

  • Appliquez l'étiquetteapp: nodejs aux pods gérés par le déploiement. Istiorecommends ajoutant l'étiquetteapp aux spécifications de déploiement pour fournir des informations contextuelles sur les métriques et la télémétrie d'Istio.

  • Appliquez une étiquetteversion pour spécifier la version de l'application qui correspond à ce déploiement. Comme pour l'étiquetteapp, Istio recommande d'inclure l'étiquetteversion pour fournir des informations contextuelles.

  • Définissez les spécifications des conteneurs que les pods exécuteront, y compris les conteneursname etimage. Leimage ici est l'image que vous avez créée dansStep 1 et poussée vers Docker Hub. Les spécifications du conteneur incluent également une configurationcontainerPort pour pointer vers le port sur lequel chaque conteneur écoutera. Si les ports ne sont pas répertoriés ici, ils contourneront le proxy Istio. Notez que ce port,8080, correspond au port ciblé nommé dans la définition du service.

Enregistrez et fermez le fichier une fois l’édition terminée.

Avec ce fichier en place, nous pouvons passer à la modification du fichier qui contiendra les définitions des objets Gateway et Virtual Service, qui contrôlent la façon dont le trafic entre dans le maillage et comment il est routé une fois là-bas.

[[step-4 -—- creation-istio-objects]] == Étape 4 - Création d'objets Istio

Pour contrôler l'accès à un cluster et le routage vers les services, Kubernetes utilise IngressResources etControllers. Ingress Resources définit des règles pour le routage HTTP et HTTPS vers les services de cluster, tandis que les contrôleurs chargent le trafic entrant et le routent vers les services appropriés.

Pour plus d'informations sur l'utilisation des ressources et des contrôleurs Ingress, consultezHow to Set Up an Nginx Ingress with Cert-Manager on DigitalOcean Kubernetes.

Istio utilise un ensemble d'objets différent pour atteindre des objectifs similaires, avec toutefois des différences importantes. Au lieu d'utiliser un contrôleur pour équilibrer la charge du trafic, le maillage Istio utilise unGateway, qui fonctionne comme un équilibreur de charge qui gère les connexions HTTP / TCP entrantes et sortantes. La passerelle permet ensuite d'appliquer des règles de surveillance et de routage au trafic entrant dans le maillage. Plus précisément, la configuration qui détermine le routage du trafic est définie en tant que service virtuel. Chaque service virtuel inclut des règles de routage qui correspondent à des critères avec un protocole et une destination spécifiques.

Bien que Kubernetes Ingress Resources / Controllers et Istio Gateways / Virtual Services présentent certaines similitudes fonctionnelles, la structure du maillage introduit d'importantes différences. Les ressources et les contrôleurs Kubernetes Ingress offrent aux opérateurs certaines options de routage, par exemple, mais les passerelles et les services virtuels offrent un ensemble de fonctionnalités plus robustes, car ils permettent au trafic d'entrer dans le maillage. En d'autres termes, les capacitésapplication layer limitées que les contrôleurs et ressources Kubernetes Ingress mettent à la disposition des opérateurs de cluster n'incluent pas les fonctionnalités - y compris le routage avancé, le traçage et la télémétrie - fournies par les side-cars dans le maillage de services Istio.

Pour autoriser le trafic externe dans notre maillage et configurer le routage vers notre application Nœud, nous devrons créer une passerelle Istio et un service virtuel. Ouvrez un fichier appelénode-istio.yaml pour le manifeste:

nano node-istio.yaml

Tout d’abord, ajoutez la définition de l’objet Gateway:

~/istio_project/node-isto.yaml

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: nodejs-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"

En plus de spécifier unname pour la passerelle dans le champmetadata, nous avons inclus les spécifications suivantes:

  • Unselector qui correspondra à cette ressource avec le contrôleur Istio IngressGateway par défaut qui a été activé avec lesconfiguration profile que nous avons sélectionnés lors de l'installation d'Istio.

  • Spécificationservers qui spécifie lesport à exposer pour l'entrée et leshosts exposés par la passerelle. Dans ce cas, nous spécifions tous leshosts avec un astérisque (*) car nous ne travaillons pas avec un domaine sécurisé spécifique.

Sous la définition de la passerelle, ajoutez les spécifications du service virtuel:

~/istio_project/node-istio.yaml

...
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: nodejs
spec:
  hosts:
  - "*"
  gateways:
  - nodejs-gateway
  http:
  - route:
    - destination:
        host: nodejs

En plus de fournir unname pour ce service virtuel, nous incluons également des spécifications pour cette ressource qui incluent:

  • Un champhosts qui spécifie l'hôte de destination. Dans ce cas, nous utilisons à nouveau une valeur générique (*) pour permettre un accès rapide à l'application dans le navigateur, car nous ne travaillons pas avec un domaine.

  • Un champgateways qui spécifie la passerelle via laquelle les demandes externes seront autorisées. Dans ce cas, c'est notre passerellenodejs-gateway.

  • Le champhttp qui spécifie comment le trafic HTTP sera acheminé.

  • Un champdestination qui indique où la demande sera acheminée. Dans ce cas, il sera acheminé vers le servicenodejs, qui se développe implicitement vers le nom de domaine complet (FQDN) du service dans un environnement Kubernetes:nodejs.default.svc.cluster.local. Il est important de noter, cependant, que le FQDN sera basé sur l'espace de noms où lerule est défini, pas sur le service, alors assurez-vous d'utiliser le FQDN dans ce champ lorsque votre service d'application et votre service virtuel sont différents. espaces de noms. Pour en savoir plus sur le système de noms de domaine (DNS) Kubernetes de manière plus générale, consultezAn Introduction to the Kubernetes DNS Service.

Enregistrez et fermez le fichier une fois l’édition terminée.

Une fois vos fichiersyaml en place, vous pouvez créer le service et le déploiement de votre application, ainsi que les objets de passerelle et de service virtuel qui permettront d'accéder à votre application.

[[step-5 -—- creation-application-resources-and-enabled-telemetry-access]] == Étape 5 - Création de ressources d'application et activation de l'accès à la télémétrie

Une fois que vous avez créé vos objets Service et Déploiement d’application, ainsi qu’une passerelle et un service virtuel, vous pourrez générer des requêtes vers votre application et consulter les données associées dans vos tableaux de bord Istio Grafana. Cependant, vous devrez d'abord configurer Istio pour exposer l'addon Grafana afin de pouvoir accéder aux tableaux de bord de votre navigateur.

Nous allonsenable Grafana access with HTTP, mais lorsque vous travaillez en production ou dans des environnements sensibles, il est fortement recommandé deenable access with HTTPS.

Parce que nous avons défini l'option de configuration--set grafana.enabled=true lors de l'installation d'Istio dansStep 2, nous avons un service Grafana et un pod dans notre espace de nomsistio-system, ce que nous avons confirmé à cette étape.

Avec ces ressources déjà en place, notre prochaine étape consistera à créer un manifeste pour une passerelle et un service virtuel afin de pouvoir exposer l'addon Grafana.

Ouvrez le fichier pour le manifeste:

nano node-grafana.yaml

Ajoutez le code suivant au fichier pour créer une passerelle et un service virtuel afin d'exposer et d'acheminer le trafic vers le service Grafana:

~/istio_project/node-grafana.yaml

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: grafana-gateway
  namespace: istio-system
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 15031
      name: http-grafana
      protocol: HTTP
    hosts:
    - "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: grafana-vs
  namespace: istio-system
spec:
  hosts:
  - "*"
  gateways:
  - grafana-gateway
  http:
  - match:
    - port: 15031
    route:
    - destination:
        host: grafana
        port:
          number: 3000

Nos spécifications Grafana Gateway et Virtual Service sont similaires à celles que nous avons définies pour notre application Gateway et Virtual Service enStep 4. Il y a cependant quelques différences:

  • Grafana sera exposé sur le port nomméhttp-grafana (port15031), et il fonctionnera sur le port3000 sur l'hôte.

  • La passerelle et le service virtuel sont tous deux définis dans l'espace de nomsistio-system.

  • Lehost dans ce service virtuel est le servicegrafana dans l'espace de nomsistio-system. Étant donné que nous définissons cette règle dans le même espace de nom que celui utilisé par le service Grafana, le développement du nom de domaine complet fonctionnera à nouveau sans conflit.

[.note] #Note: Parce que notreMeshPolicy actuel est configuré pour exécuter TLS danspermissive mode, nous n'avons pas besoin d'appliquer unDestination Rule à notre manifeste. Si vous avez sélectionné un profil différent avec votre installation Istio, vous devrez ajouter une règle de destination pour désactiver le TLS mutuel lors de l'activation de l'accès à Grafana avec HTTP. Pour plus d'informations sur la façon de procéder, vous pouvez vous référer auxofficial Istio documentaion sur l'activation de l'accès aux modules complémentaires de télémétrie avec HTTP.
#

Enregistrez et fermez le fichier une fois l’édition terminée.

Créez vos ressources Grafana avec la commande suivante:

kubectl apply -f node-grafana.yaml

La commandekubectl apply vous permet d'appliquer une configuration particulière à un objet en cours de création ou de mise à jour. Dans notre cas, nous appliquons la configuration que nous avons spécifiée dans le fichiernode-grafana.yaml à nos objets Gateway et Virtual Service en cours de création.

Vous pouvez jeter un œil à la passerelle dans l'espace de nomsistio-system avec la commande suivante:

kubectl get gateway -n istio-system

Vous verrez la sortie suivante:

OutputNAME              AGE
grafana-gateway   47s

Vous pouvez faire la même chose pour le service virtuel:

kubectl get virtualservice -n istio-system
OutputNAME         GATEWAYS            HOSTS   AGE
grafana-vs   [grafana-gateway]   [*]     74s

Avec ces ressources créées, nous devrions pouvoir accéder à nos tableaux de bord Grafana dans le navigateur. Avant de le faire, cependant, créons notre service et déploiement d’application, ainsi que notre passerelle d’application et service virtuel, et vérifions que nous pouvons accéder à notre application dans le navigateur.

Créez l'application Service et déploiement avec la commande suivante:

kubectl apply -f node-app.yaml

Attendez quelques secondes, puis vérifiez les pods de votre application à l'aide de la commande suivante:

kubectl get pods
OutputNAME                      READY   STATUS    RESTARTS   AGE
nodejs-7759fb549f-kmb7x   2/2     Running   0          40s

Vos conteneurs d'application sont en cours d'exécution, comme vous pouvez le voir dans la colonneSTATUS, mais pourquoi la colonneREADY répertorie-t-elle2/2 si l'application manifeste deStep 3 n'a spécifié qu'un seul réplica?

Ce deuxième conteneur est le sidecar Envoy, que vous pouvez inspecter avec la commande suivante. Assurez-vous de remplacer le pod répertorié ici par lesNAME de votre propre podnodejs:

kubectl describe pod nodejs-7759fb549f-kmb7x
OutputName:               nodejs-7759fb549f-kmb7x
Namespace:          default
...
Containers:
  nodejs:
  ...
  istio-proxy:
    Container ID:  docker://f840d5a576536164d80911c46f6de41d5bc5af5152890c3aed429a1ee29af10b
    Image:         docker.io/istio/proxyv2:1.1.7
    Image ID:      docker-pullable://istio/proxyv2@sha256:e6f039115c7d5ef9c8f6b049866fbf9b6f5e2255d3a733bb8756b36927749822
    Port:          15090/TCP
    Host Port:     0/TCP
    Args:
    ...

Ensuite, créez votre application Gateway et Virtual Service:

kubectl apply -f node-istio.yaml

Vous pouvez inspecter la passerelle avec la commande suivante:

kubectl get gateway
OutputNAME             AGE
nodejs-gateway   7s

Et le service virtuel:

kubectl get virtualservice
OutputNAME     GATEWAYS           HOSTS   AGE
nodejs   [nodejs-gateway]   [*]     28s

Nous sommes maintenant prêts à tester l'accès à l'application. Pour ce faire, nous aurons besoin de l'adresse IP externe associée à notre serviceistio-ingressgateway, qui est unLoadBalancer Service type.

Obtenez l'adresse IP externe pour le serviceistio-ingressgateway avec la commande suivante:

kubectl get svc -n istio-system

Vous verrez une sortie comme celle-ci:

OutputNAME                     TYPE           CLUSTER-IP       EXTERNAL-IP       PORT(S)                                                                                                                                      AGE
grafana                  ClusterIP      10.245.85.162                3000/TCP                                                                                                                                     42m
istio-citadel            ClusterIP      10.245.135.45                8060/TCP,15014/TCP                                                                                                                           42m
istio-galley             ClusterIP      10.245.46.245                443/TCP,15014/TCP,9901/TCP                                                                                                                   42m
istio-ingressgateway     LoadBalancer   10.245.171.39    ingressgateway_ip 15020:30707/TCP,80:31380/TCP,443:31390/TCP,31400:31400/TCP,15029:30285/TCP,15030:31668/TCP,15031:32297/TCP,15032:30853/TCP,15443:30406/TCP   42m
istio-pilot              ClusterIP      10.245.56.97                 15010/TCP,15011/TCP,8080/TCP,15014/TCP                                                                                                       42m
istio-policy             ClusterIP      10.245.206.189               9091/TCP,15004/TCP,15014/TCP                                                                                                                 42m
istio-sidecar-injector   ClusterIP      10.245.223.99                443/TCP                                                                                                                                      42m
istio-telemetry          ClusterIP      10.245.5.215                 9091/TCP,15004/TCP,15014/TCP,42422/TCP                                                                                                       42m
prometheus               ClusterIP      10.245.100.132               9090/TCP                                                                                                                                     42m

Lesistio-ingressgateway doivent être le seul service avec lesTYPELoadBalancer, et le seul service avec une adresse IP externe.

Accédez à cette adresse IP externe dans votre navigateur:http://ingressgateway_ip.

Vous devriez voir la page de destination suivante:

Application Landing Page

Ensuite, générez une charge sur le site en cliquant sur Actualiser cinq ou six fois.

Vous pouvez maintenant consulter le tableau de bord Grafana pour examiner les données de trafic.

Dans votre navigateur, accédez à l'adresse suivante, en utilisant à nouveau votre IP externeistio-ingressgateway et le port que vous avez défini dans votre manifeste Grafana Gateway:http://ingressgateway_ip:15031.

Vous verrez la page de destination suivante:

Grafana Home Dash

Cliquer surHome en haut de la page vous amènera à une page avec un dossieristio. Pour obtenir une liste d'options déroulantes, cliquez sur l'icône du dossieristio:

Istio Dash Options Dropdown Menu

Dans cette liste d'options, cliquez surIstio Service Dashboard.

Cela vous mènera à une page de destination avec un autre menu déroulant:

Service Dropdown in Istio Service Dash

Sélectionneznodejs.default.svc.cluster.local dans la liste des options disponibles.

Vous pourrez maintenant consulter les données de trafic pour ce service:

Nodejs Service Dash

Vous avez maintenant une application Node.js fonctionnelle fonctionnant dans un maillage de service Istio avec Grafana activé et configuré pour un accès externe.

Conclusion

Dans ce didacticiel, vous avez installé Istio à l'aide du gestionnaire de packages Helm et vous l'avez utilisé pour exposer un service d'application Node.js à l'aide d'objets Gateway et Virtual Service. Vous avez également configuré les objets Gateway et Virtual Service pour exposer l'addon de télémétrie Grafana, afin d'examiner les données de trafic de votre application.

Au fur et à mesure que vous passez à la production, vous souhaiterez prendre des mesures telles quesecuring your application Gateway with HTTPS et vous assurer que l'accès à votre service Grafana est égalementsecure.

Vous pouvez également explorer d'autrestelemetry-related tasks, y compriscollecting and processing metrics,logs ettrace spans.

Related