Déployer un exemple d'application - Amazon EKS

Aidez à améliorer cette page

Vous souhaitez contribuer à ce guide de l'utilisateur ? Faites défiler cette page vers le bas et sélectionnez Modifier cette page sur GitHub. Vos contributions aideront à améliorer notre guide de l'utilisateur pour tout le monde.

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

Dans cette rubrique, vous déployez un exemple d'application sur votre cluster.

Prérequis
  • Un cluster Kubernetes existant avec au moins un nœud. Si vous n'avez pas de cluster Amazon EKS existant, vous pouvez en déployer un en utilisant l'un des guides Mise en route avec Amazon EKS. Si vous déployez une application Windows, vous devez avoir la prise en charge de Windows activée pour votre cluster et au moins un nœud Amazon EC2 Windows.

  • Kubectl installé sur votre ordinateur. Pour plus d’informations, consultez Configurez kubectl et eksctl.

  • Kubectl configuré pour communiquer avec votre cluster. Pour plus d’informations, consultez Connectez-vous kubectl à un cluster EKS en créant un kubeconfig fichier.

  • Si vous prévoyez de déployer votre charge de travail d'exemple sur Fargate, vous devez disposer d'un profil Fargate 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 utilisé l'un des guides de démarrage pour créer votre cluster, 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 didacticiel. Votre VPC doit également disposer d'au moins un sous-réseau privé.

