# Utiliser un Service pour accéder à une application dans un cluster

LLMS index: [llms.txt](/llms.txt)

---

<!-- overview -->

Cette page montre comment créer un Service Kubernetes que des clients externes peuvent utiliser 
pour accéder à une application s'exécutant dans un cluster. 
Le Service fournit une répartition de charge pour une application 
ayant deux instances en cours d'exécution.

## Pré-requis

<p>Vous devez disposer d'un cluster Kubernetes et l'outil de ligne de commande kubectl doit être configuré pour communiquer avec votre cluster.
Si vous ne possédez pas déjà de cluster, vous pouvez en créer un en utilisant <a href="/docs/setup/minikube">Minikube</a>, ou vous pouvez utiliser l'un de ces environnements Kubernetes:</p>
<ul>
<li><a href="https://labs.iximiuz.com/playgrounds?category=kubernetes&filter=all">iximiuz Labs</a></li>
<li><a href="https://killercoda.com/playgrounds/scenario/kubernetes">Killercoda</a></li>
<li><a href="https://kodekloud.com/public-playgrounds">KodeKloud</a></li>
</ul>


## Objectifs

- Exécuter deux instances d'une application Hello World.
- Créer un Service qui expose un port du nœud.
- Utiliser le Service pour accéder à l'application en cours d'exécution.

<!-- lessoncontent -->

## Création d'un service pour une application s'exécutant dans deux pods

Voici le fichier de configuration pour le déploiement de l'application :


















<div class="highlight code-sample">
    <div class="copy-code-icon">
    <a href="https://raw.githubusercontent.com/kubernetes/website/main/content/fr/examples/service/access/hello-application.yaml" download="service/access/hello-application.yaml"><code>service/access/hello-application.yaml</code>
    </a><img src="/images/copycode.svg" class="icon-copycode" onclick="copyCode('service-access-hello-application-yaml')" title="Copy service/access/hello-application.yaml to clipboard"></img></div>
    <div class="includecode" id="service-access-hello-application-yaml"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">apps/v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">Deployment</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">hello-world</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">selector</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">matchLabels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">run</span><span class="p">:</span><span class="w"> </span><span class="l">load-balancer-example</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">replicas</span><span class="p">:</span><span class="w"> </span><span class="m">2</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">template</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">labels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">run</span><span class="p">:</span><span class="w"> </span><span class="l">load-balancer-example</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">containers</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">hello-world</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">us-docker.pkg.dev/google-samples/containers/gke/hello-app:2.0</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">ports</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span>- <span class="nt">containerPort</span><span class="p">:</span><span class="w"> </span><span class="m">8080</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">protocol</span><span class="p">:</span><span class="w"> </span><span class="l">TCP</span><span class="w">
</span></span></span></code></pre></div></div>
</div>

1. Exécutez une application Hello World dans votre cluster :
   Créez le déploiement de l'application en utilisant le fichier ci-dessus :

   ```shell
   kubectl apply -f https://k8s.io/examples/service/access/hello-application.yaml
   ```

   La commande précédente crée un
   <a class='glossary-tooltip' title='Objet API gérant une application répliquée.' data-bs-toggle='tooltip' data-bs-placement='top' href='/fr/docs/concepts/workloads/controllers/deployment/' target='_blank' aria-label='Deployment'>Deployment</a>
   et un
   <a class='glossary-tooltip' title='Un ReplicaSet garantit qu’un nombre spécifié de répliques de Pods sont en cours d’exécution à tout moment.' data-bs-toggle='tooltip' data-bs-placement='top' href='/fr/docs/concepts/workloads/controllers/replicaset/' target='_blank' aria-label='ReplicaSet'>ReplicaSet</a> associé.
   Le ReplicaSet possède deux
   <a class='glossary-tooltip' title='Le plus petit et le plus simple des objets Kubernetes. Un Pod est un ensemble de conteneurs fonctionnant sur votre cluster.' data-bs-toggle='tooltip' data-bs-placement='top' href='/fr/docs/concepts/workloads/pods/pod-overview/' target='_blank' aria-label='Pods'>Pods</a>,
   chacun exécutant l'application Hello World.

