

 **Aidez à améliorer cette page** 

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Pour contribuer à ce guide de l'utilisateur, cliquez sur le GitHub lien **Modifier cette page sur** qui se trouve dans le volet droit de chaque page.

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Déployer un exemple d’application sur Linux
<a name="sample-deployment"></a>

Dans cette rubrique, vous allez déployer un exemple d’application sur votre cluster sur des nœuds Linux.

## Prérequis
<a name="_prerequisites"></a>
+ Un cluster Kubernetes existant avec au moins un nœud. Si vous ne disposez pas d’un cluster Amazon EKS existant, vous pouvez en déployer un à l’aide de l’un des guides disponibles dans [Mise en route avec Amazon EKS](getting-started.md).
+  `Kubectl` installé sur votre ordinateur. Pour de plus amples informations, consultez [Configuration de `kubectl` et `eksctl`](install-kubectl.md).
+  `Kubectl` configuré pour communiquer avec votre cluster. Pour de plus amples informations, consultez [Connexion de kubectl à un cluster EKS en créant un fichier kubeconfig](create-kubeconfig.md).
+ Si vous prévoyez de déployer votre charge de travail d'exemple sur Fargate, vous devez disposer d'un [profil Fargate](fargate-profile.md) existant qui inclut le même espace de noms créé dans ce didacticiel, à savoir `eks-sample-app`, à moins que vous ne changiez le nom. Si vous avez créé un cluster à l’aide de l’un des guides disponibles dans [Mise en route avec Amazon EKS](getting-started.md), vous devrez créer un nouveau profil ou ajouter l’espace de noms à votre profil existant, car le profil créé dans les guides de démarrage ne spécifie pas l’espace de noms utilisé dans ce tutoriel. Votre VPC doit également disposer d'au moins un sous-réseau privé.

Bien que de nombreuses variables soient modifiables dans les étapes suivantes, nous vous recommandons de ne modifier les valeurs des variables qu'aux endroits spécifiés. Une fois que vous aurez mieux compris les pods, les déploiements et les services Kubernetes, vous pourrez essayer de modifier d’autres valeurs.

## Création d’un espace de noms
<a name="_create_a_namespace"></a>

Un espace de noms vous permet de regrouper des ressources dans Kubernetes. Pour plus d'informations, consultez [Espaces de noms](https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/) dans la documentation Kubernetes. Si vous prévoyez de déployer votre application exemple sur [Simplifier la gestion des ressources de calcul avec AWS Fargate](fargate.md), assurez-vous que la valeur du `namespace` dans votre [Définir les pods qui utilisent AWS Fargate lors de leur lancement](fargate-profile.md) est `eks-sample-app`.

```
kubectl create namespace eks-sample-app
```

## Créer un déploiement Kubernetes
<a name="_create_a_kubernetes_deployment"></a>

Créer un déploiement Kubernetes. Cet exemple de déploiement extrait une image de conteneur d’un référentiel public et en déploie trois réplicas (pods individuels) sur votre cluster. Pour en savoir plus, consultez [Déploiements](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/) dans la documentation Kubernetes.

