Tutorial: 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á.

Tutorial: 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. O suporte para clusters privados do Amazon EKS no AWS Batch está geralmente disponível em Regiões da AWS comerciais em que o AWS Batch está disponível.

Clusters somente privados do Amazon EKS não têm acesso de entrada/saída à Internet e têm somente sub-redes privadas. Endpoints da Amazon VPC 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.

Pré-requisitos

Antes de iniciar este tutorial, você deve instalar e configurar as ferramentas e os recursos a seguir necessários para criar e gerenciar os recursos do AWS Batch e do Amazon EKS. Você também precisa criar todos os recursos necessários, incluindo a VPC, sub-redes, tabelas de rotas, endpoints de VPC e o cluster do Amazon EKS. Talvez seja necessário usar a AWS CLI.

  • AWS CLI: uma ferramenta de linha de comando para trabalhar com os serviços da 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ê 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 obrigatórias do AWS Identity and Access Management (IAM): a entidade principal de segurança do IAM que você está usando deve ter permissões para trabalhar com perfis do IAM do Amazon EKS e perfis vinculados ao serviço, o AWS CloudFormation e uma VPC com recursos relacionados. Para obter mais informações, consulte Ações, recursos e chaves de condição do Amazon Elastic Kubernetes Service e Usar perfis vinculados a serviço, no Guia do usuário do IAM. Você deve concluir todas as etapas deste manual como o mesmo usuário.

  • Como criar um cluster do Amazon EKS: para obter mais informações, consulte Introdução ao Amazon EKS: eksctl no Guia do usuário do Amazon EKS.

    nota

    O AWS Batch não fornece orquestração de nós gerenciados para CoreDNS ou outros pods de implantação. Se você precisar do CoreDNS, consulte Adicionar o complemento CoreDNS do Amazon EKS no Guia do usuário do Amazon EKS. Ou use eksctl create cluster create para criar o cluster. Ele inclui o CoreDNS por padrão.

  • Permissões: os usuários que chamam a operação CreateComputeEnvironment da API para criar um ambiente de computação que usa recursos do Amazon EKS precisam de permissões para a operação eks:DescribeCluster da API. Usar o AWS Management Console para criar um recurso computacional com recursos do Amazon EKS requer permissões para eks:DescribeCluster e eks:ListClusters.

  • Crie um cluster do EKS privado na região us-east-1 usando o arquivo de configuração de amostra de 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

    Crie seus recursos com o comando: eksctl create cluster -f clusterConfig.yaml

  • Nós gerenciados em lote devem ser implantados em sub-redes que tenham os endpoints de interface da VPC necessários. Para obter mais informações, consulte Requisitos de clusters privados.

Prepare seu cluster do EKS para AWS Batch

Todas as etapas são necessárias.

  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

    Saída:

    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.

    nota

    Para obter mais informações sobre o uso de autorização RBAC, consulte Usar a autorização RBAC na documentação do 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

    Saída:

    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

    Saída:

    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-cluster-name \ --arn "arn:aws:iam::<your-account>:role/AWSServiceRoleForBatch" \ --username aws-batch

    Saída:

    2022-10-25 20:19:57 [ℹ] adding identity "arn:aws:iam::<your-account>: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.

Criar um ambiente de computação 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.

$ 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
Observações
  • Como o parâmetro serviceRole não deve ser especificado, a função do AWS Batch vinculada ao serviço será usada. O AWS Batch no Amazon EKS só oferece suporte à função do AWS Batch vinculada ao serviço.

  • Somente as estratégias de alocação BEST_FIT_PROGRESSIVE, SPOT_CAPACITY_OPTIMIZED e SPOT_PRICE_CAPACITY_OPTIMIZED são compatíveis com ambientes de computação do Amazon EKS.

    nota

    Recomendamos que você use SPOT_PRICE_CAPACITY_OPTIMIZED em vez de SPOT_CAPACITY_OPTIMIZED na maioria das instâncias.

  • Para o instanceRole, consulte Criar o perfil do IAM do nó do Amazon EKS e Habilitar o acesso da entidade principal do IAM ao seu cluster no Guia do usuário do Amazon EKS. Se você estiver usando redes de pods, consulte Como configurar o plugin CNI da Amazon VPC para o Kubernetes para usar perfis do IAM para contas de serviço no Guia do usuário do Amazon EKS.

  • Uma forma de fazer com que as sub-redes funcionem para o parâmetro subnets é usar as sub-redes públicas dos grupos de nós gerenciados do Amazon EKS que foram criadas pelo eksctl ao criar um cluster do Amazon EKS. Caso contrário, use sub-redes que tenham um caminho de rede compatível com a extração de imagens.

  • O parâmetro securityGroupIds 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.

    $ eks describe-cluster \ --name <cluster-name> \ --query cluster.resourcesVpcConfig.clusterSecurityGroupId
  • 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.

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 ter mais informações, consulte Solução de problemas AWS Batch.

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

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

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

Crie uma definição de trabalho

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": "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 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.

Enviar um trabalho

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

(Opcional) Envie 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

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 obter bases de solução de problemas sobre o status do pod, consulte Como solucionar problemas do status do pod no Amazon EKS?.