Commencer à utiliser AWS Batch les clusters privés Amazon EKS - AWS Batch

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.

Commencer à utiliser AWS Batch les clusters privés Amazon EKS

AWS Batch est un service géré qui orchestre les charges de travail par lots dans vos clusters Amazon Elastic Kubernetes Service (Amazon EKS). Cela inclut la mise en file d'attente, le suivi des dépendances, la gestion des nouvelles tentatives et des priorités des tâches, la gestion des pods et le dimensionnement des nœuds. Cette fonctionnalité connecte votre cluster privé Amazon EKS existant à votre cluster Amazon EKS AWS Batch pour exécuter vos tâches à grande échelle. Vous pouvez utiliser eksctl(une interface de ligne de commande pour Amazon EKS), la AWS console ou le AWS Command Line Interfacepour créer un cluster Amazon EKS privé avec toutes les autres ressources nécessaires.

Par défaut, les clusters privés Amazon EKS n'ont pas accès à inbound/outbound Internet et vous ne pouvez accéder au serveur d'API que depuis votre VPC ou un réseau connecté. Les points de terminaison Amazon VPC sont utilisés pour permettre un accès privé à d'autres services. AWS eksctlprend en charge la création de clusters entièrement privés à l'aide d'un Amazon VPC et de sous-réseaux préexistants. eksctlcrée également des points de terminaison Amazon VPC dans le VPC Amazon fourni et modifie les tables de routage pour les sous-réseaux fournis.

Chaque sous-réseau doit être associé à une table de routage explicite car cela eksctl ne modifie pas la table de routage principale. Votre cluster doit extraire des images d'un registre de conteneurs qui se trouve dans votre Amazon VPC. Vous pouvez également créer un Amazon Elastic Container Registry dans votre Amazon VPC et y copier des images de conteneurs pour que vos nœuds puissent les extraire. Pour plus d'informations, voir Copier une image de conteneur d'un référentiel vers un autre référentiel. Pour commencer à utiliser les référentiels privés Amazon ECR, consultez les référentiels privés Amazon ECR.

Vous pouvez éventuellement créer une règle de cache d'extraction avec Amazon ECR. Une fois qu'une règle de cache d'extraction est créée pour un registre public externe, vous pouvez extraire une image de ce registre public externe à l'aide de l'URI (Uniform Resource Identifier) de votre registre privé Amazon ECR. Amazon ECR crée ensuite un référentiel et met l'image en cache. Lorsqu'une image mise en cache est extraite à l'aide de l'URI du registre privé Amazon ECR, Amazon ECR vérifie le registre distant pour voir s'il existe une nouvelle version de l'image et met à jour votre registre privé jusqu'à une fois toutes les 24 heures.

Présentation

Ce didacticiel explique comment effectuer une configuration AWS Batch avec un Amazon EKS privé à AWS CloudShell l'aide kubectl des eksctl

Public visé

Ce didacticiel est destiné aux administrateurs système et aux développeurs chargés de la configuration, des tests et du déploiement AWS Batch.

Fonctionnalités utilisées

Ce didacticiel vous montre comment utiliser le AWS CLI, pour :

  • Utiliser Amazon Elastic Container Registry (Amazon ECR) pour stocker des images de conteneurs

  • Création et configuration d'un environnement informatique Amazon EKS

  • Créez une file d'attente de tâches.

  • Créer une définition de tâche

  • Création et soumission d'une tâche à exécuter

  • Soumettre une offre d'emploi avec des dérogations

Temps requis

La réalisation de ce didacticiel devrait prendre entre 40 et 50 minutes.

Restrictions régionales

Aucune restriction nationale ou régionale n'est associée à l'utilisation de cette solution.

Coûts d'utilisation des ressources

La création d'un AWS compte est gratuite. Cependant, en mettant en œuvre cette solution, vous pouvez être redevable de tout ou partie des frais répertoriés dans le tableau suivant.

Description Coût (dollar américain)
Vous êtes facturé en fonction de l'heure du cluster Varie en fonction de l'instance, voir la tarification d'Amazon EKS
EC2 Instance Amazon Vous payez pour chaque EC2 instance Amazon créée. Pour plus d'informations sur les tarifs, consultez Amazon EC2 Pricing.

Prérequis

