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:
-
Un cluster Kubernetes 1.10+ avec le contrôle d'accès basé sur les rôles (RBAC) activé. Cette configuration utilisera unDigitalOcean Kubernetes cluster avec trois nœuds, mais vous êtes libre decreate a cluster using another method.
[.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.
#
-
L'outil de ligne de commande
kubectl
installé sur un serveur de développement et configuré pour se connecter à votre cluster. Vous pouvez en savoir plus sur l'installation dekubectl
dans lesofficial documentation. -
Helm installé sur votre serveur de développement et Tiller installé sur votre cluster, en suivant les instructions décrites dans les étapes 1 et 2 deHow To Install Software on Kubernetes Clusters with the Helm Package Manager.
-
Docker installé sur votre serveur de développement. Si vous travaillez avec Ubuntu 18.04, suivez les étapes 1 et 2 deHow To Install and Use Docker on Ubuntu 18.04; sinon, suivez lesofficial documentation pour obtenir des informations sur l'installation sur d'autres systèmes d'exploitation. Assurez-vous d'ajouter votre utilisateur non root au groupe
docker
, comme décrit à l'étape 2 du didacticiel lié. -
Un compteDocker Hub. Pour un aperçu de la façon de configurer cela, reportez-vous àthis introduction vers Docker Hub.
[[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:
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'étiquette
app: 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 étiquette
version
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 conteneurs
name
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:
-
Un
selector
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écification
servers
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 champ
hosts
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 champ
gateways
qui spécifie la passerelle via laquelle les demandes externes seront autorisées. Dans ce cas, c'est notre passerellenodejs-gateway
. -
Le champ
http
qui spécifie comment le trafic HTTP sera acheminé. -
Un champ
destination
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 noms
istio-system
. -
Le
host
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 lesTYPE
LoadBalancer
, 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:
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:
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:
Dans cette liste d'options, cliquez surIstio Service Dashboard.
Cela vous mènera à une page de destination avec un autre menu déroulant:
Sélectionneznodejs.default.svc.cluster.local
dans la liste des options disponibles.
Vous pourrez maintenant consulter les données de trafic pour ce service:
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.