1. Affichez les informations du déploiement :

   ```shell
   kubectl get deployments hello-world
   kubectl describe deployments hello-world
   ```

1. Affichez les informations des ReplicaSet :

   ```shell
   kubectl get replicasets
   kubectl describe replicasets
   ```

1. Créez un Service qui expose le déploiement :

   ```shell
   kubectl expose deployment hello-world --type=NodePort --name=example-service
   ```

1. Affichez les informations sur le Service :

   ```shell
   kubectl describe services example-service
   ```

   Le résultat sera similaire à ceci :

   ```none
   Name:                   example-service
   Namespace:              default
   Labels:                 run=load-balancer-example
   Annotations:            <none>
   Selector:               run=load-balancer-example
   Type:                   NodePort
   IP:                     10.32.0.16
   Port:                   <unset> 8080/TCP
   TargetPort:             8080/TCP
   NodePort:               <unset> 31496/TCP
   Endpoints:              10.200.1.4:8080,10.200.2.5:8080
   Session Affinity:       None
   Events:                 <none>
   ```

   Notez la valeur de NodePort pour le service. Par exemple,
   dans le résultat précédent, la valeur de NodePort est 31496.

1. Répertoriez les pods qui exécutent l'application Hello World :

   ```shell
   kubectl get pods --selector="run=load-balancer-example" --output=wide
   ```

   Le résultat est similaire à ceci :

   ```none
   NAME                           READY   STATUS    ...  IP           NODE
   hello-world-2895499144-bsbk5   1/1     Running   ...  10.200.1.4   worker1
   hello-world-2895499144-m1pwt   1/1     Running   ...  10.200.2.5   worker2
   ```

1. Obtenez l'adresse IP publique de l'un de vos nœuds qui exécute
   un pod Hello World. L'obtention de cette adresse dépend de la manière dont vous avez configuré votre cluster. 
   Par exemple, si vous utilisez Minikube, vous pouvez
   voir l'adresse du nœud en exécutant `kubectl cluster-info`. Si vous utilisez
   des instances Google Compute Engine, vous pouvez utiliser la commande
   `gcloud compute instances list` pour voir les adresses publiques de vos
   nœuds.

1. Sur le nœud choisi, créez une règle de pare-feu autorisant le trafic TCP
   sur votre port. Par exemple, si votre Service a une valeur NodePort de
   31568, créez une règle de pare-feu autorisant le trafic TCP vers le port 31568. Différents
   fournisseurs cloud offrent différentes façons de configurer des règles de pare-feu.

1. Utilisez l'adresse du nœud et le port de nœud pour accéder à l'application Hello World :

   ```shell
   curl http://<adresse-ip-publique>:<port>
   ```

   où `<adresse-ip-publique>` est l'adresse IP publique de votre nœud,
   et `<port>` est la valeur de NodePort pour votre service. La
   réponse à une requête réussie est un message de bienvenue :

   ```none
   Hello, world!
   Version: 2.0.0
   Hostname: hello-world-2895499144-bsbk5
   ```

## Utilisation d'un fichier de configuration de service

Au lieu d'utiliser `kubectl expose`, vous pouvez utiliser un
[fichier de configuration de service](/docs/concepts/services-networking/service/)
pour créer un Service.

## Cleanup

Pour supprimer le Service, saisissez cette commande :

    kubectl delete services example-service

Pour supprimer le Déploiement, le ReplicaSet et les Pods qui exécutent
l'application Hello World, saisissez cette commande :

    kubectl delete deployment hello-world

## A suivre

Suivez le tutoriel
[Connecter des applications avec les Services](/docs/tutorials/services/connect-applications-service/).
