Introducción a AWS Batch en Amazon EKSEKS - AWS Batch

Introducción a AWS Batch en Amazon EKSEKS

AWS Batch en Amazon EKS es un servicio administrado para programar y escalar cargas de trabajo por lotes en clústeres de Amazon EKS existentes. AWS Batch no crea, administra ni realiza las operaciones del ciclo de vida de los clústeres de Amazon EKS en su nombre. La orquestación AWS Batch amplía y reduce los nodos gestionados por AWS Batch y ejecuta pods en dichos nodos.

AWS Batch no afecta a los nodos, ni a los grupos de nodos con escalado automático ni a los ciclos de vida de los pods que no estén asociados a los entornos de computación AWS Batch de su clúster de Amazon EKS. Para que AWS Batch funcione de forma eficaz, su función vinculada a los servicios necesita permisos de control de acceso Kubernetes basado en funciones (RBAC) en el clúster de Amazon EKS existente. Para obtener más información, consulte Utilización de la autorización de RBAC en la documentación Kubernetes.

AWS Batch requiere un espacio de nombres Kubernetes en el que pueda clasificar los pods como trabajos AWS Batch. Recomendamos un espacio de nombres dedicado para aislar los pods AWS Batch de las demás cargas de trabajo del clúster.

Una vez se haya otorgado acceso RBAC a AWS Batch y se haya establecido un espacio de nombres, puede asociar ese clúster de Amazon EKS a un entorno de computación de AWS Batch mediante la operación de API CreateComputeEnvironment. Se puede asociar una cola de trabajos a este nuevo entorno de computación de Amazon EKS. Los trabajos AWS Batch se envían a la cola de trabajos en función de una definición de trabajo de Amazon EKS mediante la operación de API SubmitJob. A continuación, AWS Batch lanza los nodos administrados por AWS Batch y coloca los trabajos de la cola de trabajos en forma de pods Kubernetes en el clúster de EKS asociado a un entorno de computación de AWS Batch.

En las siguientes secciones, se explica cómo configurar AWS Batch en Amazon EKS.

Descripción general

En este tutorial se muestra cómo configurar AWS Batch con Amazon EKS mediante AWS CLI, kubectl y eksctl.

Destinatarios previstos

Este tutorial está diseñado para los administradores y desarrolladores de sistemas responsables de la configuración, las pruebas y la implementación de AWS Batch.

Características utilizadas

En este tutorial se muestra cómo utilizar AWS CLI para realizar lo siguiente:

  • crear y configurar un entorno de computación de Amazon EKS,

  • crear una cola de trabajos,

  • crear una definición de trabajo,

  • crear y enviar un flujo de trabajo para ejecutarlo,

  • enviar un trabajo con anulaciones.

Tiempo necesario

Debe tardar entre 30 y 40 minutos en completar este tutorial.

Restricciones regionales

No hay restricciones regionales o de país asociadas al uso de esta solución.

Costos de uso de recursos

La creación de una cuenta de AWS no supone ningún coste. Sin embargo, mediante la implementación de esta solución, es posible que incurra en algunos o todos los costos que se enumeran en la siguiente tabla.

Descripción Costo (dólares estadounidenses)
El cobro será por hora de uso del clúster Varía según la instancia. Consulte los precios de Amazon EKS

Requisitos previos

Antes de comenzar este tutorial, debe instalar y configurar las siguientes herramientas y recursos que necesita para crear y administrar recursos tanto de AWS Batch como de Amazon EKS.

Paso 1: Crear el clúster de Amazon EKS para AWS Batch

importante

Para comenzar de la manera más sencilla y rápida posible, en este tutorial se incluirán los pasos con la configuración predeterminada. Antes de crear para su uso en producción, recomendamos que conozca toda la configuración e implemente la configuración que satisfaga sus requisitos.

Tras haber instalado los requisitos previos, debe crear su clúster con eksctl. Crear el clúster puede tardar entre 10 y 15 minutos.

$ eksctl create cluster --name my-cluster-name --region region-code

Sustituya en el comando anterior:

  • my-cluster-name por el nombre que desee para el nuevo clúster.

  • region-code por la Región de AWS para crear el clúster, por ejemplo us-west-2.

El nombre y la región del clúster serán necesarios en otro momento para este tutorial.

Paso 2: Preparar el clúster de Amazon EKS para AWS Batch

