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.
Tutorial: 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
Los clústeres exclusivos privados de Amazon EKS no tienen acceso a Internet entrante ni saliente, solo subredes privadas. 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.
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.eksctl
Cada subred debe tener asociada una tabla de enrutamiento explícita, ya que
no modifica la tabla de enrutamiento principal. El clústereksctl
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.
Contenido
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. También debe crear todos los recursos necesarios, como la VPC, las subredes, las tablas de enrutamiento, los puntos de conexión de la VPC y el clúster de Amazon EKS. Debe utilizar AWS CLI.
-
AWS CLI: una herramienta de línea de comandos para trabajar con servicios de AWS, 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.
Después de instalar AWS CLI, recomendamos que también la 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 de
en la Guía del usuario de Amazon EKS.eksctl
-
Permisos de AWS Identity and Access Management (IAM) necesarios: la entidad principal de seguridad de IAM que está utilizando debe contar con permisos para trabajar con los roles de IAM de Amazon EKS y los roles vinculados al servicio, AWS CloudFormation, y una VPC y recursos relacionados. Para obtener más información, consulte Acciones, recursos y claves de condición de Amazon Elastic Kubernetes Service y Uso de roles vinculados a servicios en la Guía del usuario de IAM. Debe completar todos los pasos de esta guía como el mismo usuario.
-
Creación de un clúster de Amazon EKS: para obtener más información, consulte Introducción a Amazon EKS:
eksctl
en la Guía del usuario de Amazon EKS.nota
AWS Batch no proporciona una orquestación de nodos gestionados para CoredNS u otros pods de implementación. Si necesita CoreDNS, consulte Agregar el complemento CoreDNS para Amazon EKS en la Guía del usuario de Amazon EKS. O bien, utilice
eksctl create cluster create
para crear el clúster, que incluye CoredNS de forma predeterminada. -
Permisos: los usuarios que llamen a la operación de API CreateComputeEnvironment para crear un entorno de procesamiento que utilice recursos de Amazon EKS requieren permisos para la operación de API de
eks:DescribeCluster
. El uso de AWS Management Console para crear un recurso de computación con recursos de Amazon EKS requiere permisos tanto paraeks:DescribeCluster
como paraeks:ListClusters
. -
Cree un clúster de EKS privado en la región us-east-1 mediante el ejemplo de archivo de configuración
.eksctl
kind: ClusterConfig apiVersion: eksctl.io/v1alpha5 availabilityZones: - us-east-1a - us-east-1b - us-east-1d managedNodeGroups: privateNetworking: true privateCluster: enabled: true skipEndpointCreation: false
Crear recursos con el siguiente comando:
eksctl create cluster -f clusterConfig.yaml
-
Los nodos administrados en lotes deben implementarse en subredes que tengan los puntos de conexión de la interfaz de VPC que necesita. Para obtener más información, consulte Requisitos del clúster privado.
Preparar el clúster de EKS para AWS Batch
Todos los pasos son obligatorios.
-
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.nota
Para obtener más información sobre el uso de la autorización de RBAC, consulte Uso de la autorización de RBAC
en la Documentación de Kubernetes. $
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 EOFSalida:
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 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 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-cluster-name
\ --arn "arn:aws:iam::<your-account>
:role/AWSServiceRoleForBatch" \ --usernameaws-batch
Salida:
2022-10-25 20:19:57 [ℹ] adding identity "arn:aws:iam::
<your-account>
: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.
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.
$
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
Notas
-
No se debe especificar el parámetro
serviceRole
y, a continuación, se utilizará el rol vinculado al servicio AWS Batch. AWS Batch en Amazon EKS solo admite el rol vinculado al servicio AWS Batch. -
Solo las estrategias de asignación
BEST_FIT_PROGRESSIVE
,SPOT_CAPACITY_OPTIMIZED
ySPOT_PRICE_CAPACITY_OPTIMIZED
son compatibles con los entornos de computación de Amazon EKS.nota
Se recomienda utilizar
SPOT_PRICE_CAPACITY_OPTIMIZED
en lugar deSPOT_CAPACITY_OPTIMIZED
en la mayoría de los casos. -
Para
instanceRole
, consulte Crear el rol de IAM del nodo de Amazon EKS y Habilitar el acceso principal de IAM a su clúster en la Guía del usuario de Amazon EKS. Si utiliza redes de pod, consulte Configuración del complemento de CNI de Amazon VPC para Kubernetes para utilizar roles de IAM en las cuentas de servicio en la Guía del usuario de Amazon EKS. -
Una forma de hacer que las subredes funcionen para el parámetro
subnets
consiste en utilizar las subredes públicas de los grupos de nodo administrados por Amazon EKS que creóeksctl
al crear un clúster de Amazon EKS. De lo contrario, utilice subredes que tengan una ruta de red que permita extraer imágenes. -
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.$
eks describe-cluster \ --name
<cluster-name>
\ --query cluster.resourcesVpcConfig.clusterSecurityGroupId -
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.
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.
Crear una cola de trabajos y adjuntar el entorno de computación
$
aws batch describe-compute-environments --compute-environments
My-Eks-CE1
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
Creación de una definición de trabajo
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": "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
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.
Enviar un trabajo
$
aws batch submit-job - -job-queue
My-Eks-JQ1
\ - -job-definitionMyJobOnEks_Sleep
- -job-nameMy-Eks-Job1
$
aws batch describe-jobs - -job
<jobId-from-submit-response>
Notas
-
Solo se admiten trabajos de un solo contenedor.
-
Asegúrese de estar familiarizado con todas las consideraciones relevantes para los parámetros
cpu
ymemory
. Para obtener más información, consulte Consideraciones sobre memoria y vCPU para AWS Batch en Amazon EKS. -
Para obtener más información sobre la ejecución de trabajos en recursos de Amazon EKS, consulte EKSEmpleos en Amazon.
(Opcional) Envíe un trabajo con cambios
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
-
AWS Batch limpia agresivamente 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.
-
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 en Amazon EKS.
Resolució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 soluciono los problemas del estado del pod en Amazon EKS?