1. Enregistrez le contenu suivant dans un fichier nommé `eks-sample-deployment.yaml`. Les conteneurs de l’application exemple n’utilisent pas de stockage réseau, mais vous pouvez avoir des applications qui en ont besoin. Pour de plus amples informations, consultez [Utiliser le stockage de données d’application pour votre cluster](storage.md).
   + Le `amd64` ou `arm64` `values` sous la clé `kubernetes.io/arch` signifient que l'application peut être déployée sur l'une ou l'autre architecture matérielle (si vous avez les deux dans votre cluster). Cela est possible car cette image est une image multi-architecture, mais toutes ne le sont pas. Vous pouvez déterminer l’architecture matérielle prise en charge par l’image en consultant les [détails de l’image](https://gallery.ecr.aws/nginx/nginx) dans le référentiel à partir duquel vous l’extrayez. Lorsque vous déployez des images qui ne prennent pas en charge un type d’architecture matérielle ou sur lequel vous ne voulez pas déployer l’image, supprimez ce type du manifeste. Pour plus d'informations, consultez [Étiquettes, annotations et rejets connus](https://kubernetes.io/docs/reference/labels-annotations-taints/) dans la documentation Kubernetes.
   + Le `kubernetes.io/os: linux` `nodeSelector` signifie que si vous possédez des nœuds Linux et Windows (par exemple) dans votre cluster, l'image ne sera déployée que sur des nœuds Linux. Pour plus d'informations, consultez [Étiquettes, annotations et rejets connus](https://kubernetes.io/docs/reference/labels-annotations-taints/) dans la documentation Kubernetes.

     ```
     apiVersion: apps/v1
     kind: Deployment
     metadata:
       name: eks-sample-linux-deployment
       namespace: eks-sample-app
       labels:
         app: eks-sample-linux-app
     spec:
       replicas: 3
       selector:
         matchLabels:
           app: eks-sample-linux-app
       template:
         metadata:
           labels:
             app: eks-sample-linux-app
         spec:
           affinity:
             nodeAffinity:
               requiredDuringSchedulingIgnoredDuringExecution:
                 nodeSelectorTerms:
                 - matchExpressions:
                   - key: kubernetes.io/arch
                     operator: In
                     values:
                     - amd64
                     - arm64
           containers:
           - name: nginx
             image: public.ecr.aws/nginx/nginx:1.23
             ports:
             - name: http
               containerPort: 80
             imagePullPolicy: IfNotPresent
           nodeSelector:
             kubernetes.io/os: linux
     ```

1. Appliquer le manifeste de déploiement à votre cluster.

   ```
   kubectl apply -f eks-sample-deployment.yaml
   ```

## Création d'un service
<a name="_create_a_service"></a>

Un service vous permet d'accéder à toutes les réplicas via une seule adresse IP ou un seul nom. Pour plus d'informations, consultez [Service](https://kubernetes.io/docs/concepts/services-networking/service/) dans la documentation Kubernetes. Bien que cela ne soit pas implémenté dans l’application exemple, si vous avez des applications qui doivent interagir avec d’autres services AWS, nous vous recommandons de créer des comptes de service Kubernetes pour vos pods et de les associer à des comptes AWS IAM. En spécifiant des comptes de service, vos pods ne disposent que des autorisations minimales que vous spécifiez pour qu'ils puissent interagir avec d'autres services. Pour de plus amples informations, consultez [Rôles IAM pour les comptes de service](iam-roles-for-service-accounts.md).

1. Enregistrez le contenu suivant dans un fichier nommé `eks-sample-service.yaml`. Kubernetes attribue au service sa propre adresse IP qui n'est accessible que depuis l'intérieur du cluster. Pour accéder au service depuis l'extérieur de votre cluster, déployez l'[AWS Load Balancer Controller](aws-load-balancer-controller.md) pour équilibrer la charge du trafic d'[application](alb-ingress.md) ou de [réseau](network-load-balancing.md) vers le service.

   ```
   apiVersion: v1
   kind: Service
   metadata:
     name: eks-sample-linux-service
     namespace: eks-sample-app
     labels:
       app: eks-sample-linux-app
   spec:
     selector:
       app: eks-sample-linux-app
     ports:
       - protocol: TCP
         port: 80
         targetPort: 80
   ```

1. Appliquer le manifeste du service à votre cluster.

   ```
   kubectl apply -f eks-sample-service.yaml
   ```

## Vérifier les ressources créées
<a name="sample-app-view-namespace"></a>

1. Affichez toutes les ressources présentes dans l'espace de noms `eks-sample-app`.

   ```
   kubectl get all -n eks-sample-app
   ```

   L'exemple qui suit illustre un résultat.

   ```
   NAME                                               READY   STATUS    RESTARTS   AGE
   pod/eks-sample-linux-deployment-65b7669776-m6qxz   1/1     Running   0          27m
   pod/eks-sample-linux-deployment-65b7669776-mmxvd   1/1     Running   0          27m
   pod/eks-sample-linux-deployment-65b7669776-qzn22   1/1     Running   0          27m
   
   NAME                               TYPE         CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
   service/eks-sample-linux-service   ClusterIP    10.100.74.8     <none>        80/TCP    32m
   
   NAME                                        READY   UP-TO-DATE   AVAILABLE   AGE
   deployment.apps/eks-sample-linux-deployment 3/3     3            3           27m
   
   NAME                                                      DESIRED   CURRENT   READY   AGE
   replicaset.apps/eks-sample-linux-deployment-776d8f8fd8    3         3         3       27m
   ```

   Dans la sortie, vous voyez le service et le déploiement spécifiés dans l'exemple de manifestes déployés dans les étapes précédentes. Vous voyez aussi trois pods. Ceci est dû au fait que `3` `replicas` ont été spécifiés dans l'exemple de manifeste. Pour plus d'informations sur les pods, consultez [pods](https://kubernetes.io/docs/concepts/workloads/pods/pod/) dans la documentation Kubernetes. Kubernetes crée automatiquement la ressource `replicaset`, même si elle n’est pas spécifiée dans les manifestes d’exemple. Pour plus d'informations sur `ReplicaSets`, veuillez consulter la section [ReplicaSet](https://kubernetes.io/docs/concepts/workloads/controllers/replicaset/) dans la documentation Kubernetes.
**Note**  
Kubernetes conserve le nombre de réplicas spécifié dans le manifeste. S’il s’agissait d’un déploiement en production et que vous vouliez que Kubernetes fasse mettre à l’échelle horizontalement le nombre de réplicas ou verticalement les ressources de calcul pour les pods, utilisez les options [Évoluer les déploiements de pods avec Horizontal Pod Autoscaler](horizontal-pod-autoscaler.md) et [Ajuster les ressources des pods avec Vertical Pod Autoscaler](vertical-pod-autoscaler.md) pour ce faire.

1. Affichez les détails du service déployé.

   ```
   kubectl -n eks-sample-app describe service eks-sample-linux-service
   ```

   L'exemple qui suit illustre un résultat.

   ```
   Name:              eks-sample-linux-service
   Namespace:         eks-sample-app
   Labels:            app=eks-sample-linux-app
   Annotations:       <none>
   Selector:          app=eks-sample-linux-app
   Type:              ClusterIP
   IP Families:       <none>
   IP:                10.100.74.8
   IPs:               10.100.74.8
   Port:              <unset>  80/TCP
   TargetPort:        80/TCP
   Endpoints:         192.168.24.212:80,192.168.50.185:80,192.168.63.93:80
   Session Affinity:  None
   Events:            <none>
   ```

   Dans la sortie précédente, la valeur de `IP:` est une adresse IP unique accessible depuis n’importe quel nœud ou pod du cluster, mais inaccessible depuis l’extérieur du cluster. Les valeurs de `Endpoints` sont des adresses IP attribuées depuis votre VPC aux pods qui font partie du service.

1. Visualisez les détails de l'un des pods listés en sortie lorsque vous avez [visualisé l'espace de noms](#sample-app-view-namespace) dans une étape précédente. Remplacez *776d8f8fd8-78w66* par la valeur renvoyée pour l’un de vos pods.

   ```
   kubectl -n eks-sample-app describe pod eks-sample-linux-deployment-65b7669776-m6qxz
   ```

   Exemple de sortie abrégée

   ```
   Name:         eks-sample-linux-deployment-65b7669776-m6qxz
   Namespace:    eks-sample-app
   Priority:     0
   Node:         ip-192-168-45-132.us-west-2.compute.internal/192.168.45.132
   [...]
   IP:           192.168.63.93
   IPs:
     IP:           192.168.63.93
   Controlled By:  ReplicaSet/eks-sample-linux-deployment-65b7669776
   [...]
   Conditions:
     Type              Status
     Initialized       True
     Ready             True
     ContainersReady   True
     PodScheduled      True
   [...]
   Events:
     Type    Reason     Age    From                                                 Message
     ----    ------     ----   ----                                                 -------
     Normal  Scheduled  3m20s  default-scheduler                                    Successfully assigned eks-sample-app/eks-sample-linux-deployment-65b7669776-m6qxz to ip-192-168-45-132.us-west-2.compute.internal
   [...]
   ```

   Dans la sortie précédente, la valeur de `IP:` est une adresse IP unique attribuée au pod à partir du bloc CIDR attribué au sous-réseau dans lequel se trouve le nœud. Si vous préférez attribuer aux pods des adresses IP à partir de différents blocs d'adresse CIDR, vous pouvez modifier le comportement par défaut. Pour de plus amples informations, consultez [Déploiement de pods dans des sous-réseaux alternatifs avec réseau personnalisé](cni-custom-network.md). Vous pouvez également voir que le planificateur Kubernetes a planifié le pod sur le `Node` avec l’adresse IP *192.168.45.132*.
**Astuce**  
Au lieu d’utiliser la ligne de commande, vous pouvez afficher de nombreux détails sur les pods, les services, les déploiements et d’autres ressources Kubernetes dans la AWS Management Console. Pour de plus amples informations, consultez [Consultez les ressources Kubernetes dans le AWS Management Console](view-kubernetes-resources.md).

## Exécuter un shell sur un pod
<a name="_run_a_shell_on_a_pod"></a>

1. Exécutez un shell sur le pod que vous avez décrit à l'étape précédente, en remplaçant *65b7669776-m6qxz* par l'ID de l'un de vos pods.

   ```
   kubectl exec -it eks-sample-linux-deployment-65b7669776-m6qxz -n eks-sample-app -- /bin/bash
   ```

1. À partir du shell du pod, affichez la sortie du serveur web qui a été installé avec votre déploiement à l’étape précédente. Vous devez uniquement spécifier le nom du service. Elle est résolue en adresse IP du service par CoreDNS, qui est déployé par défaut avec un cluster Amazon EKS.

   ```
   curl eks-sample-linux-service
   ```

   L'exemple qui suit illustre un résultat.

   ```
   <!DOCTYPE html>
   <html>
   <head>
   <title>Welcome to nginx!</title>
   [...]
   ```

1. À partir du shell du pod, affichez le serveur DNS pour le pod.

   ```
   cat /etc/resolv.conf
   ```

   L'exemple qui suit illustre un résultat.

   ```
   nameserver 10.100.0.10
   search eks-sample-app.svc.cluster.local svc.cluster.local cluster.local us-west-2.compute.internal
   options ndots:5
   ```

   Dans la sortie précédente, `10.100.0.10` est automatiquement affecté en tant que `nameserver` pour tous les pods déployés dans le cluster.

1. Déconnectez-vous du pod en tapant `exit`.

1. Une fois que vous avez terminé avec l’application exemple, vous pouvez supprimer l’espace de noms, le service et le déploiement exemple à l’aide de la commande suivante.

   ```
   kubectl delete namespace eks-sample-app
   ```

## Étapes suivantes
<a name="sample-deployment-next-steps"></a>

Après avoir déployé l’application exemple, vous pourriez vouloir essayer certains des exercices suivants :
+  [Router l’application et le trafic HTTP avec des Application Load Balancer](alb-ingress.md) 
+  [Router le trafic TCP et UDP avec des Network Load Balancer](network-load-balancing.md) 