Todos los pasos son obligatorios.

  1. Cree un espacio de nombres dedicado a los trabajos AWS Batch

    Se utiliza kubectl para crear un nuevo espacio de nombres.

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

    Salida:

    namespace/my-aws-batch-namespace created
  2. Habilite el acceso a través del control de acceso basado en roles (RBAC)

    Se utiliza kubectl para crear un rol de Kubernetes para el clúster que permita a AWS Batch vigilar los nodos y los pods y vincular el rol. Debe hacerlo una vez para cada clúster de 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

    Salida:

    clusterrole.rbac.authorization.k8s.io/aws-batch-cluster-role created clusterrolebinding.rbac.authorization.k8s.io/aws-batch-cluster-role-binding created
  3. Cree un rol de Kubernetes dentro del espacio de nombres para administrar los pods y AWS Batch vincularlos durante todo el ciclo de vida. Debe hacerlo una vez para cada espacio de nombres único.

    $ 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

    Salida:

    role.rbac.authorization.k8s.io/aws-batch-compute-environment-role created rolebinding.rbac.authorization.k8s.io/aws-batch-compute-environment-role-binding created
  4. Actualice el mapa de configuración Kubernetes aws-auth para asignar los permisos de RBAC anteriores a la función vinculada al servicio AWS Batch.

    Reemplace en el siguiente comando:

    • <your-account-number> por su número de la Cuenta de AWS.

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

    Salida:

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

    La ruta aws-service-role/batch.amazonaws.com/ se ha eliminado del ARN del rol vinculado a un servicio. Esto se debe a un problema con el mapa de configuración de aws-auth. Para obtener más información, consulte Roles con rutas que no funcionan cuando la ruta está incluida en su ARN en el aws-authconfigmap.

Paso 3: Crear un entorno de computación de Amazon EKS

AWS Batch Los entornos de computación definen los parámetros de los recursos de computación para satisfacer sus necesidades de carga de trabajo por lotes. En un entorno de computación administrado, AWS Batch le ayuda a administrar la capacidad y los tipos de instancias de los recursos de computación (nodos Kubernetes) dentro de su clúster de Amazon EKS. Se basa en la especificación de recursos de computación que se define al crear el entorno de computación. Puede utilizar instancias bajo demanda EC2 o instancias de spot EC2.

Ahora que el rol vinculado al servicio AWSServiceRoleForBatch tiene acceso a su clúster de Amazon EKS, puede crear recursos de AWS Batch. En primer lugar, cree un entorno de computación que apunte a su clúster de Amazon EKS.

  • En subnets ejecute eksctl get cluster my-cluster-name para obtener las subredes que el clúster utilizó.

  • En el parámetro securityGroupIds, puede utilizar el mismo grupo de seguridad que utiliza el clúster de Amazon EKS. Este comando recupera el ID del grupo de seguridad del clúster.

    $ aws eks describe-cluster \ --name my-cluster-name \ --query cluster.resourcesVpcConfig.clusterSecurityGroupId
  • El instanceRole se creará con la formación del clúster. Si desea encontrar la lista instanceRole de todas las entidades que utilizan la política AmazonEKSWorkerNodePolicy:

    $ aws iam list-entities-for-policy --policy-arn arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy

    El nombre del rol de política contiene el nombre del clúster que se creó en eksctl-my-cluster-name-nodegroup-example.

    Ejecute el siguiente comando para buscar el ARN de instanceRole:

    $ aws iam list-instance-profiles-for-role --role-name eksctl-my-cluster-name-nodegroup-example

    Salida:

    INSTANCEPROFILES arn:aws:iam::<your-account-number>:instance-profile/eks-04cb2200-94b9-c297-8dbe-87f12example

    Para obtener más información, consulte Crear el rol de IAM de nodo de Amazon EKS y Habilitar el acceso de entidad principal para el clúster de IAM en la Guía del usuario de Amazon EKS. Si utiliza redes de pod, consulte Configuración del complemento de CNI de Amazon VPC de Kubernetes para utilizar roles de IAM en las cuentas de servicio en la Guía del usuario de Amazon EKS.

