Conceitos básicos do AWS Batch em clusters privados do Amazon EKS - AWS Batch

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Conceitos básicos do AWS Batch em clusters privados do Amazon EKS

O AWS Batch é um serviço gerenciado que orquestra workloads em lote nos seus clusters do Amazon Elastic Kubernetes Service (Amazon EKS). Isso inclui enfileiramento, monitoramento de dependências, tentativas e prioridades gerenciadas de tarefas, gerenciamento de pods e nós em escala. Esse recurso conecta seu cluster privado existente do Amazon EKS com o AWS Batch para executar seus trabalhos em grande escala. É possível usar o eksctl (uma interface de linha de comando para o Amazon EKS), o console do AWS ou a AWS Command Line Interface para criar um cluster privado do Amazon EKS com todos os outros recursos necessários.

Por padrão, os clusters privados do Amazon EKS não têm acesso de entrada/saída à Internet, e você só pode acessar o servidor de API pela VPC ou por uma rede conectada. Endpoints da VPC Amazon são usados para permitir o acesso privado a outros serviços da AWS. O eksctl oferece suporte à criação de clusters totalmente privados usando uma Amazon VPC e sub-redes pré-existentes. O eksctl também cria endpoints da Amazon VPC na Amazon VPC fornecida e modifica as tabelas de rotas para as sub-redes fornecidas.

Cada sub-rede deve ter uma tabela de rotas explícita associada a ela, pois o eksctl não modifica a tabela de rotas principal. O cluster deve extrair imagens de um registro de contêiner que esteja na Amazon VPC. Você também pode criar um Amazon Elastic Container Registry na Amazon VPC e copiar para ele as imagens de contêiner para que os nós as extrai dali. Para obter mais informações, consulte Copiar uma imagem de contêiner de um repositório para outro. Para começar a usar repositórios privados do Amazon ECR, consulte Repositórios privados do Amazon ECR.

Opcionalmente, é possível criar uma regra de cache de pullthrough com o Amazon ECR. Depois que uma regra de cache de pullthrough é criada para um registro público externo, é possível extrair uma imagem desse registro público externo usando seu URI (Identificador de recursos uriformes) de registro privado do Amazon ECR. Em seguida, o Amazon ECR cria um repositório e armazena a imagem no cache. Quando uma imagem em cache é extraída usando o URI de registro privado do Amazon ECR, o Amazon ECR verifica o registro remoto para ver se há uma nova versão da imagem e atualiza seu registro privado até uma vez a cada 24 horas.

Visão geral

Este tutorial demonstra como configurar AWS Batch com um Amazon EKS privado usando o AWS CloudShell, kubectl e eksctl.

Público-alvo

Este tutorial foi desenvolvido para administradores de sistemas e desenvolvedores responsáveis pela configuração, teste e implantação do AWS Batch.

Atributos usados

Este tutorial mostra como usar o AWS CLI para:

  • Usar o Amazon Elastic Container Registry (Amazon ECR) para armazenar imagens de contêiner

  • Criar e configurar um ambiente computacional do Amazon EKS

  • Crie uma fila de trabalhos.

  • Crie uma definição de trabalho

  • Criar e enviar um trabalho para execução

  • Enviar um trabalho com substituições

Tempo necessário

Levará entre 40 e 50 minutos, aproximadamente, para concluir este tutorial.

Restrições regionais

Não há restrições de país ou regionais associadas ao uso desta solução.

Custos pelo uso de recursos

Não há cobrança para criar uma conta da AWS. Contudo, ao implementar essa solução, pode haver alguns ou todos os custos listados na tabela a seguir.

Descrição Custo (dólares dos EUA)
Você é cobrado por hora do cluster Varia de acordo com a instância, consulte os preços do Amazon EKS
Instância do Amazon EC2 Você paga por cada instância do Amazon EC2 que é criada. Para obter mais informações sobre a definição de preço, consulte Definição de preço do Amazon EC2.

Pré-requisitos

