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. Support pour les clusters Amazon EKS privés sur le marché AWS Batch est généralement disponible dans le commerce, Régions AWS là où AWS Batch il est disponible.

Les clusters privés Amazon EKS ne disposent d'aucun accès Internet entrant/sortant et ne disposent que de sous-réseaux privés. 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 votre identifiant de ressource uriform (URI) du 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érequis

Avant de commencer ce didacticiel, vous devez installer et configurer les outils et ressources suivants dont vous avez besoin pour créer et gérer à la fois les ressources Amazon EKS AWS Batch et les ressources Amazon EKS. Vous devez également créer toutes les ressources nécessaires, notamment le VPC, les sous-réseaux, les tables de routage, les points de terminaison VPC et le cluster Amazon EKS. Vous devez utiliser le AWS CLI.

  • AWS CLI— Un outil de ligne de commande permettant de travailler avec AWS des services, notamment Amazon EKS. Ce guide nécessite que vous utilisiez la version 2.8.6 ou ultérieure ou la version 1.26.0 ou ultérieure. Pour plus d'informations, consultez la section Installation, mise à jour et désinstallation du AWS CLI dans le guide de l'AWS Command Line Interface utilisateur.

    Après l'avoir installé AWS CLI, nous vous recommandons de le configurer. Pour plus d'informations, consultez la section Configuration rapide avec aws configure dans le Guide de AWS Command Line Interface l'utilisateur.

  • kubectl— Un outil de ligne de commande permettant de travailler avec des Kubernetes clusters. Ce guide est compatible avec la version 1.23 ou une version ultérieure. Pour plus d'informations, veuillez consulter Installation ou mise à jour de kubectl dans le Guide de l'utilisateur Amazon EKS.

  • eksctl— Un outil de ligne de commande conçu pour fonctionner avec les clusters Amazon EKS et qui automatise de nombreuses tâches individuelles. Ce guide est compatible avec la version 0.115.0 ou une version ultérieure. Pour plus d'informations, veuillez consulter Installation ou mise à jour de eksctl dans le Guide de l'utilisateur Amazon EKS.

  • Autorisations requises AWS Identity and Access Management (IAM) : le principal de sécurité IAM que vous utilisez doit être autorisé à utiliser les rôles IAM Amazon EKS et les rôles liés à un service AWS CloudFormation, ainsi qu'un VPC et les ressources associées. Pour plus d'informations, consultez les sections Actions, ressources et clés de condition pour Amazon Elastic Kubernetes Service et Utilisation de rôles liés à un service dans le guide de l'utilisateur IAM. Vous devez effectuer toutes les étapes de ce guide avec le même utilisateur.

  • Création d'un cluster Amazon EKS — Pour plus d'informations, consultez Getting started with Amazon EKS — eksctl dans le guide de l'utilisateur Amazon EKS.

    Note

    AWS Batch ne fournit pas d'orchestration de nœuds gérés pour CoreDNS ou d'autres pods de déploiement. Si vous avez besoin de CoreDNS, consultez la section Ajout du module complémentaire CoreDNS Amazon EKS dans le guide de l'utilisateur Amazon EKS. Ou, eksctl create cluster create pour créer le cluster, il inclut CoreDNS par défaut.

  • Autorisations : les utilisateurs qui appellent l'opération d'CreateComputeEnvironmentAPI pour créer un environnement informatique utilisant les ressources Amazon EKS ont besoin d'autorisations pour l'opération eks:DescribeCluster d'API. L'utilisation de AWS Management Console pour créer une ressource de calcul à l'aide des ressources Amazon EKS nécessite des autorisations à la fois pour eks:DescribeCluster eteks:ListClusters.

  • Créez un cluster EKS privé dans la région us-east-1 à l'aide de l'exemple eksctl de fichier de configuration.

    kind: ClusterConfig apiVersion: eksctl.io/v1alpha5 availabilityZones: - us-east-1a - us-east-1b - us-east-1d managedNodeGroups: privateNetworking: true privateCluster: enabled: true skipEndpointCreation: false

    Créez vos ressources à l'aide de la commande : eksctl create cluster -f clusterConfig.yaml

  • Les nœuds gérés par lots doivent être déployés sur des sous-réseaux dotés des points de terminaison d'interface VPC dont vous avez besoin. Pour plus d'informations, consultez la section Exigences relatives aux clusters privés.