Pour déployer un exemple d'application

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 une meilleure compréhension des Pods, des déploiements et des services Kubernetes, vous pourrez expérimenter la modification d'autres valeurs.

  1. Créez un espace de noms . Un espace de noms vous permet de regrouper des ressources dans Kubernetes. Pour plus d'informations, consultez Espaces de noms dans la documentation Kubernetes. Si vous prévoyez de déployer votre application d'exemple vers AWS Fargate, assurez-vous que la valeur de namespace dans votre AWS Fargate profil est eks-sample-app.

    kubectl create namespace eks-sample-app
  2. Créez 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épliques (Pods individuels) sur votre cluster. Pour en savoir plus, consultez Déploiements dans la documentation Kubernetes. Vous pouvez déployer l'application sur des nœuds Linux ou Windows. Si vous déployez sur Fargate, vous ne pouvez déployer qu'une application Linux.

    1. Enregistrez le contenu suivant dans un fichier nommé eks-sample-deployment.yaml. Les conteneurs de l'application d'exemple n'utilisent pas de stockage réseau, mais vous pouvez avoir des applications qui en ont besoin. Pour plus d’informations, consultez Stocker les données des applications.

      Linux

      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 dans le référentiel d'où vous la retirez. Lorsque vous déployez des images qui ne prennent pas en charge un type d'architecture matérielle, ou pour lesquelles vous ne souhaitez pas que l'image soit déployée, supprimez ce type du manifeste. Pour plus d'informations, consultez Étiquettes, annotations et rejets connus dans la documentation Kubernetes.

      Le nodeSelector de kubernetes.io/os: linux 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 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
      Windows

      Le nodeSelector de kubernetes.io/os: windows signifie que si vous possédez des nœuds Windows et Linux (par exemple) dans votre cluster, l'image ne sera déployée que sur des nœuds Windows. Pour plus d'informations, consultez Étiquettes, annotations et rejets connus dans la documentation Kubernetes.

      apiVersion: apps/v1 kind: Deployment metadata: name: eks-sample-windows-deployment namespace: eks-sample-app labels: app: eks-sample-windows-app spec: replicas: 3 selector: matchLabels: app: eks-sample-windows-app template: metadata: labels: app: eks-sample-windows-app spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: beta.kubernetes.io/arch operator: In values: - amd64 containers: - name: windows-server-iis image: mcr.microsoft.com/windows/servercore:ltsc2019 ports: - name: http containerPort: 80 imagePullPolicy: IfNotPresent command: - powershell.exe - -command - "Add-WindowsFeature Web-Server; Invoke-WebRequest -UseBasicParsing -Uri 'https://dotnetbinaries.blob.core.windows.net/servicemonitor/2.0.1.6/ServiceMonitor.exe' -OutFile 'C:\\ServiceMonitor.exe'; echo '<html><body><br/><br/><marquee><H1>Hello EKS!!!<H1><marquee></body><html>' > C:\\inetpub\\wwwroot\\default.html; C:\\ServiceMonitor.exe 'w3svc'; " nodeSelector: kubernetes.io/os: windows
    2. Appliquer le manifeste de déploiement à votre cluster.

      kubectl apply -f eks-sample-deployment.yaml
  3. Créer un service. 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 dans la documentation Kubernetes. Bien que cela ne soit pas implémenté dans l'exemple d'application, si certaines applications doivent interagir avec d'autres AWS services, nous vous recommandons de créer des comptes de Kubernetes service pour votre Pods compte 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 plus d’informations, consultez Rôles IAM pour les comptes de service.

    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 pour équilibrer la charge du trafic d'application ou de réseau vers le service.

      Linux
      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
      Windows
      apiVersion: v1 kind: Service metadata: name: eks-sample-windows-service namespace: eks-sample-app labels: app: eks-sample-windows-app spec: selector: app: eks-sample-windows-app ports: - protocol: TCP port: 80 targetPort: 80
    2. Appliquer le manifeste du service à votre cluster.

      kubectl apply -f eks-sample-service.yaml
  4. 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.

    Si vous avez déployé des ressources Windows, toutes les instances de linux dans la sortie suivante sont windows. Les autres exemples de valeurs peuvent être différents de votre sortie.

    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 la rubrique Pods dans la documentation Kubernetes. Kubernetes crée automatiquement la ressource replicaset, même si cela n'est pas spécifié dans l'exemple de manifestes. Pour plus d'informationsReplicaSets, consultez ReplicaSetla Kubernetes documentation.

    Note

    Kubernetes conserve le nombre de réplicas spécifié dans le manifeste. S'il s'agissait d'un déploiement de production et que vous souhaitiez que Kubernetes mette à l'échelle horizontalement le nombre de réplicas ou qu'il mette à l'échelle verticalement les ressources de calcul pour les Pods, pour ce faire, utilisez le Faites évoluer les déploiements de pods avec Horizontal Pod Autoscaler et le Ajustez les ressources du pod avec Vertical Pod Autoscaler.

  5. Affichez les détails du service déployé. Si vous avez déployé un service Windows, remplacez linux par windows.

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

    L'exemple qui suit illustre un résultat.

    Si vous avez déployé des ressources Windows, toutes les instances de linux dans la sortie suivante sont windows. Les autres exemples de valeurs peuvent être différents de votre sortie.

    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 pour IP: est une adresse IP unique qui peut être atteinte à partir de n'importe quel nœud ou Pod dans le cluster, mais elle ne peut pas être atteinte de l'extérieur du cluster. Les valeurs pour Endpoints sont des adresses IP attribuées depuis votre VPC aux Pods qui font partie du service.

  6. Visualisez les détails de l'un des Pods listés dans la sortie lorsque vous avez visualisé l'espace de noms dans une étape précédente. Si vous avez déployé une application Windows, remplacez linux par windows et 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

    Sortie abrégée

    Si vous avez déployé des ressources Windows, toutes les instances de linux dans la sortie suivante sont windows. Les autres example values peuvent être différents de votre sortie.

    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 IP unique attribuée au Pod à partir du bloc d'adresse 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 plus d’informations, consultez Mise en réseau personnalisée pour les pods. Vous pouvez également voir que le planificateur Kubernetes a programmé le Pod sur le Node avec l'adresse IP 192.168.45.132.

    Astuce

    Plutôt que d'utiliser la ligne de commande, vous pouvez afficher de nombreux détails sur les Pods, les services, les déploiements et les autres ressources Kubernetes dans la AWS Management Console. Pour plus d’informations, consultez Afficher les ressources Kubernetes.

  7. 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.

    Linux
    kubectl exec -it eks-sample-linux-deployment-65b7669776-m6qxz -n eks-sample-app -- /bin/bash
    Windows
    kubectl exec -it eks-sample-windows-deployment-65b7669776-m6qxz -n eks-sample-app -- powershell.exe
  8. À partir du shell du Pod, affichez la sortie du serveur web installé avec votre déploiement au cours d'une étape précédente. Vous devez uniquement spécifier le nom du service. Il est résolu en adresse IP du service par CoreDNS, qui est déployé avec un cluster Amazon EKS, par défaut.

    Linux
    curl eks-sample-linux-service

    L'exemple qui suit illustre un résultat.

    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    [...]
    Windows
    Invoke-WebRequest -uri eks-sample-windows-service/default.html -UseBasicParsing

    L'exemple qui suit illustre un résultat.

    StatusCode        : 200
    StatusDescription : OK
    Content           : < h t m l > < b o d y > < b r / > < b r / > < m a r q u e e > < H 1 > H e l l o  
                          E K S ! ! ! < H 1 > < m a r q u e e > < / b o d y > < h t m l >
  9. À partir du shell du Pod, affichez le serveur DNS pour le Pod.

    Linux
    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.

    Windows
    Get-NetIPConfiguration

    Sortie abrégée

    InterfaceAlias       : vEthernet
    [...]
    IPv4Address          : 192.168.63.14
    [...]
    DNSServer            : 10.100.0.10

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

  10. Déconnectez-vous du Pod en tapant exit.

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

    kubectl delete namespace eks-sample-app

Étapes suivantes

Après avoir déployé l'exemple d'application, vous pouvez essayer certains des exercices suivants :