Este tutorial usa o AWS CloudShell, que é um shell pré-autenticado baseado em navegador que você pode iniciar diretamente do Console de gerenciamento da AWS. Isso permite o acesso ao cluster quando ele não tem mais acesso público à Internet. O AWS CLI, kubectl e eksctl podem já estar instalados como parte do AWS CloudShell. Para obter mais informações sobre o AWS CloudShell, consulte o AWS CloudShellGuia do usuário. Uma alternativa ao AWS CloudShell é conectar-se à VPC do seu cluster ou a uma rede conectada.

Para executar comandos kubectl, você precisará de acesso privado ao cluster do Amazon EKS. Isso significa que todo o tráfego para o servidor de API do cluster deve vir da VPC do cluster ou de uma rede conectada.

  • AWS CLI – Uma ferramenta de linha de comando para trabalhar com os serviços AWS, incluindo o Amazon EKS. Este guia exige que você use a versão 2.8.6 ou superior, ou a versão 1.26.0 ou superior. Para obter mais informações, consulte Como instalar, atualizar e desinstalar a AWS CLI no Guia do usuário da AWS Command Line Interface. Depois de instalar a AWS CLI, recomendamos que você também a configure. Para obter mais informações, consulte Configuração rápida com o aws configure no Manual do usuário do AWS Command Line Interface.

  • kubectl: uma ferramenta de linha de comando para trabalhar com clusters do Kubernetes. Este guia requer que você use a versão 1.23 ou superior. Para obter mais informações, consulte Instalar ou atualizar o kubectl no Guia do usuário do Amazon EKS.

  • eksctl – uma ferramenta de linha de comando para trabalhar com clusters do Amazon EKS que automatiza várias tarefas individuais. Este guia requer que você use a versão 0.115.0 ou superior. Para obter mais informações, consulte Instalar ou atualizar o eksctl no Guia do usuário do Amazon EKS.

  • Permissões: os usuários que chamam a operação CreateComputeEnvironment da API para criar um ambiente computacional que usa recursos do Amazon EKS precisam de permissões para a operação eks:DescribeCluster e eks:ListClusters da API. Você pode anexar a política gerenciada AWSBatchfullAccess à sua conta de usuário seguindo as instruções Como adicionar e remover permissões de identidade IAM no Guia do usuário do IAM.

  • InstanceRole — Você precisa criar um InstanceRole para seus nós do Amazon EKS que tenha as políticas AmazonEKSWorkerNodePolicy e AmazonEC2ContainerRegistryPullOnly. Para obter instruções sobre como criar o InstanceRole, consulte Criar o perfil do IAM do nó Amazon EKS. Você precisará do ARN do InstanceRole.

  • ID Conta da AWS — Você precisa saber seu ID Conta da AWS. Siga as instruções em Visualizar seu ID Conta da AWS.

  • (Opcional) CloudWatch — Para examinar os detalhes de (Opcional) Enviar um trabalho com substituições, o registro em log deve ser configurado. Para obter mais informações, consulte Use o CloudWatch Logs para monitorar AWS Batch trabalhos do Amazon EKS.

Etapa 1: criar seu cluster EKS para AWS Batch

Importante

Para começar da forma mais simples e rápida possível, este tutorial inclui etapas com configurações padrão. Antes de criar para uso em produção, recomendamos que você se familiarize com todas as configurações e implante com as configurações que atendam aos seus requisitos.

Recomendamos que você use eksctl e o seguinte arquivo de configuração para criar seu cluster. Para configurar manualmente seu cluster, siga as instruções em Implantar clusters privados com acesso limitado à Internet no Guia do usuário do Amazon EKS.

  1. Abra o Console AWS CloudShell e defina a região como us-east-1. Para o resto do tutorial, certifique-se de usar o us-east-1.

  2. Crie um cluster EKS privado na região us-east-1 usando o arquivo de configuração de amostra eksctl. Salve o arquivo yaml em seu ambiente AWS CloudShell e dê a ele o nome clusterConfig.yaml. Você pode alterar my-test-cluster com o nome que deseja usar para seu cluster.

    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. Crie seus recursos com o comando: eksctl create cluster -f clusterConfig.yaml. A criação do cluster pode levar de 10 a 15 minutos.

  4. Depois que o cluster terminar de ser criado, você deverá adicionar seu endereço IP AWS CloudShell à lista de permissões. Para encontrar seu endereço IP AWS CloudShell, execute o seguinte comando:

    curl http://checkip.amazonaws.com

    Quando tiver o endereço IP público, você precisará criar uma regra de lista de permissões:

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

    Em seguida, aplique a atualização no arquivo de configuração kubectl:

    aws eks update-kubeconfig --name my-test-cluster --region us-east-1
  5. Para testar se você tem acesso aos nós, execute o seguinte comando:

    kubectl get nodes

    A saída do comandos é:

    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