Ce didacticiel utilise AWS CloudShell un shell pré-authentifié basé sur un navigateur que vous lancez directement depuis le. AWS Management Console Cela permet d'accéder au cluster une fois qu'il n'a plus d'accès public à Internet. Le AWS CLIkubectl, et est eksctl peut-être déjà installé dans le cadre de AWS CloudShell. Pour plus d'informations AWS CloudShell, consultez le guide de AWS CloudShell l'utilisateur. Vous pouvez également AWS CloudShell vous connecter au VPC de votre cluster ou à un réseau connecté.

Pour exécuter des commandes kubectl, vous devez disposer d'un accès privé à votre cluster Amazon EKS. Cela signifie que tout le trafic vers le serveur API de votre cluster doit provenir du VPC de votre cluster ou d'un réseau connecté.

Étape 1 : Créez votre cluster EKS pour AWS Batch

Important

Pour démarrer le plus simplement et le plus rapidement possible, ce didacticiel inclut des étapes avec les paramètres par défaut. Avant de créer pour une utilisation en production, nous vous recommandons de vous familiariser avec tous les paramètres et de déployer avec ceux qui répondent à vos besoins.

Nous vous recommandons eksctl d'utiliser le fichier de configuration suivant pour créer votre cluster. Pour configurer manuellement votre cluster, suivez les instructions de la section Déployer des clusters privés avec un accès Internet limité dans le guide de l'utilisateur Amazon EKS.

  1. Ouvrez la AWS CloudShell console et définissez la région surus-east-1. Pour le reste du didacticiel, assurez-vous que vous utilisezus-east-1.

  2. Créez un cluster EKS privé dans la us-east-1 région à l'aide de l'exemple de fichier de eksctl configuration. Enregistrez le fichier yaml dans votre AWS CloudShell environnement et nommez-leclusterConfig.yaml. Vous pouvez modifier my-test-cluster le nom que vous souhaitez utiliser pour votre cluster.

    kind: ClusterConfig apiVersion: eksctl.io/v1alpha5 metadata: name: my-test-cluster region: us-east-1 availabilityZones: - us-east-1a - us-east-1b - us-east-1c managedNodeGroups: - name: ng-1 privateNetworking: true privateCluster: enabled: true skipEndpointCreation: false
  3. Créez vos ressources à l'aide de la commande :eksctl create cluster -f clusterConfig.yaml. La création d'un cluster peut prendre entre 10 et 15 minutes.

  4. Une fois le cluster créé, vous devez ajouter votre adresse AWS CloudShell IP à la liste des autorisations. Pour trouver votre adresse AWS CloudShell IP, exécutez la commande suivante :

    curl http://checkip.amazonaws.com

    Une fois que vous avez l'adresse IP publique, vous devez créer une règle de liste d'autorisation :

    aws eks update-cluster-config \ --name my-test-cluster \ --region us-east-1 \ --resources-vpc-config endpointPublicAccess=true,endpointPrivateAccess=true,publicAccessCidrs=["<Public IP>/32"]

    Appliquez ensuite la mise à jour au fichier de configuration kubectl :

    aws eks update-kubeconfig --name my-test-cluster --region us-east-1
  5. Pour vérifier que vous avez accès aux nœuds, exécutez la commande suivante :

    kubectl get nodes

    Le résultat de la commande est :

    NAME STATUS ROLES AGE VERSION ip-192-168-107-235.ec2.internal Ready none 1h v1.32.3-eks-473151a ip-192-168-165-40.ec2.internal Ready none 1h v1.32.3-eks-473151a ip-192-168-98-54.ec2.internal Ready none 1h v1.32.1-eks-5d632ec

Étape 2 : Préparez votre cluster EKS pour AWS Batch

