Exposer des applications Kubernetes

KubernetesBeginner
Pratiquer maintenant

Introduction

Dans ce laboratoire (lab), vous apprendrez à exposer des applications Kubernetes en utilisant diverses techniques, notamment en créant des services internes et externes, en utilisant les étiquettes (labels) et en explorant les bases de l'Ingress. Vous commencerez par configurer un cluster Kubernetes local à l'aide de Minikube, puis déployerez une application NGINX exemple et l'exposerez à la fois en interne et en externe. Vous explorerez également l'utilisation des étiquettes pour organiser et sélectionner des ressources, et enfin, vous apprendrez à propos de l'Ingress et verrez un exemple simple de fichier YAML pour l'Ingress.

Démarrer le cluster Kubernetes

Dans cette étape, vous apprendrez à démarrer et à vérifier un cluster Kubernetes local en utilisant Minikube. C'est une étape essentielle pour développer et tester des applications Kubernetes sur votre machine locale.

Tout d'abord, démarrez le cluster Minikube :

minikube start

Exemple de sortie :

😄  minikube v1.29.0 on Ubuntu 22.04
✨  Automatically selected the docker driver
📌  Using Docker driver with root permissions
🔥  Creating kubernetes in kubernetes cluster
🔄  Restarting existing kubernetes cluster
🐳  Preparing Kubernetes v1.26.1 on Docker 20.10.23...
🚀  Launching Kubernetes...
🌟  Enabling addons: storage-provisioner, default-storageclass
🏄  Done! kubectl is now configured to use "minikube" cluster and "default" namespace

Vérifiez l'état du cluster en utilisant plusieurs commandes :

minikube status
kubectl get nodes

Exemple de sortie pour minikube status :

minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured

Exemple de sortie pour kubectl get nodes :

NAME       STATUS   ROLES           AGE   VERSION
minikube   Ready    control-plane   1m    v1.26.1

Ces commandes confirment que :

  1. Minikube est en cours d'exécution avec succès.
  2. Un cluster Kubernetes local a été créé.
  3. Le cluster est prêt à être utilisé.
  4. Vous disposez d'un cluster mono - noeud avec des capacités de plan de contrôle.

Déployer une application exemple

Dans cette étape, vous apprendrez à créer et à déployer une application Kubernetes en utilisant un manifeste YAML. Nous allons créer un déploiement simple d'un serveur web NGINX pour démontrer le processus de définition et d'application de ressources Kubernetes.

Tout d'abord, créez un répertoire pour vos manifestes Kubernetes :

mkdir -p ~/project/k8s-manifests
cd ~/project/k8s-manifests

Créez un fichier YAML pour un déploiement NGINX :

nano nginx-deployment.yaml

Ajoutez le manifeste de déploiement suivant :

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          ports:
            - containerPort: 80

Enregistrez le fichier (Ctrl+X, puis Y, puis Entrée).

Appliquez le déploiement au cluster Kubernetes :

kubectl apply -f nginx-deployment.yaml

Exemple de sortie :

deployment.apps/nginx-deployment created

Vérifiez le déploiement et les pods :

kubectl get deployments
kubectl get pods

Exemple de sortie pour kubectl get deployments :

NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           1m

Exemple de sortie pour kubectl get pods :

NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-xxx-yyy            1/1     Running   0          1m
nginx-deployment-xxx-zzz            1/1     Running   0          1m
nginx-deployment-xxx-www            1/1     Running   0          1m

Attendez que les pods soient dans l'état "Running" avant de continuer.

Analysons le manifeste YAML :

  • apiVersion : Spécifie la version de l'API Kubernetes.
  • kind : Définit le type de ressource (Déploiement).
  • metadata : Fournit le nom et les étiquettes (labels) pour le déploiement.
  • spec.replicas : Définit le nombre de replicas de pods.
  • selector : Aide le déploiement à gérer les bons pods.
  • template : Définit la spécification du pod.
  • containers : Spécifie l'image du conteneur et le port.

Ce déploiement crée trois pods NGINX identiques, démontrant ainsi comment Kubernetes gère les applications conteneurisées.

Créer un service via YAML pour exposer l'application en interne ou en externe

Dans cette étape, vous apprendrez à créer des services Kubernetes pour exposer votre déploiement NGINX en interne et en externe. Nous allons démontrer deux types de services courants : ClusterIP et NodePort.

Tout d'abord, accédez à votre répertoire de projet :

cd ~/project/k8s-manifests