Etapa 2: preparando seu cluster EKS para o AWS Batch

Todas as etapas são obrigatórias e devem ser executadas no AWS CloudShell.

  1. Crie um namespace dedicado para trabalhos do AWS Batch

    Use o kubectl para criar um namespace.

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

    Resultado:

    namespace/my-aws-batch-namespace created
  2. Habilite o acesso por meio do controle de acesso com base em perfil (RBAC)

    Use o kubectl para criar uma função do Kubernetes para o cluster do AWS Batch para permitir observar nós e pods e vincular a função. Você deve fazer isso uma vez para cada cluster do 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

    Resultado:

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

    Crie uma função do com escopo de namespace do Kubernetes para o AWS Batch para gerenciar e fazer o ciclo de vida dos pods e vincule-os. Você deve fazer isso uma vez para cada namespace exclusivo.

    $ 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

    Resultado:

    role.rbac.authorization.k8s.io/aws-batch-compute-environment-role created rolebinding.rbac.authorization.k8s.io/aws-batch-compute-environment-role-binding created

    Atualize o mapa de configuração do Kubernetes aws-auth para mapear as permissões RBAC anteriores para a função vinculada ao serviço do AWS Batch.

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

    Resultado:

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

    O caminho aws-service-role/batch.amazonaws.com/ foi removido do ARN so perfil vinculado ao serviço. Isso ocorre devido a um problema com o mapa de configuração aws-auth. Para obter mais informações, consulte Perfis com caminhos não funcionam quando o caminho é incluído em seu ARN no aws-authconfigmap.

Etapa 3: criar um ambiente computacional do Amazon EKS

Ambientes de computação do AWS Batch definem parâmetros de recursos de computação para atender às suas necessidades de workload em lote. Em um ambiente de computação gerenciado, o AWS Batch ajuda a gerenciar os tipos de capacidade e instância dos recursos de computação (nós do Kubernetes) dentro do seu cluster do Amazon EKS. Isso se baseia na especificação do recurso de computação que você define ao criar o ambiente de computação. Você pode usar instâncias sob demanda do EC2 ou instâncias spot do EC2.

Agora que a função AWSServiceRoleForBatch vinculada ao serviço tem acesso ao seu cluster do Amazon EKS, você pode criar recursos do AWS Batch. Primeiro, crie um ambiente computacional que aponte para seu cluster do Amazon EKS.

  • Para o subnets executar eksctl get cluster my-test-cluster para obter as sub-redes usadas pelo cluster.

  • Para o parâmetro securityGroupIds você pode usar o mesmo grupo de segurança do cluster do Amazon EKS. Esse comando recupera o ID do grupo de segurança do cluster.

    $ aws eks describe-cluster \ --name my-test-cluster \ --query cluster.resourcesVpcConfig.clusterSecurityGroupId
  • Use o ARN do instanceRole que você criou nos Pré-requisitos.

$ 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
Observações
  • A manutenção de um ambiente de computação do Amazon EKS é uma responsabilidade compartilhada. Para obter mais informações, consulte Segurança no Amazon EKS.

Etapa 4: Criar uma fila de trabalhos e anexar o ambiente de computação

Importante

É importante confirmar se o ambiente de computação está íntegro antes de continuar. A operação da API DescribeComputeEnvironments pode ser usada para fazer isso.

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

Confirme se o parâmetro status não está INVALID. Se estiver, veja o parâmetro statusReason para saber a causa. Para obter mais informações, consulte Solução de problemas AWS Batch.

Os trabalhos enviados para essa nova fila de trabalhos são executados como pods em nós gerenciados do AWS Batch que se juntaram ao cluster do Amazon EKS associado ao seu ambiente computacional.