Toutes les étapes sont obligatoires et doivent être effectuées AWS CloudShell.

  1. Créez un espace de noms dédié aux tâches AWS Batch

    kubectlÀ utiliser pour créer un nouvel espace de noms.

    $ namespace=my-aws-batch-namespace
    $ cat - <<EOF | kubectl create -f - { "apiVersion": "v1", "kind": "Namespace", "metadata": { "name": "${namespace}", "labels": { "name": "${namespace}" } } } EOF

    Sortie :

    namespace/my-aws-batch-namespace created
  2. Permettre l'accès via le contrôle d'accès basé sur les rôles (RBAC)

    kubectlÀ utiliser pour créer un Kubernetes rôle pour le cluster afin de AWS Batch permettre de surveiller les nœuds et les pods, et de lier le rôle. Vous devez effectuer cette opération une fois pour chaque cluster Amazon EKS.

    $ cat - <<EOF | kubectl apply -f - apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: aws-batch-cluster-role rules: - apiGroups: [""] resources: ["namespaces"] verbs: ["get"] - apiGroups: [""] resources: ["nodes"] verbs: ["get", "list", "watch"] - apiGroups: [""] resources: ["pods"] verbs: ["get", "list", "watch"] - apiGroups: [""] resources: ["events"] verbs: ["list"] - apiGroups: [""] resources: ["configmaps"] verbs: ["get", "list", "watch"] - apiGroups: ["apps"] resources: ["daemonsets", "deployments", "statefulsets", "replicasets"] verbs: ["get", "list", "watch"] - apiGroups: ["rbac.authorization.k8s.io"] resources: ["clusterroles", "clusterrolebindings"] verbs: ["get", "list"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: aws-batch-cluster-role-binding subjects: - kind: User name: aws-batch apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: aws-batch-cluster-role apiGroup: rbac.authorization.k8s.io EOF

    Sortie :

    clusterrole.rbac.authorization.k8s.io/aws-batch-cluster-role created clusterrolebinding.rbac.authorization.k8s.io/aws-batch-cluster-role-binding created

    Créez un Kubernetes rôle délimité par un espace de noms pour gérer et prolonger le cycle AWS Batch de vie des pods et les lier. Vous devez effectuer cette opération une fois pour chaque espace de noms unique.

    $ namespace=my-aws-batch-namespace
    $ cat - <<EOF | kubectl apply -f - --namespace "${namespace}" apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: aws-batch-compute-environment-role namespace: ${namespace} rules: - apiGroups: [""] resources: ["pods"] verbs: ["create", "get", "list", "watch", "delete", "patch"] - apiGroups: [""] resources: ["serviceaccounts"] verbs: ["get", "list"] - apiGroups: ["rbac.authorization.k8s.io"] resources: ["roles", "rolebindings"] verbs: ["get", "list"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: aws-batch-compute-environment-role-binding namespace: ${namespace} subjects: - kind: User name: aws-batch apiGroup: rbac.authorization.k8s.io roleRef: kind: Role name: aws-batch-compute-environment-role apiGroup: rbac.authorization.k8s.io EOF

    Sortie :

    role.rbac.authorization.k8s.io/aws-batch-compute-environment-role created rolebinding.rbac.authorization.k8s.io/aws-batch-compute-environment-role-binding created

    Mettez à Kubernetes aws-auth jour la carte de configuration pour associer les autorisations RBAC précédentes au rôle lié au service. AWS Batch

    $ eksctl create iamidentitymapping \ --cluster my-test-cluster \ --arn "arn:aws:iam::<your-account-ID>:role/AWSServiceRoleForBatch" \ --username aws-batch

    Sortie :

    2022-10-25 20:19:57 [ℹ] adding identity "arn:aws:iam::<your-account-ID>:role/AWSServiceRoleForBatch" to auth ConfigMap
    Note

    Le chemin aws-service-role/batch.amazonaws.com/ a été supprimé de l'ARN du rôle lié au service. Cela est dû à un problème avec la carte aws-auth de configuration. Pour plus d'informations, consultez la section Les rôles dotés de chemins ne fonctionnent pas lorsque le chemin est inclus dans leur ARN dans le aws-authconfigmap.

Étape 3 : Création d'un environnement informatique Amazon EKS

AWS Batch les environnements informatiques définissent les paramètres des ressources de calcul pour répondre à vos besoins en matière de charge de travail par lots. Dans un environnement informatique géré, vous AWS Batch aide à gérer la capacité et les types d'instances des ressources de calcul (Kubernetesnœuds) au sein de votre cluster Amazon EKS. Ceci est basé sur la spécification des ressources de calcul que vous définissez lors de la création de l'environnement de calcul. Vous pouvez utiliser des instances EC2 à la demande ou des instances EC2 ponctuelles.

Maintenant que le rôle AWSServiceRoleForBatchlié au service a accès à votre cluster Amazon EKS, vous pouvez créer des AWS Batch ressources. Créez d'abord un environnement informatique qui pointe vers votre cluster Amazon EKS.

  • Pour subnets exécuter eksctl get cluster my-test-cluster pour obtenir les sous-réseaux utilisés par le cluster.

  • Pour les securityGroupIds paramètres, vous pouvez utiliser le même groupe de sécurité que le cluster Amazon EKS. Cette commande récupère l'ID du groupe de sécurité pour le cluster.

    $ aws eks describe-cluster \ --name my-test-cluster \ --query cluster.resourcesVpcConfig.clusterSecurityGroupId
  • Utilisez l'ARN instanceRole que vous avez créé dans les prérequis.

$ cat <<EOF > ./batch-eks-compute-environment.json { "computeEnvironmentName": "My-Eks-CE1", "type": "MANAGED", "state": "ENABLED", "eksConfiguration": { "eksClusterArn": "arn:aws:eks:us-east-1:<your-account-ID>:cluster/my-test-cluster", "kubernetesNamespace": "my-aws-batch-namespace" }, "computeResources": { "type": "EC2", "allocationStrategy": "BEST_FIT_PROGRESSIVE", "minvCpus": 0, "maxvCpus": 128, "instanceTypes": [ "m5" ], "subnets": [ "<eks-cluster-subnets-with-access-to-the-image-for-image-pull>" ], "securityGroupIds": [ "<eks-cluster-sg>" ], "instanceRole": "<eks-instance-profile>" } } EOF
$ aws batch create-compute-environment --cli-input-json file://./batch-eks-compute-environment.json
Remarques

Étape 4 : créer une file d'attente de tâches et associer l'environnement informatique

Important

Il est important de vérifier que l'environnement informatique est sain avant de continuer. L'opération DescribeComputeEnvironmentsAPI peut être utilisée à cette fin.

$ aws batch describe-compute-environments --compute-environments My-Eks-CE1

Vérifiez que le status paramètre ne l'est pasINVALID. Si c'est le cas, examinez le statusReason paramètre correspondant à la cause. Pour de plus amples informations, veuillez consulter Résolution des problèmes AWS Batch.

Les tâches soumises à cette nouvelle file d'attente de tâches sont exécutées en tant que modules sur des nœuds AWS Batch gérés qui ont rejoint le cluster Amazon EKS associé à votre environnement informatique.

$ cat <<EOF > ./batch-eks-job-queue.json { "jobQueueName": "My-Eks-JQ1", "priority": 10, "computeEnvironmentOrder": [ { "order": 1, "computeEnvironment": "My-Eks-CE1" } ] } EOF
$ aws batch create-job-queue --cli-input-json file://./batch-eks-job-queue.json

Étape 5 : créer un Amazon ECR avec un cache d'extraction

Comme le cluster ne dispose pas d'un accès public à Internet, vous devez créer un Amazon ECR pour les images de conteneur. Les instructions suivantes créent un Amazon ECR avec une règle de cache pull-through pour stocker l'image.

  1. La commande suivante crée la règle de cache pull-through. Vous pouvez le remplacer tutorial-prefix par un autre préfixe.

    aws ecr create-pull-through-cache-rule \ --ecr-repository-prefix "my-prefix" \ --upstream-registry-url "public.ecr.aws" \ --region us-east-1
  2. Authentifiez-vous auprès de l'ECR public.

    aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin <your-account-ID>.dkr.ecr.us-east-1.amazonaws.com

    Vous pouvez maintenant extraire une image.

    docker pull <your-account-ID>.dkr.ecr.us-east-1.amazonaws.com/my-prefix/amazonlinux/amazonlinux:2
  3. Vous pouvez vérifier le référentiel et l'image en exécutant les commandes suivantes :

    aws ecr describe-repositories
    aws ecr describe-images --repository-name my-prefix/amazonlinux/amazonlinux
  4. La chaîne d'image à utiliser pour extraire le conteneur est au format suivant :

    <your-account-ID>.dkr.ecr.us-east-1.amazonaws.com/my-prefix/amazonlinux/amazonlinux:2

Étape 6 : enregistrer une définition de tâche

La définition de Job suivante indique au module de rester en veille pendant 60 secondes.

Dans le champ image de la définition de tâche, au lieu de fournir un lien vers une image dans un référentiel ECR public, fournissez le lien vers l'image stockée dans notre référentiel ECR privé. Consultez l'exemple de définition de tâche suivant :

$ cat <<EOF > ./batch-eks-job-definition.json { "jobDefinitionName": "MyJobOnEks_Sleep", "type": "container", "eksProperties": { "podProperties": { "hostNetwork": true, "containers": [ { "image": "<your-account-ID>.dkr.ecr.us-east-1.amazonaws.com/my-prefix/amazonlinux/amazonlinux:2", "command": [ "sleep", "60" ], "resources": { "limits": { "cpu": "1", "memory": "1024Mi" } } } ], "metadata": { "labels": { "environment": "test" } } } } } EOF
$ aws batch register-job-definition --cli-input-json file://./batch-eks-job-definition.json

Remarques

Étape 7 : Soumettre une tâche à exécuter

Exécutez la AWS CLI commande suivante AWS CloudShell pour soumettre un nouveau Job et renvoie le JoBid unique.

$ aws batch submit-job --job-queue My-Eks-JQ1 \ --job-definition MyJobOnEks_Sleep - -job-name My-Eks-Job1
Remarques

Étape 8 : Afficher le résultat de la tâche

Pour vérifier le statut d'un Job :

$ aws batch describe-jobs --job <JobID-from-submit-response>

Ils startedAt stoppedAt doivent être espacés d'une minute.

Étape 9 : (Facultatif) Soumettre une tâche avec des remplacements

Cette tâche remplace la commande transmise au conteneur.

$ cat <<EOF > ./submit-job-override.json { "jobName": "EksWithOverrides", "jobQueue": "My-Eks-JQ1", "jobDefinition": "MyJobOnEks_Sleep", "eksPropertiesOverride": { "podProperties": { "containers": [ { "command": [ "/bin/sh" ], "args": [ "-c", "echo hello world" ] } ] } } } EOF
$ aws batch submit-job - -cli-input-json file://./submit-job-override.json
Remarques

Étape 10 : Nettoyez les ressources de votre didacticiel

L' EC2 instance Amazon vous est facturée lorsqu'elle est activée. Vous pouvez supprimer l'instance pour ne plus encourir de frais.

Pour supprimer les ressources que vous avez créées, procédez comme suit :

  1. Ouvrez la AWS Batch console à l'adresse https://console.aws.amazon.com/batch/.

  2. Dans le volet de navigation, choisissez Job queue.

  3. Dans le tableau des files d'attente de tâches, choisissez la file d'attente de tâches que vous avez créée pour le didacticiel.

  4. Dans Actions, choisissez Désactiver. Une fois que l'état de la file d'attente des Job est désactivé, vous pouvez choisir Delete.

  5. Une fois la file d'attente de Job supprimée, dans le volet de navigation, sélectionnez Compute environments.

  6. Choisissez l'environnement informatique que vous avez créé pour ce didacticiel, puis choisissez Désactiver des actions. La désactivation complète de l'environnement informatique peut prendre 1 à 2 minutes.

  7. Une fois que l'état de l'environnement informatique est désactivé, choisissez Supprimer. La suppression de l'environnement informatique peut prendre 1 à 2 minutes.

Ressources supplémentaires

Une fois le didacticiel terminé, vous souhaiterez peut-être explorer les sujets suivants :

Résolution des problèmes

Si les nœuds lancés par AWS Batch n'ont pas accès au référentiel Amazon ECR (ou à tout autre référentiel) qui stocke votre image, vos tâches peuvent rester à l'état STARTING. Cela est dû au fait que le module ne pourra pas télécharger l'image et exécuter votre AWS Batch tâche. Si vous cliquez sur le nom du pod lancé par, AWS Batch vous devriez pouvoir voir le message d'erreur et confirmer le problème. Le message d'erreur doit ressembler à ce qui suit :

Failed to pull image "public.ecr.aws/amazonlinux/amazonlinux:2": rpc error: code = Unknown desc = failed to pull and unpack image "public.ecr.aws/amazonlinux/amazonlinux:2": failed to resolve reference "public.ecr.aws/amazonlinux/amazonlinux:2": failed to do request: Head "https://public.ecr.aws/v2/amazonlinux/amazonlinux/manifests/2": dial tcp: i/o timeout

Pour d'autres scénarios de dépannage courants, consultez la section Résolution des problèmes AWS Batch. Pour un dépannage basé sur l'état du pod, consultez Comment résoudre le problème de l'état du pod dans Amazon EKS ? .