Créez un fichier YAML pour le service ClusterIP :

nano nginx-clusterip-service.yaml

Ajoutez le manifeste de service suivant :

apiVersion: v1
kind: Service
metadata:
  name: nginx-clusterip-service
spec:
  selector:
    app: nginx
  type: ClusterIP
  ports:
    - port: 80
      targetPort: 80

Maintenant, créez un fichier YAML pour le service NodePort :

nano nginx-nodeport-service.yaml

Ajoutez le manifeste de service suivant :

apiVersion: v1
kind: Service
metadata:
  name: nginx-nodeport-service
spec:
  selector:
    app: nginx
  type: NodePort
  ports:
    - port: 80
      targetPort: 80
      nodePort: 30080

Appliquez les deux configurations de service :

kubectl apply -f nginx-clusterip-service.yaml
kubectl apply -f nginx-nodeport-service.yaml

Exemple de sortie :

service/nginx-clusterip-service created
service/nginx-nodeport-service created

Vérifiez les services :

kubectl get services

Exemple de sortie :

NAME                        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes                  ClusterIP   10.96.0.1        <none>        443/TCP        30m
nginx-clusterip-service     ClusterIP   10.104.xxx.xxx   <none>        80/TCP         1m
nginx-nodeport-service      NodePort    10.108.yyy.yyy   <none>        80:30080/TCP   1m

Pour accéder au service NodePort, obtenez l'adresse IP de Minikube :

minikube ip

Exemple de sortie :

192.168.49.2

Principales différences entre les types de services :

  • ClusterIP : Accès interne au cluster uniquement.
  • NodePort : Expose le service sur un port statique de l'adresse IP de chaque nœud.
  • Plage de ports NodePort : 30000 - 32767.

Vérifier la configuration du service

Dans cette étape, vous apprendrez à utiliser la commande kubectl describe service pour inspecter la configuration détaillée des services Kubernetes et comprendre leurs propriétés réseau.

Tout d'abord, assurez-vous d'être dans le répertoire du projet :

cd ~/project/k8s-manifests

Décrivons en détail le service ClusterIP :

kubectl describe service nginx-clusterip-service

Exemple de sortie :

Name:              nginx-clusterip-service
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          app=nginx
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.104.xxx.xxx
IPs:               10.104.xxx.xxx
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         10.244.0.7:80,10.244.0.8:80,10.244.0.9:80
Session Affinity:  None
Events:            <none>

Maintenant, décrivons le service NodePort :

kubectl describe service nginx-nodeport-service

Exemple de sortie :

Name:                     nginx-nodeport-service
Namespace:                default
Labels:                   <none>
Annotations:              <none>
Selector:                 app=nginx
Type:                     NodePort
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       10.108.yyy.yyy
IPs:                      10.108.yyy.yyy
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  30080/TCP
Endpoints:                10.244.0.7:80,10.244.0.8:80,10.244.0.9:80
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

Inspectez les points d'accès (endpoints) du service pour vérifier la connectivité réseau :

kubectl get endpoints

Exemple de sortie :

NAME                        ENDPOINTS                               AGE
kubernetes                  192.168.49.2:8443                       45m
nginx-clusterip-service     10.244.0.7:80,10.244.0.8:80,10.244.0.9:80   15m
nginx-nodeport-service      10.244.0.7:80,10.244.0.8:80,10.244.0.9:80   15m

Informations clés à comprendre à partir de la description du service :

  • Sélecteur (Selector) : Montre quels pods font partie du service.
  • Adresse IP (IP) : Adresse IP interne au cluster du service.
  • Points d'accès (Endpoints) : Liste des adresses IP et des ports des pods qui servent le service.
  • Port et Port cible (Port et TargetPort) : Définissent comment le trafic est acheminé.
  • Port du nœud (NodePort) : Port externe pour le type de service NodePort.

Utiliser les étiquettes (labels) pour organiser et sélectionner les ressources

Dans cette étape, vous apprendrez à utiliser les étiquettes (labels) dans Kubernetes pour organiser et sélectionner efficacement des ressources. Les étiquettes sont des paires clé - valeur qui vous aident à gérer et à organiser les objets Kubernetes.

Tout d'abord, vérifiez les étiquettes actuelles de vos pods :

kubectl get pods --show-labels

Exemple de sortie :