$ 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

Etapa 5: criar um Amazon ECR com cache pull through

Como o cluster não tem acesso público à Internet, você precisa criar um Amazon ECR para imagens de contêineres. As instruções a seguir criam um Amazon ECR com uma regra de cache pull-through para armazenar a imagem.

  1. O comando a seguir cria a regra de cache pull-through. Você pode substituir tutorial-prefix por um prefixo diferente.

    aws ecr create-pull-through-cache-rule \ --ecr-repository-prefix "my-prefix" \ --upstream-registry-url "public.ecr.aws" \ --region us-east-1
  2. Autentique com o 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

    Agora você pode puxar uma imagem.

    docker pull <your-account-ID>.dkr.ecr.us-east-1.amazonaws.com/my-prefix/amazonlinux/amazonlinux:2
  3. Você pode verificar o repositório e a imagem executando os seguintes comandos:

    aws ecr describe-repositories
    aws ecr describe-images --repository-name my-prefix/amazonlinux/amazonlinux
  4. A string de imagem a ser usada para puxar o contêiner está no seguinte formato:

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

Etapa 6: registrar uma definição de trabalho

A definição de trabalho a seguir instrui o pod a dormir por 60 segundos.

No campo de imagem da definição do trabalho, em vez de fornecer um link para a imagem em um repositório do ECR público, forneça o link para a imagem armazenada no nosso repositório do ECR privado. Veja o exemplo de definição de trabalho a seguir:

$ 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

Observações

Etapa 7: enviar um trabalho para execução

Execute o comando AWS CLI a seguir no AWS CloudShell para enviar um novo trabalho e retornar o JobID exclusivo.

$ aws batch submit-job --job-queue My-Eks-JQ1 \ --job-definition MyJobOnEks_Sleep - -job-name My-Eks-Job1
Observações
  • Para obter mais informações sobre como executar trabalhos em recursos do Amazon EKS, consulte Trabalhos do Amazon EKS.

Etapa 8: ver a saída do trabalho

Para verificar o status de um trabalho:

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

startedAt e stoppedAt devem ter um minuto de diferença.

Etapa 9: (Opcional) Enviar um trabalho com substituições

Esse trabalho substitui o comando passado para o contêiner.

$ 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
Observações

Etapa 10: limpar os recursos do tutorial

Você será cobrado pela instância do Amazon EC2 enquanto ela estiver ativada. É possível excluir a instância para não incorrer mais em cobranças.

Para excluir os recursos criados, faça o seguinte:

  1. Abra o console AWS Batch em https://console.aws.amazon.com/batch/.

  2. No painel de navegação, escolha Filas de trabalhos.

  3. Na tabela Fila de trabalhos, escolha a fila de trabalhos que você criou para o tutorial.

  4. Em Ações, escolha Desativar. Depois que o Estado da fila de trabalhos estiver desativado, você poderá escolher Excluir.

  5. Depois que a fila de trabalhos for excluída, no painel de navegação, escolha Ambientes computacionais.

  6. Escolha o ambiente computacional que você criou para este tutorial e, em seguida, escolha Desativar em Ações. Pode levar de 1 a 2 minutos para que o ambiente computacional seja desativado.

  7. Quando o Estado do ambiente computacional estiver desativado, escolha Excluir. Pode levar de 1 a 2 minutos para que o ambiente computacional seja excluído.

Recursos adicionais

Depois de concluir o tutorial, você pode querer explorar os seguintes tópicos:

Solução de problemas

Se os nós inicializados pelo AWS Batch não tiverem acesso ao repositório do Amazon ECR (ou a qualquer outro repositório) que armazena sua imagem, seus trabalhos poderão permanecer no estado STARTING. Isso ocorre porque o pod não conseguirá fazer download da imagem e executar seu trabalho do AWS Batch. Se você clicar no nome do pod iniciado pelo AWS Batch, poderá ver a mensagem de erro e confirmar o problema. A mensagem de erro deve ser semelhante à seguinte:

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 outros cenários comuns de solução de problemas, consulte Solução de problemas com o AWS Batch. Para solução de problemas com base no status do pod, consulte Como solucionar problemas do status do pod no Amazon EKS?.