Introducción a AWS Batch en clústeres privados de Amazon EKS - AWS Batch

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Introducción a AWS Batch en clústeres privados de Amazon EKS

AWS Batch es un servicio gestionado que organiza cargas de trabajo por lotes en sus clústeres de Amazon Elastic Kubernetes Service (Amazon EKS). Esto incluye la creación de colas, el seguimiento de dependencias, la gestión de reintentos y las prioridades de los trabajos, la gestión de pods y el escalado de nodos. Esta característica conecta su clúster privado de Amazon EKS existente con AWS Batch para ejecutar sus trabajos a escala. Puede utilizar eksctl (una interfaz de línea de comandos para Amazon EKS), la consola de AWS o AWS Command Line Interface para crear un clúster privado de Amazon EKS con el resto de recursos necesarios.

Por defecto, los clústeres privados de Amazon EKS no tienen acceso a Internet de entrada o salida, y solo pueden obtener acceso al servidor de API desde la VPC o una red conectada. Los puntos de enlace de VPC de Amazon se utilizan para permitir el acceso privado a otros servicios de AWS. eksctl admite la creación de clústeres totalmente privados mediante una VPC de Amazon y subredes preexistentes. eksctl también crea puntos de enlace de VPC de Amazon en la VPC de Amazon suministrada y modifica las tablas de enrutamiento de las subredes proporcionadas.

Cada subred debe tener asociada una tabla de enrutamiento explícita, ya que eksctl no modifica la tabla de enrutamiento principal. El clúster debe extraer imágenes de un registro de contenedores que esté en su VPC de Amazon. Además, puede crear un Amazon Elastic Container Registry en su VPC de Amazon y copiar las imágenes del contenedor para que sus nodos puedan extraerlas. Para obtener más información, consulte Copiar una imagen de contenedor de un repositorio en otro repositorio. Para empezar a utilizar los repositorios privados de Amazon ECR, consulte Repositorios privados de Amazon ECR.

También puede crear una regla de caché de extracción con Amazon ECR. Una vez creada una regla de caché de extracción para un registro público externo, extraiga una imagen de ese registro público externo mediante el identificador de recursos uniforme (URI) de su registro privado de Amazon ECR. A continuación, Amazon ECR crea un repositorio y almacena la imagen en la caché. Cuando se extrae una imagen en caché mediante el URI del registro privado de Amazon ECR, Amazon ECR verifica el registro remoto para ver si hay una nueva versión de la imagen y actualiza su registro privado hasta una vez cada 24 horas.

Descripción general

En este tutorial se muestra cómo realizar la configuración de AWS Batch con un Amazon EKS privado mediante AWS CloudShell, 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:

  • utilizar Amazon Elastic Container Registry (Amazon ECR) para almacenar imágenes de contenedor,

  • 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 40 y 50 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
Instancia de Amazon EC2 Usted paga por cada instancia de Amazon EC2 creada. Para obtener más información acerca de los precios, consulte Precios de Amazon EC2.

Requisitos previos

Este tutorial utiliza AWS CloudShell, el cual es un shell previamente autenticado y basado en navegador que se lanza directamente desde la Consola de administración de AWS. Esto permite acceder al clúster cuando deje de tener acceso público a Internet. Existe la posibilidad de que AWS CLI, kubectl y eksctl ya estén instalados como parte de AWS CloudShell. Para obtener más información sobre AWS CloudShell, consulte la Guía del usuario de AWS CloudShell. Una alternativa para AWS CloudShell es conectarse a la VPC del clúster o a una red conectada.

Para ejecutar comandos de kubectl, necesitará acceso privado a su clúster de Amazon EKS. Esto significa que todo el tráfico al servidor de la API del clúster debe proceder de dentro de la VPC de su clúster o de una red conectada.

Paso 1: Crear el clúster de 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.