NAME                                READY   STATUS    RESTARTS   AGE   LABELS
nginx-deployment-xxx-yyy            1/1     Running   0          30m   app=nginx,pod-template-hash=xxx
nginx-deployment-xxx-zzz            1/1     Running   0          30m   app=nginx,pod-template-hash=yyy
nginx-deployment-xxx-www            1/1     Running   0          30m   app=nginx,pod-template-hash=zzz

Sélectionnez des pods en utilisant des étiquettes spécifiques :

kubectl get pods -l app=nginx

Exemple de sortie :

NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-xxx-yyy            1/1     Running   0          30m
nginx-deployment-xxx-zzz            1/1     Running   0          30m
nginx-deployment-xxx-www            1/1     Running   0          30m

Ajoutons une étiquette personnalisée à l'un des pods :

kubectl label pods nginx-deployment-xxx-yyy environment=development

Remplacez nginx-deployment-xxx-yyy par le nom d'un de vos pods.

Exemple de sortie :

pod/nginx-deployment-xxx-yyy labeled

Maintenant, sélectionnez des pods avec plusieurs sélecteurs d'étiquettes :

kubectl get pods -l app=nginx,environment=development

Exemple de sortie :

NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-xxx-yyy            1/1     Running   0          30m

Supprimez une étiquette d'un pod :

kubectl label pods nginx-deployment-xxx-yyy environment-

Exemple de sortie :

pod/nginx-deployment-xxx-yyy unlabeled

Démontrons la sélection d'étiquettes dans les services :

kubectl describe service nginx-clusterip-service

Recherchez la section "Selector", qui montre comment les services utilisent les étiquettes pour identifier les pods.

Points clés sur les étiquettes :

  • Les étiquettes sont des paires clé - valeur attachées aux objets Kubernetes.
  • Elles sont utilisées pour organiser, sélectionner et filtrer des ressources.
  • Elles peuvent être ajoutées, modifiées ou supprimées dynamiquement.
  • Les services et les déploiements utilisent les étiquettes pour gérer les pods associés.

Supprimer et gérer les services

Dans cette étape, vous allez apprendre à supprimer et gérer les services Kubernetes en utilisant les commandes kubectl. Comprendre la gestion des services est crucial pour maintenir et nettoyer vos ressources Kubernetes.

Tout d'abord, liste les services actuels :

kubectl get services

Exemple de sortie :

NAME                        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes                  ClusterIP   10.96.0.1        <none>        443/TCP        1h
nginx-clusterip-service     ClusterIP   10.104.xxx.xxx   <none>        80/TCP         45m
nginx-nodeport-service      NodePort    10.108.yyy.yyy   <none>        80:30080/TCP   45m

Supprimez un service spécifique en utilisant kubectl delete :

kubectl delete service nginx-clusterip-service

Exemple de sortie :

service "nginx-clusterip-service" deleted

Vérifiez la suppression du service :

kubectl get services

Exemple de sortie :

NAME                        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes                  ClusterIP   10.96.0.1        <none>        443/TCP        1h
nginx-nodeport-service      NodePort    10.108.yyy.yyy   <none>        80:30080/TCP   45m

Pour démontrer plus clairement la suppression de plusieurs services, recréons nos services puis supprimons-les ensemble :

## Recreate services
kubectl apply -f nginx-clusterip-service.yaml
kubectl apply -f nginx-nodeport-service.yaml
## Delete multiple services at once
kubectl delete service nginx-clusterip-service nginx-nodeport-service

Exemple de sortie :

service "nginx-clusterip-service" deleted
service "nginx-nodeport-service" deleted

