Introducción a AWS Batch Amazon EKS Private Clusters - 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 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 las dependencias, la gestión de los reintentos y las prioridades de los trabajos, la administración de los pods y el escalado de los 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(una interfaz de línea de comandos para Amazon EKS), la AWS consola o la AWS Command Line Interfacepara crear un clúster privado de Amazon EKS con todos los demás recursos necesarios. El soporte para clústeres privados de Amazon EKS AWS Batch está generalmente disponible en formato comercial, Regiones de AWS donde AWS Batch esté disponible.

Los clústeres exclusivos privados de Amazon EKS no tienen acceso a Internet entrante ni saliente y solo tienen subredes privadas. Los puntos de enlace de Amazon VPC se utilizan para permitir el acceso privado a otros servicios. AWS eksctladmite la creación de clústeres totalmente privados mediante una Amazon VPC y subredes preexistentes. eksctltambién crea puntos de enlace de Amazon VPC en la Amazon VPC suministrada y modifica las tablas de enrutamiento de las subredes suministradas.

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 se encuentre en su Amazon VPC. Además, puede crear un Amazon Elastic Container Registry en su Amazon VPC y copiar en él las imágenes del contenedor para que las extraigan sus nodos. Para obtener más información, consulte Copiar una imagen de contenedor de un repositorio a otro repositorio. Para empezar a utilizar los repositorios privados de Amazon ECR, consulte Repositorios privados de Amazon ECR.

Si lo desea, puede crear una regla de extracción de caché 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 de recursos (URI) uriforme del registro privado de Amazon ECR. A continuación, Amazon ECR crea un repositorio y almacena la imagen en caché. Cuando se extrae una imagen en caché mediante el URI del registro privado de Amazon ECR, Amazon ECR comprueba el registro remoto para comprobar si hay una nueva versión de la imagen y actualiza el registro privado hasta una vez cada 24 horas.

Requisitos previos

Antes de comenzar este tutorial, debe instalar y configurar las siguientes herramientas y recursos que necesita para crear y administrar tanto AWS Batch los recursos de Amazon EKS. También debe crear todos los recursos necesarios, como la VPC, las subredes, las tablas de rutas, los puntos de enlace de la VPC y el clúster de Amazon EKS. Debe usar el. AWS CLI

  • 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 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 Kubernetes clústeres. Esta guía requiere que utilice la versión 1.23 o una posterior. Para obtener más información, consulte Instalación o actualización de kubectl en la Guía del usuario de Amazon EKS.

  • eksctl— Una herramienta de línea de comandos para trabajar con clústeres de Amazon EKS que automatiza muchas tareas individuales. Esta guía requiere que utilice la versión 0.115.0 o una posterior. Para obtener más información, consulte Instalación o actualización de eksctl en la Guía del usuario de Amazon EKS.

  • Permisos obligatorios AWS Identity and Access Management (IAM): el responsable de seguridad de IAM que utilice debe tener permisos para trabajar con las funciones de IAM de Amazon EKS y las funciones vinculadas a servicios AWS CloudFormation, así como con una VPC y los recursos relacionados. Para obtener más información, consulte Acciones, recursos y claves de condición para 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 organizació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 CreateComputeEnvironmentAPI para crear un entorno de cómputo que utilice los recursos de Amazon EKS necesitan permisos para la operación de eks:DescribeCluster API. El uso de AWS Management Console para crear un recurso informático con recursos de Amazon EKS requiere permisos eks:DescribeCluster tanto para como paraeks:ListClusters.

  • Cree un clúster EKS privado en la región us-east-1 con el archivo de eksctl configuración de ejemplo.

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

    Cree sus recursos con el comando: eksctl create cluster -f clusterConfig.yaml

  • Los nodos gestionados por lotes se deben implementar en subredes que tengan los puntos finales de interfaz de VPC que necesite. Para obtener más información, consulte Requisitos de los clústeres privados.

Paso 1: Preparar el clúster de 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 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 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 Kubernetes rol dentro del espacio de nombres para gestionar y vincular los pods durante todo AWS Batch 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 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-cluster-name \ --arn "arn:aws:iam::<your-account>:role/AWSServiceRoleForBatch" \ --username aws-batch

    Salida:

    2022-10-25 20:19:57 [ℹ] adding identity "arn:aws:iam::<your-account>: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 Los roles con rutas no funcionan cuando la ruta está incluida en su ARN en. aws-authconfigmap

Paso 2: Creación de un entorno de computación de 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 bajo demanda EC2 o instancias de spot EC2.

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.

$ 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 serviceRole parámetro; en ese caso, se utilizará el rol AWS Batch vinculado al servicio. AWS Batch en Amazon EKS solo admite la función AWS Batch vinculada al servicio.

  • Solo BEST_FIT_PROGRESSIVE se SPOT_CAPACITY_OPTIMIZED admiten estrategias de SPOT_PRICE_CAPACITY_OPTIMIZED asignación para los entornos informáticos de Amazon EKS.

    nota

    Se recomienda utilizar SPOT_PRICE_CAPACITY_OPTIMIZED en lugar de SPOT_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 informático 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 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.

Paso 3: cree una cola de trabajos y adjunte 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 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 4: crear 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, proporcione 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": "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 los comandos de kubectl, necesitará acceso privado a su clúster de Amazon EKS. Esto significa que todo el tráfico al servidor de API del clúster debe provenir de la VPC del clúster o de una red conectada.

Paso 5: presentar un trabajo

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

(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

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 tener un aspecto 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 AWS Batch. Para solucionar problemas relacionados con el estado del pod, consulte ¿Cómo soluciono los problemas del estado del pod en Amazon EKS? .