Recomendamos utilizar eksctl y el siguiente archivo de configuración para crear el clúster. Para configurar el clúster de forma manual, siga las instrucciones en Implementación de clústeres privados con acceso limitado a Internet de la Guía del usuario de Amazon EKS.

  1. Abra la consola de AWS CloudShell y establezca la región en us-east-1. Para el resto del tutorial, asegúrese de estar utilizando us-east-1.

  2. Cree un clúster de EKS privado en la región us-east-1 mediante el ejemplo de archivo de configuración eksctl. Guarde el archivo yaml en su entorno de AWS CloudShell y póngale como nombre clusterConfig.yaml. Puede cambiar my-test-cluster por el nombre que desee usar para el clúster.

    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. Cree los recursos con el siguiente comando: eksctl create cluster -f clusterConfig.yaml La creación del cluster puede tardar entre 10 y 15 minutos.

  4. Una vez que el clúster haya terminado de crearse, tendrá que agregar su dirección IP de AWS CloudShell a la lista de direcciones permitidas. Para encontrar la dirección IP de AWS CloudShell, ejecute el siguiente comando:

    curl http://checkip.amazonaws.com

    Luego de conseguir la dirección IP pública, debe crear una regla de lista de permitidos:

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

    A continuación, aplique la actualización al archivo de configuración de kubectl:

    aws eks update-kubeconfig --name my-test-cluster --region us-east-1
  5. Ejecute el siguiente comando para comprobar que tiene acceso a los nodos:

    kubectl get nodes

    La salida del comando será:

    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

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

Todos los pasos son obligatorios y deben realizarse en AWS CloudShell.

  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. Haga esto una vez para cada clúster de 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

    Salida:

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

    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

    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.

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

    Salida:

    2022-10-25 20:19:57 [ℹ] adding identity "arn:aws:iam::<your-account-ID>: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-test-cluster 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-test-cluster \ --query cluster.resourcesVpcConfig.clusterSecurityGroupId
  • Utilice el ARN del instanceRole que creó en los requisitos previos.

$ 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
Notas
  • El mantenimiento de un entorno de computación de Amazon EKS es una responsabilidad compartida. Para obtener más información, consulte Seguridad en Amazon EKS.

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 Solución de problemas 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 un Amazon ECR con pull through cache

Como el clúster no tiene acceso público a Internet, deberá crear un Amazon ECR para las imágenes del contenedor. Las siguientes instrucciones crean un Amazon ECR con pull-through cache rule (regla de cache de extracción) para almacenar la imagen.

  1. El siguiente comando crea la pull-through cache rule. Puede sustituir tutorial-prefix con un prefijo distinto.

    aws ecr create-pull-through-cache-rule \ --ecr-repository-prefix "my-prefix" \ --upstream-registry-url "public.ecr.aws" \ --region us-east-1
  2. Autentifíquese con el ECR público.

    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

    Ahora puede extraer una imagen.

    docker pull <your-account-ID>.dkr.ecr.us-east-1.amazonaws.com/my-prefix/amazonlinux/amazonlinux:2
  3. Verifique el repositorio y la imagen ejecutando los siguientes comandos:

    aws ecr describe-repositories
    aws ecr describe-images --repository-name my-prefix/amazonlinux/amazonlinux
  4. La cadena de imagen que se utilizará para extraer el contenedor tiene el siguiente formato:

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

Paso 6: Registrar una definición de trabajo

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

En el campo de imagen de la definición del trabajo, en lugar de proporcionar un enlace a la imagen de un repositorio de ECR público, facilite el enlace a la imagen almacenada en nuestro repositorio de ECR privado. Consulte el siguiente ejemplo de definición del trabajo:

$ 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

Notas

Paso 7: Enviar un trabajo para ejecutarlo

Ejecute el siguiente comando de AWS CLI en AWS CloudShell para enviar un nuevo trabajo y obtener el JobID único.

$ aws batch submit-job --job-queue My-Eks-JQ1 \ --job-definition MyJobOnEks_Sleep - -job-name My-Eks-Job1
Notas
  • Para obtener más información sobre la ejecución de trabajos en recursos de Amazon EKS, consulte Trabajos de Amazon EKS.

Paso 8: Ver la salida del trabajo

Cómo comprobar el estado de un trabajo:

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

Los startedAt y stoppedAt deben estar separados por un minuto.

Paso 9: (opcional) Enviar un trabajo con anulaciones

Este trabajo anula el comando transferido al contenedor.

$ 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

Paso 10: 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. En Acciones, seleccione 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 desde Acciones. 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:

Solución de problemas

Si los nodos lanzados por AWS Batch no tienen acceso al repositorio de Amazon ECR (o a ningún otro repositorio) que almacene su imagen, los trabajos podrían permanecer en el estado STARTING. Esto se debe a que el pod no podrá descargar la imagen ni ejecutar el trabajo de AWS Batch. Si hace clic en el nombre del pod lanzado por AWS Batch, podrá ver el mensaje de error y confirmar el problema. El mensaje de error debería ser similar al siguiente:

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

Para ver otros escenarios de solución de problemas comunes, consulte Solución de problemas de AWS Batch. Para solucionar problemas relacionados con el estado del pod, consulte ¿Cómo puedo solucionar los problemas relacionados con el estado de los pods en Amazon EKS?