• 12 heures
  • Difficile

Ce cours est visible gratuitement en ligne.

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 25/09/2024

Publiez votre application à l'extérieur

Générez une url pour accéder à votre application

Durant le premier chapitre de cette troisième partie, vous avez appris à utiliser l’API Service, qui vous permet d’exposer l’application à l’intérieur du cluster, à destination des autres services. Mais le site web LiveCorp a besoin d’être exposé à l’extérieur du cluster à des utilisateurs.

La façon la plus simple est de générer une URL afin d’accéder au service depuis l’extérieur du cluster. Le service va alors utiliser un NodePort pour exposer le service à l’extérieur. Pour générer un service de type NodePort, il vous faut pour cela taper la commande :

minikube service site-ecommerce-service --url
http://127.0.0.1:57123
❗  Because you are using a Docker driver on darwin, the terminal needs to be open to run it.

Minikube va alors modifier le service afin de l’exposer sur un des ports de la machine virtuelle ou tourne l’application. Vous pouvez alors vous connecter à l’application avec l’URL générée.

Cependant, un service de type NodePort ne fonctionne bien que s’il y a qu’une seule machine virtuelle, et peut ne pas être supporté dans d’autres cas. Pour pallier ce problème, il existe un autre service de type LoadBalancer.

Un LoadBalancer est la voie normale pour exposer un service à l’extérieur du cluster. Avec cette méthode, chaque service à sa propre adresse IP. La commande suivante va démarrer un LoadBalancer qui pourra être utilisé par les services pour exposer les applications.

minikube tunnel

Cette commande démarre un processus créant une route réseau sur la machine virtuelle utilisant l’adresse IP du cluster comme une gateway. Une fois le tunnel démarré, vous pouvez exposer votre application via le LoadBalancer créé.

Il faut alors modifier légèrement le service en lui demandant d’utiliser un LoadBalancer.

Voici le manifeste de déploiement modifié :

apiVersion: v1
kind: Service
metadata:
name: site-ecommerce-service
labels:
app: site-ecommerce
spec:
selector:
app: site-ecommerce
ports:
- protocol: TCP
port: 80
targetPort: 8080
  type: LoadBalancer

Vous remarquez le type de service qui est maintenant un LoadBalancer. Appliquez de nouveau le fichier sur le cluster pour modifier la définition du service :

kubectl apply -f site-ecommerce-service.yaml

Le cluster va alors modifier la définition du service et lui attacher l’adresse IP du LoadBalancer. Vous pouvez vérifier que l’adresse IP du LoadBalancer à bien été attaché au service grâce à la commande :

kubectl get svc
NAME                 TYPE       CLUSTER-IP   EXTERNAL-IP   PORT(S)      AGE
kubernetes           ClusterIP  10.96.0.1    <none>    443/TCP      26d
site-ecommerce-service   LoadBalancer   10.99.100.165 127.0.0.1 80:32715/TCP 30s

Exposer un service à travers un LoadBalancer est utile, mais des fois, cela n’est pas suffisant. Pour cela, il existe une API Ingress qui expose une application au travers d’une URL, masquant ainsi l’IP du LoadBalancer, et permettant d’exposer plusieurs applications au travers du même LoadBalancer.

Voici un schéma de fonctionnement de l’API Ingress ainsi que les flux réseaux associés :

Fonctionnement d'Ingress décrivant les flux réseaux associés
Fonctionnement d'Ingress

Découvrez Ingress

Vous avez pu découvrir avec le service comment exposer votre application au sein du cluster Kubernetes. Mais le site web de LiveCorp a besoin d’être accédé à l’extérieur du cluster par des utilisateurs. C’est là où intervient la ressource Ingress.

Ingress est un objet Kubernetes qui joue un rôle crucial dans la gestion du trafic entrant vers les services déployés au sein d'un cluster Kubernetes. Il agit comme un reverse proxy intelligent, permettant de router les requêtes HTTP et HTTPS vers les bons services en fonction de règles de routage configurées.

Voici le manifeste pour exposer le site web à l’extérieur du cluster :

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: site-ecommerce-ingress
spec:
ingressClassName: nginx
rules:
- host: site-ecommerce.example
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: site-ecommerce-service
port:
number: 80

Expliquons un peu ce fichier.

Le premier bloc est l’API à utiliser. Dans notre cas, nous utilisons l’API networking, différentes des autres API jusqu’alors utilisée :

apiVersion: networking.k8s.io/v1

Ensuite, le fichier déclare la ressource Ingress afin d’indiquer au cluster de créer un objet de type Ingress :

```
kind: Ingress
```

La section d’après déclare les différentes métadonnées comme le nom de la ressource :

metadata:
name: site-ecommerce-ingress

La section d’après indique que la ressource Ingress va utiliser la classe Nginx, qui est la classe par défaut dans minikube :

spec:
ingressClassName: nginx

Enfin, la dernière section définit les règles de routage. Cela va indiquer à quel service est envoyé le trafic entrant.

rules:
- host: site-ecommerce.example
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: site-ecommerce-service
port:
number: 80

Décortiquons ce bloc. Dans un premier temps, le fichier va définir l’URL complète ou est accessible le site web. Ici, le site web sera accessible depuis l’url : site-ecommerce.example.