Vérifiez que tous les services ont été supprimés (à l'exception du service kubernetes par défaut) :

kubectl get services

Exemple de sortie :

NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   1h

Points clés concernant la suppression de services :

  • La suppression d'un service supprime le point d'accès réseau
  • Les pods ne sont pas supprimés lorsqu'un service est supprimé
  • Le service kubernetes par défaut ne peut pas être supprimé
  • Vous pouvez supprimer des services en utilisant le nom, un fichier YAML ou des étiquettes (labels)
  • Plusieurs services peuvent être supprimés simultanément en les listant ou en utilisant des sélecteurs d'étiquettes

Présentation des bases de l'ingress et exemple simple de fichier YAML pour l'ingress

Dans cette étape, vous allez apprendre ce qu'est l'ingress Kubernetes, un moyen puissant de gérer l'accès externe aux services dans un cluster Kubernetes.

Qu'est-ce que l'ingress ?

L'ingress est un objet API qui gère l'accès externe aux services dans un cluster Kubernetes, généralement via HTTP. L'ingress offre les fonctionnalités suivantes :

  • Équilibrage de charge : Répartit le trafic entre plusieurs services back-end.
  • Terminaison SSL/TLS : Gère les connexions sécurisées.
  • Hébergement virtuel basé sur le nom : Route les requêtes vers différents services en fonction du nom d'hôte.
  • Routage basé sur le chemin : Route les requêtes vers différents services en fonction du chemin de l'URL.

L'ingress se compose de deux composants :

  1. Ressource Ingress : Un objet API Kubernetes qui définit les règles de routage.
  2. Contrôleur Ingress : L'implémentation qui applique les règles définies dans la ressource Ingress.

Remarque : Ce laboratoire ne propose qu'une introduction de base à l'ingress. Dans les environnements de production, les configurations d'ingress peuvent être beaucoup plus complexes, notamment avec des routages avancés, de l'authentification, des limitations de débit, etc.

Activons l'addon Ingress dans Minikube :

minikube addons enable ingress

Exemple de sortie :

💡  ingress est un addon maintenu par Kubernetes. Pour toute question, contactez minikube sur GitHub.
🔉  ingress a été activé avec succès

Créons un déploiement pour deux applications d'exemple :

kubectl create deployment web1 --image=nginx:alpine
kubectl create deployment web2 --image=httpd:alpine

Exposons ces déploiements sous forme de services :

kubectl expose deployment web1 --port=80 --type=ClusterIP --name=web1-service
kubectl expose deployment web2 --port=80 --type=ClusterIP --name=web2-service

Créons un fichier YAML pour l'ingress :

nano ingress-example.yaml

Ajoutons la configuration d'ingress suivante :

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
    - http:
        paths:
          - path: /web1
            pathType: Prefix
            backend:
              service:
                name: web1-service
                port:
                  number: 80
          - path: /web2
            pathType: Prefix
            backend:
              service:
                name: web2-service
                port:
                  number: 80

Composants clés de cette configuration d'ingress :

  • metadata.annotations : Configurations spécifiques pour le contrôleur Ingress.
  • spec.rules : Définissent comment le trafic est routé vers les services.
  • path : Chemin d'URL qui sera correspondu.
  • pathType : Comment le chemin doit être correspondu (Prefix, Exact ou ImplementationSpecific).
  • backend.service : Le service et le port vers lesquels le trafic sera routé.

Appliquons la configuration d'ingress :

kubectl apply -f ingress-example.yaml

Vérifions la ressource Ingress :

kubectl get ingress

Exemple de sortie :

NAME              CLASS   HOSTS   ADDRESS        PORTS   AGE
example-ingress   nginx   *       192.168.49.2   80      1m

Voyons les détails de l'ingress :

kubectl describe ingress example-ingress

La sortie de l'exemple montrera les règles de routage et les services back-end.

Testons l'ingress :

## Obtenez l'adresse IP de Minikube
minikube ip

## Testez l'accès aux services via l'ingress
curl $(minikube ip)/web1
curl $(minikube ip)/web2

Chaque commande devrait retourner la page par défaut du serveur web correspondant.

Dans les environnements de production, l'ingress peut être configuré avec :

  • Plusieurs règles basées sur le nom d'hôte.
  • Des certificats TLS pour HTTPS.
  • Des mécanismes d'authentification.
  • Des limitations de débit.
  • Des configurations de délai d'attente personnalisées.
  • Une affinité de session.
  • Et de nombreuses autres fonctionnalités avancées.

Pour une couverture plus complète de l'ingress, reportez-vous à la documentation de Kubernetes et envisagez d'explorer la documentation des contrôleurs d'ingress dédiés comme l'ingress NGINX ou Traefik.

Résumé

Dans ce laboratoire, vous avez appris à démarrer et à vérifier un cluster Kubernetes local en utilisant Minikube, ce qui est essentiel pour développer et tester des applications Kubernetes sur votre machine locale. Vous avez ensuite créé et déployé un simple déploiement de serveur web NGINX en utilisant un manifeste YAML, démontrant le processus de définition et d'application de ressources Kubernetes. De plus, vous avez appris à créer un service Kubernetes pour exposer votre application en interne ou en externe, ainsi qu'à utiliser des étiquettes (labels) pour organiser et sélectionner des ressources. Enfin, vous avez exploré les bases de l'Ingress Kubernetes et avez vu un exemple simple de YAML pour Ingress.