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.
Cómo empezar a utilizar AWS Batch Amazon EKS Private Clusters
AWS Batch es un servicio gestionado que organiza las cargas de trabajo por lotes en los 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 función conecta su clúster privado de Amazon EKS existente con el AWS Batch fin de ejecutar sus trabajos a escala. Puede utilizar eksctl
De forma predeterminada, los clústeres privados de Amazon EKS no tienen acceso a inbound/outbound Internet y solo puede acceder al servidor de API desde su VPC o desde una red conectada. Los puntos de enlace de Amazon VPC se utilizan para permitir el acceso privado a otros servicios. AWS
eksctl
admite la creación de clústeres totalmente privados mediante una Amazon VPC y subredes preexistentes.
también crea puntos de enlace de Amazon VPC en la Amazon VPC suministrada y modifica las tablas de enrutamiento de las subredes suministradas.eksctl
Cada subred debe tener asociada una tabla de enrutamiento explícita, ya que
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.eksctl
También puede crear una regla de caché de extracción con Amazon ECR. Una vez creada una regla de extracción de caché para un registro público externo, puede extraer una imagen de ese registro público externo mediante el identificador uniforme de recursos (URI) del 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 AWS Batch con un Amazon EKS privado mediante AWS CloudShell, kubectl
yeksctl
.
- Público al que va dirigido
-
Este tutorial está diseñado para los administradores y desarrolladores de sistemas responsables de la configuración, las pruebas y la implementación AWS Batch.
- Funciones utilizadas
-
En este tutorial se muestra cómo utilizar el AWS CLI, para:
-
Utilice Amazon Elastic Container Registry (Amazon ECR) para almacenar imágenes de contenedores
-
Creación y configuración de un entorno informático Amazon EKS
-
Cree una cola de trabajos.
-
Creación de una definición de trabajo
-
Cree y envíe un trabajo para ejecutarlo
-
Envíe un trabajo con anulaciones
-
- Tiempo requerido
-
Completar este tutorial debería tardar entre 40 y 50 minutos.
- Restricciones regionales
-
No hay restricciones nacionales o regionales asociadas al uso de esta solución.
- Costos de uso de los recursos
-
La creación de una AWS cuenta no conlleva ningún cargo. 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) Se te cobrará por hora de clúster Varía según la instancia; consulte los precios de Amazon EKS EC2 Instancia de Amazon Pagas por cada EC2 instancia de Amazon que se cree. Para obtener más información sobre los precios, consulta Amazon EC2 Pricing .
Requisitos previos
Este tutorial AWS CloudShell utiliza un shell preautenticado y basado en un navegador que se inicia directamente desde. AWS Management Console Esto permite acceder al clúster una vez que deje de tener acceso público a Internet. El AWS CLIkubectl
, y eksctl
puede que ya estén instalados como parte de AWS CloudShell. Para obtener más información al respecto AWS CloudShell, consulte la Guía AWS CloudShell del usuario. Una alternativa 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.
-
AWS CLI— Una herramienta de línea de comandos para trabajar con AWS servicios, incluido Amazon EKS. Esta guía requiere que utilices la versión 2.8.6 o posterior o la 1.26.0 o posterior. Para obtener más información, consulte Instalar, actualizar y desinstalar la AWS CLI en la Guía del usuario de AWS Command Line Interface . Tras instalarlo AWS CLI, le recomendamos que también lo configure. Para obtener más información, consulte Configuración rápida con
aws configure
en la Guía del usuario de AWS Command Line Interface . -
kubectl
: una herramienta de línea de comandos para trabajar con clústeres de Kubernetes. Esta guía requiere que utilice la versión1.23
o una posterior. Para obtener más información, consulte Instalación o actualización dekubectl
en la Guía del usuario de Amazon EKS. -
: una herramienta de línea de comandos para trabajar con clústeres de Amazon EKS que automatiza varias tareas individuales. Esta guía requiere que utilice la versióneksctl
0.115.0
o una posterior. Para obtener más información, consulte Instalación o actualización deeksctl
en la Guía del usuario de Amazon EKS. -
Permisos: los usuarios que llamen a la operación de CreateComputeEnvironmentAPI para crear un entorno de cómputo que utilice los recursos de Amazon EKS necesitan permisos para la operación de
eks:ListClusters
APIeks:DescribeCluster
y de API. Puede adjuntar la política AWSBatchFullAccessgestionada a su cuenta de usuario siguiendo las instrucciones para añadir y eliminar permisos de identidad de IAM que aparecen en la Guía del usuario de IAM. -
InstanceRole— Debe crear una
InstanceRole
para sus nodos de Amazon EKS que tenga lasAmazonEC2ContainerRegistryPullOnly
políticasAmazonEKSWorkerNodePolicy
y. Para obtener instrucciones sobre cómo crear el rol de IAM del nodo Amazon EKS,InstanceRole
consulte Creación del rol de IAM. Necesitará el ARN del.InstanceRole
-
Cuenta de AWS ID: necesita saber su Cuenta de AWS identificación. Sigue las instrucciones que se indican en Cómo ver tu Cuenta de AWS identificación.
-
(Opcional) CloudWatch: para examinar los detalles de (opcional) Enviar un trabajo con anulaciones, se debe configurar el registro. Para obtener más información, consulte Utilice CloudWatch los registros para supervisar AWS Batch los trabajos de Amazon EKS.
Paso 1: Cree su clúster de EKS para AWS Batch
importante
Para empezar de la forma más sencilla y rápida posible, este tutorial incluye pasos con la configuración predeterminada. Antes de crear para su uso en producción, le recomendamos que se familiarice con todos los ajustes e implemente los ajustes que se ajusten a sus necesidades.
Le recomendamos que utilice
el siguiente archivo de configuración para crear el clúster. Para configurar el clúster manualmente, siga las instrucciones de la sección Implementación de clústeres privados con acceso limitado a Internet de la Guía del usuario de Amazon EKS.eksctl
-
Abra la AWS CloudShell consola
y configure la región en us-east-1
. Para el resto del tutorial, asegúrese de estar utilizandous-east-1
. -
Cree un clúster EKS privado en la
us-east-1
región con el archivo de
configuración de ejemplo. Guarde el archivo yaml en su AWS CloudShell entorno y asígneleeksctl
clusterConfig.yaml
un nombre. Puedemy-test-cluster
cambiarlo por el nombre que desee usar para su 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 -
Cree sus recursos con el comando:.
eksctl create cluster -f clusterConfig.yaml
La creación del clúster puede tardar entre 10 y 15 minutos. -
Una vez que se haya terminado de crear el clúster, tendrá que añadir su dirección AWS CloudShell IP a la lista de permitidos. Para encontrar su dirección AWS CloudShell IP, ejecute el siguiente comando:
curl http://checkip.amazonaws.com
Una vez que tenga 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, aplica la actualización al archivo de configuración de kubectl:
aws eks update-kubeconfig --name
my-test-cluster
--region us-east-1 -
Para comprobar que tienes acceso a los nodos, ejecuta el siguiente comando:
kubectl get nodes
El resultado del comando es:
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: Prepare su clúster EKS para AWS Batch
Todos los pasos son obligatorios y deben realizarse en él AWS CloudShell.
-
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
-
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 EOFSalida:
clusterrole.rbac.authorization.k8s.io/aws-batch-cluster-role created clusterrolebinding.rbac.authorization.k8s.io/aws-batch-cluster-role-binding created
Cree un Kubernetes rol centrado en el espacio de nombres para administrar los pods y vincularlos durante su ciclo AWS Batch 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 EOFSalida:
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 Kubernetes
aws-auth
mapa de configuración para asignar los permisos RBAC anteriores al rol vinculado al servicio. AWS Batch$
eksctl create iamidentitymapping \ --cluster
my-test-cluster
\ --arn "arn:aws:iam::<your-account-ID>
:role/AWSServiceRoleForBatch" \ --usernameaws-batch
Salida:
2022-10-25 20:19:57 [ℹ] adding identity "arn:aws:iam::
<your-account-ID>
:role/AWSServiceRoleForBatch" to auth ConfigMapnota
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 deaws-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 informático Amazon EKS
AWS Batch los entornos informáticos definen los parámetros de los recursos informáticos para satisfacer sus necesidades de carga de trabajo por lotes. En un entorno informático gestionado, le AWS Batch ayuda a gestionar la capacidad y los tipos de instancia de los recursos informáticos (Kubernetesnodos) 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 EC2 bajo demanda o instancias EC2 puntuales.
Ahora que el rol AWSServiceRoleForBatchvinculado al servicio tiene acceso a su clúster de Amazon EKS, puede crear AWS Batch recursos. En primer lugar, cree un entorno de computación que apunte a su clúster de Amazon EKS.
-
Para
subnets
ejecutar paraeksctl get cluster
obtener las subredes utilizadas por el clúster.my-test-cluster
-
Como
securityGroupIds
parámetro, puede usar el mismo grupo de seguridad que 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
::cluster/
<your-account-ID>
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 informático
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 DescribeComputeEnvironmentsAPI.
$
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 AWS Batch gestionados que se unieron al clúster de Amazon EKS asociado a su entorno informático.
$
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: Cree un Amazon ECR con caché de extracción
Como el clúster no tiene acceso público a Internet, debe crear un Amazon ECR para las imágenes del contenedor. Las siguientes instrucciones crean un Amazon ECR con una regla de caché desplegable para almacenar la imagen.
-
El siguiente comando crea la regla de caché desplegable. Se puede sustituir por un
tutorial-prefix
prefijo diferente.aws ecr create-pull-through-cache-rule \ --ecr-repository-prefix "
my-prefix
" \ --upstream-registry-url "public.ecr.aws" \ --region us-east-1 -
Autentí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.rproxy.govskope.caAhora puede extraer una imagen.
docker pull
<your-account-ID>
.dkr.ecr.us-east-1.amazonaws.com/my-prefix
/amazonlinux/amazonlinux:2 -
Puede verificar el repositorio y la imagen ejecutando los siguientes comandos:
aws ecr describe-repositories
aws ecr describe-images --repository-name
my-prefix
/amazonlinux/amazonlinux -
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 Job indica al módulo que duerma 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 de 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
-
Hay que tener en cuenta los parámetros
cpu
ymemory
. Para obtener más información, consulte Consideraciones sobre memoria y vCPU para AWS Batch Amazon EKS.
Paso 7: envíe un trabajo para ejecutarlo
Ejecuta el siguiente AWS CLI comando AWS CloudShell para enviar un nuevo trabajo y devuelve el JoBid único.
$
aws batch submit-job --job-queue
My-Eks-JQ1
\ --job-definitionMyJobOnEks_Sleep
- -job-nameMy-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 el resultado del trabajo
Para comprobar el estado de un Job:
$
aws batch describe-jobs --job
<JobID-from-submit-response>
Los startedAt
y stoppedAt
deben estar separados por un minuto.
Paso 9: (Opcional) Envía un trabajo con sustituciones
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
-
Para mejorar la visibilidad de los detalles de las operaciones, habilite el registro del plano de control de Amazon EKS. Para obtener más información, consulte Registros del plano de control del clúster de Amazon EKS en la Guía del usuario de Amazon EKS.
-
La sobrecarga Daemonsets y kubelets afectan a los recursos de vCPU y de memoria disponibles, específicamente al escalado y la colocación de trabajos. Para obtener más información, consulte Consideraciones sobre memoria y vCPU para AWS Batch Amazon EKS.
Paso 10: Limpia los recursos de tu tutorial
Se te cobrará por la EC2 instancia de Amazon mientras esté habilitada. Puedes eliminar la instancia para dejar de incurrir en cargos.
Para eliminar los recursos que ha creado, haga lo siguiente:
-
Abra la AWS Batch consola en https://console.aws.amazon.com/batch/
. -
En el panel de navegación, seleccione Lista de trabajos.
-
En la tabla de colas de trabajos, elija la cola de trabajos que creó para el tutorial.
-
En Acciones, elija Desactivar. Una vez que el estado de la cola de trabajos esté deshabilitado, puede elegir Eliminar.
-
Una vez eliminada la cola de trabajos, en el panel de navegación, elija Entornos de cómputo.
-
Elija el entorno informático que creó para este tutorial y, a continuación, elija Desactivar desde acciones. El entorno de cómputo puede tardar entre 1 y 2 minutos en terminar de inhabilitarse.
-
Una vez que el estado del entorno de cómputo esté deshabilitado, seleccione Eliminar. La eliminación del entorno informático puede tardar entre 1 y 2 minutos.
Recursos adicionales
Después de completar el tutorial, es posible que desee explorar los siguientes temas:
-
Obtenga más información sobre las prácticas recomendadas.
-
Explore los componentes AWS Batch principales. Para obtener más información, consulte Componentes de AWS Batch.
-
Obtenga más información sobre los diferentes entornos de cómputo disponibles en AWS Batch.
-
Más información sobre las colas de trabajos y sus diferentes opciones de programación.
-
Obtenga más información sobre las definiciones de trabajos y las diferentes opciones de configuración.
-
Obtenga más información sobre los distintos tipos de trabajos.
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, sus trabajos podrían permanecer en el estado STARTING. Esto se debe a que el pod no podrá descargar la imagen ni ejecutar su AWS Batch trabajo. Si haces clic en el nombre del pod lanzado por, AWS Batch deberías poder 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 obtener información sobre la solución de problemas en función del estado del pod, consulte ¿Cómo soluciono los problemas del estado del pod en Amazon EKS