Étape 1 : Préparation de votre cluster EKS pour AWS Batch

Toutes les étapes sont obligatoires.

  1. Création d'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.

    Note

    Pour plus d'informations sur l'utilisation de l'autorisation RBAC, consultez la section Utilisation de l'autorisation RBAC dans la Kubernetes documentation.

    $ 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: ["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-cluster-name \ --arn "arn:aws:iam::<your-account>:role/AWSServiceRoleForBatch" \ --username aws-batch

    Sortie :

    2022-10-25 20:19:57 [ℹ] adding identity "arn:aws:iam::<your-account>: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 2 : 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 ponctuelles EC2.

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.

$ cat <<EOF > ./batch-eks-compute-environment.json { "computeEnvironmentName": "My-Eks-CE1", "type": "MANAGED", "state": "ENABLED", "eksConfiguration": { "eksClusterArn": "arn:aws:eks:<region>:123456789012:cluster/<cluster-name>", "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
  • Le serviceRole paramètre ne doit pas être spécifié, le rôle AWS Batch lié au service sera alors utilisé. AWS Batch sur Amazon, EKS prend uniquement en charge le AWS Batch rôle lié au service.

  • Seules BEST_FIT_PROGRESSIVESPOT_CAPACITY_OPTIMIZED, et les stratégies SPOT_PRICE_CAPACITY_OPTIMIZED d'allocation sont prises en charge pour les environnements informatiques Amazon EKS.

    Note

    Nous vous recommandons d'utiliser SPOT_PRICE_CAPACITY_OPTIMIZED plutôt que SPOT_CAPACITY_OPTIMIZED n dans la plupart des cas.

  • Pour ce faireinstanceRole, consultez les sections Création du rôle IAM du nœud Amazon EKS et Activation de l'accès principal IAM à votre cluster dans le guide de l'utilisateur Amazon EKS. Si vous utilisez un réseau de modules, consultez la section Configuration du plug-in Amazon VPC CNI pour utiliser les rôles IAM Kubernetes pour les comptes de service dans le guide de l'utilisateur Amazon EKS.

  • Un moyen d'obtenir des sous-réseaux fonctionnels pour le subnets paramètre consiste à utiliser les sous-réseaux publics des groupes de nœuds gérés par Amazon EKS qui ont été créés eksctl lors de la création d'un cluster Amazon EKS. Sinon, utilisez des sous-réseaux dotés d'un chemin réseau permettant d'extraire des images.

  • Le securityGroupIds paramètre peut 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.

    $ eks describe-cluster \ --name <cluster-name> \ --query cluster.resourcesVpcConfig.clusterSecurityGroupId
  • La maintenance d'un environnement informatique Amazon EKS est une responsabilité partagée. Pour plus d'informations, consultez la section Sécurité dans Amazon EKS.

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 plus d’informations, consultez Résolution des problèmes AWS Batch.

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

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

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 4 : Création d'une définition de tâche

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": "account-id.dkr.ecr.region.amazonaws.com/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

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 5 : Soumettre une offre d'emploi

$ aws batch submit-job - -job-queue My-Eks-JQ1 \ - -job-definition MyJobOnEks_Sleep - -job-name My-Eks-Job1 $ aws batch describe-jobs - -job <jobId-from-submit-response>
Remarques

(Facultatif) Soumettez une tâche avec des dérogations

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

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 résolution des problèmes courants, consultez la section Résolution des problèmes AWS Batch. Pour le dépannage basé sur l'état du pod, consultez Comment résoudre le problème de l'état du pod dans Amazon EKS ? .