- host: site-ecommerce.example

Ensuite, le fichier défini le chemin par défaut. Ici, le chemin est la racine du site web.

http:
paths:
- path: /

Cela veut dire que l’Ingress traitera toutes les demandes envoyées au site web. Puis, le fichier indique que le chemin sera traité par le préfixe /.

pathType: Prefix

Enfin, le fichier spécifie le backend où envoyer le trafic. Pour que Kubernetes sache ou envoyer le trafic, il faut qu’il puisse identifier le service sur lequel envoyer les requêtes. Un service est identifié par son nom. Ici, toutes ces requêtes seront envoyées sur le service qui s’appelle site-ecommerce-service.

backend:
service:
name: site-ecommerce-service

La dernière étape est d’envoyer les données sur le port exposé du service. Dans notre cas, le port identifié est le port 80 :

port:
number: 80

Avec tout cela, Kubernetes sait exactement comment envoyer le trafic, sur quel service ainsi que sur quel port.

Une ressource Ingress peut aussi être complétée par un certificat TLS afin d’assurer une sécurité du trafic entrant.

Écrivez votre premier fichier Ingress

C’est le moment d’écrire votre premier fichier Ingress.

1- Dans un premier temps, vous allez devoir activer l’ingress sur minikube.

minikube addons enable ingress

Le déploiement de l’ingress au sein de minikube peut prendre plusieurs minutes. Vous pouvez vérifier le bon déploiement avec la commande suivante :

kubectl get pods -n ingress-nginx
NAME                                    READY   STATUS  RESTARTS   AGE
ingress-nginx-admission-create-9dgl9    0/1 Completed   0      55s
ingress-nginx-admission-patch-nvz4b     0/1 Completed   0      55s
ingress-nginx-controller-768f948f8f-mxsdf   1/1 Running 0      55s

Une fois que l’ingress est déployé dans minikube, vous pouvez écrire votre fichier nommé ingress-site-web.yaml avec le contenu suivant :

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: site-ecommerce-ingress
spec:
ingressClassName: nginx
rules:
- host: site-ecommerce.example
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: site-ecommerce-service
port:
number: 80

2- L’étape ensuite est d’appliquer ce fichier sur le cluster minikube. Pour ce faire, vous pouvez utiliser la commande suivante :

kubectl apply -f ingress-site-web.yaml
ingress.networking.k8s.io/site-ecommerce-ingress created

3- Vous devriez voir que la commande a bien été exécutée. Vous pouvez aussi regarder que la ressource Ingress existe bien dans le cluster :

kubectl get ingress
NAME          CLASS   HOSTS             ADDRESS    PORTS   AGE
site-ecommerce-ingress   nginx   site-ecommerce.example   172.17.0.15 80  38s

Ici, la ressource Ingress a bien été créée et vous pouvez voir sur quel hôte la ressource écoute.

4- La dernière étape est d’accéder au service exposé. Dans un premier temps, vous allez accéder à l’Ingress via curl pour vérifier que l’Ingress fonctionne bien. Vu le fonctionnement de l’Ingress, il est nécessaire de donner l’url à curl afin de faire la résolution, dans votre cas site-ecommerce.example :

curl --resolve "site-ecommerce.example:80:$(minikube ip)" -i http://site-ecommerce.example

5- Enfin, pour vérifier que le site web s’affiche bien, vous allez modifier votre fichier hosts pour ajouter manuellement l’entrée DNS du site. Il faut pour ce faire récupérer l’IP de minikube avec la commande :

minikube ip

6- Notez l'adresse IP renvoyée (par exemple, 192.168.99.100). Puis, ajoutez une entrée dans votre fichier hosts :

192.168.99.100 site-ecommerce.example

7- Une fois la modification effectuée, vous pouvez accéder à l’application grâce à l’URL suivante http://site-ecommerce.example

Si tout est correctement configuré, vous devriez voir votre application s'afficher.

Dans ce screencast, vous avez :

  • activé l’ingress sur Minikube ;

  • configuré un ingress pour accéder à votre application ;

  • vérifié que vous accédez bien à votre application.

À vous de jouer

Contexte

Alice : Super ! Je vois que tu fais du bon travail ! L’application est maintenant capable d’être configurée à chaud, de persister les données et est accessible à tous les autres membres de l’équipe. La dernière étape est maintenant d’ouvrir l'application à nos utilisateurs. Peux-tu l’exposer sur Internet avec comme nom DNS : site-ecommerce.example ?

Consignes

  1. Activez l’addon ingress dans Minikube ;

  2. Créez une ressource Ingress avec le nom de domaine : site-ecommerce.example ;

  3. Vérifiez que l’ingress a bien été créé ;

  4. Créez une entrée dans le fichier hosts ;

  5. Accédez à l’application depuis votre navigateur.

En résumé

  • La ressource Ingress sert à exposer une application en dehors du cluster.

  • Un Ingress est toujours associé à un nom DNS public.

  • La communication peut être sécurisée avec un certificat TLS.

Dans le prochain chapitre, vous allez apprendre à packager votre application en utilisant toutes les notions vues précédemment.

Exemple de certificat de réussite
Exemple de certificat de réussite