$ cat <<EOF > ./batch-eks-compute-environment.json { "computeEnvironmentName": "My-Eks-CE1", "type": "MANAGED", "state": "ENABLED", "eksConfiguration": { "eksClusterArn": "arn:aws:eks:region-code:your-account-number:cluster/my-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-internet-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
Notas

Paso 4: cree una cola de trabajos y adjunte el entorno de computación

importante

Es importante confirmar que el entorno de computación está en buen estado antes de continuar. Para ello, se puede utilizar la operación de la API DescribeComputeEnvironments.

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

Confirme que el parámetro status no es INVALID. Si es así, busque la causa en el parámetro statusReason. Para obtener más información, consulte Resolución de problemas de AWS Batch.

Los trabajos enviados a esta nueva cola de trabajos se ejecutan como pods en los nodos administrados AWS Batch que se unieron al clúster de Amazon EKS asociado a su entorno de computación.

$ 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

Paso 5: crear una definición de trabajo

La siguiente definición de trabajo le indica al pod que permanezca en espera durante 60 segundos.

$ cat <<EOF > ./batch-eks-job-definition.json { "jobDefinitionName": "MyJobOnEks_Sleep", "type": "container", "eksProperties": { "podProperties": { "hostNetwork": true, "containers": [ { "image": "public.ecr.aws/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
Notas

Paso 6: presentar un trabajo

Ejecute el siguiente comando AWS CLI para enviar un trabajo nuevo.

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

Cómo comprobar el estado de un trabajo:

$ aws batch describe-jobs --job <jobId-from-submit-response>
Notas
  • Para obtener más información sobre la ejecución de trabajos en recursos de Amazon EKS, consulte Trabajos de Amazon EKS.

Paso 7: Ver la salida del trabajo

Para ver la salida del trabajo, realice lo siguiente:

  1. Abra la consola de AWS Batch en https://console.aws.amazon.com/batch/.

  2. En el panel de navegación, seleccione Trabajos.

  3. En el menú desplegable de Colas de trabajo, elija la cola de trabajos que creó para el tutorial.

  4. La tabla Trabajos muestra todos los trabajos y su estado actual. Una vez que el Estado sea Correcto, seleccione el Nombre del trabajo, My-Eks-JQ1, para consultar sus detalles.

  5. En el panel Detalles, las horas de Iniciado a las y Terminado a las deben estar separadas por un minuto.

Paso 8: (opcional) Enviar un trabajo con anulaciones

Este trabajo anula el comando pasado al contenedor. AWS Batch elimina decididamente los pod una vez finalizadas las tareas para reducir la carga a Kubernetes. Para examinar los detalles de un trabajo, se debe configurar el registro. Para obtener más información, consulte Utilice los Registros de CloudWatch para supervisar AWS Batch en los trabajos de Amazon EKS.

$ 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
Notas

Para ver la salida del trabajo, realice lo siguiente:

  1. Abra la consola AWS Batch en https://console.aws.amazon.com/batch/.

  2. En el panel de navegación, seleccione Trabajos.

  3. En el menú desplegable de Colas de trabajo, elija la cola de trabajos que creó para el tutorial.

  4. La tabla Trabajos muestra todos los trabajos y su estado actual. Una vez que el Estado del trabajo sea Correcto, seleccione el Nombre del trabajo para consultar sus detalles.

  5. En el panel Detalles, elija el Nombre del flujo de registro. Se abrirá la consola CloudWatch del trabajo junto con un evento con el Mensaje de hello world o su mensaje personalizado.

Paso 9: Eliminar los recursos del tutorial

Se le cobrará por la instancia de Amazon EC2 mientras esté habilitada. Puede eliminar la instancia para dejar de generar cargos.

Para eliminar los recursos que usted creó, haga lo que se indica a continuación:

  1. Abra la consola AWS Batch en https://console.aws.amazon.com/batch/.

  2. En el panel de navegación, elija Cola de trabajos.

  3. En la tabla Cola de trabajos, elija la cola de trabajos que creó para el tutorial.

  4. Elija Deshabilitar. Una vez que el Estado de la cola de trabajos esté deshabilitado, puede elegir Eliminar.

  5. Una vez se elimine la cola de trabajos, en el panel de navegación, elija Entornos de computación.

  6. Elija el entorno de computación que creó para este tutorial y, a continuación, elija Deshabilitar. El entorno de computación puede tardar entre 1 y 2 minutos en terminar de deshabilitarse.

  7. Una vez que el Estado del entorno de computación esté deshabilitado, seleccione Eliminar. La eliminación del entorno de computación puede tardar entre 1 y 2 minutos.

Recursos adicionales

Después de completar el tutorial, recomendamos consultar alguno de los siguientes temas: