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á.
Introdução aos AWS Batch clusters privados do Amazon EKS
AWS Batch é um serviço gerenciado que orquestra cargas de trabalho em lotes em 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 AWS Batch para executar seus trabalhos em grande escala. Você pode usar eksctl
Por padrão, os clusters privados do Amazon EKS não têm acesso à inbound/outbound Internet, e você só pode acessar o servidor de API de dentro da sua VPC ou de uma rede conectada. Os endpoints do Amazon VPC são usados para permitir o acesso privado a outros serviços. AWS
eksctl
suporta a criação de clusters totalmente privados usando uma Amazon VPC e sub-redes preexistentes.
também cria endpoints da Amazon VPC na Amazon VPC fornecida e modifica as tabelas de rotas para as sub-redes fornecidas.eksctl
Cada sub-rede deve ter uma tabela de rotas explícita associada a ela, pois o
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.eksctl
Opcionalmente, é possível criar uma regra de cache de pullthrough com o Amazon ECR. Depois que uma regra de cache pull through é criada para um registro público externo, você pode extrair uma imagem desse registro público externo usando o identificador uniforme de recursos (URI) do 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 AWS Batch.
- Características usadas
-
Este tutorial mostra como usar o AWS CLI, para:
-
Use o Amazon Elastic Container Registry (Amazon ECR) para armazenar imagens de contêineres
-
Crie e configure um ambiente computacional Amazon EKS
-
Crie uma fila de trabalhos.
-
Crie uma definição de trabalho
-
Crie e envie um trabalho para execução
-
Envie um trabalho com substituições
-
- Tempo necessário
-
A conclusão deste tutorial deve levar cerca de 40 a 50 minutos.
- Restrições regionais
-
Não há restrições nacionais ou regionais associadas ao uso dessa solução.
- Custos de uso de recursos
-
Não há cobrança pela criação de uma AWS conta. 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 EC2 Instância da Amazon Você paga por cada EC2 instância da Amazon criada. Para obter mais informações sobre preços, consulte Amazon EC2 Pricing .
Pré-requisitos
Este tutorial usa AWS CloudShell um shell pré-autenticado baseado em navegador que você inicia diretamente do. AWS Management Console Isso permite o acesso ao cluster quando ele não tem mais acesso público à Internet. O AWS CLI,kubectl
, e eksctl
pode já estar instalado como parte do AWS CloudShell. Para obter mais informações sobre AWS CloudShell, consulte o Guia AWS CloudShell do usuário. Uma alternativa 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 AWS serviços, 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 o AWS CLI, recomendamos que você também o 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ão1.23
ou superior. Para obter mais informações, consulte Instalar ou atualizar okubectl
no Guia do usuário do Amazon EKS. -
: 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ãoeksctl
0.115.0
ou superior. Para obter mais informações, consulte Instalar ou atualizar oeksctl
no Guia do usuário do Amazon EKS. -
Permissões — Os usuários que chamam a operação da CreateComputeEnvironmentAPI para criar um ambiente computacional que usa os recursos do Amazon EKS precisam de permissões para a
eks:DescribeCluster
operação daeks:ListClusters
API. Você pode anexar a política AWSBatchFullAccessgerenciada à sua conta de usuário seguindo as instruções Adicionar e remover permissões de identidade do IAM no Guia do usuário do IAM. -
InstanceRole— Você precisa criar um
InstanceRole
para seus nós do Amazon EKS que tenha asAmazonEC2ContainerRegistryPullOnly
políticasAmazonEKSWorkerNodePolicy
e. Para obter instruções sobre como criar a função IAM do nó Amazon EKS,InstanceRole
consulte Criação da função IAM do nó Amazon EKS. Você precisará do ARN do.InstanceRole
-
Conta da AWS ID — Você precisa saber sua Conta da AWS identidade. Siga as instruções em Visualizar seu Conta da AWS ID.
-
(Opcional) CloudWatch — Para examinar os detalhes de (Opcional) Enviar um trabalho com substituições, o registro deve ser configurado. Para obter mais informações, consulte Use CloudWatch registros para monitorar trabalhos AWS Batch do Amazon EKS.
Etapa 1: Crie 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
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.eksctl
-
Abra o AWS CloudShell console
e defina a região como us-east-1
. Para o resto do tutorial, verifique se você está usandous-east-1
. -
Crie um cluster EKS privado na
us-east-1
região usando o arquivo de
configuração de amostra. Salve o arquivo yaml em seu AWS CloudShell ambiente e dê um nome a eleeksctl
clusterConfig.yaml
. Você pode alterarmy-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 -
Crie seus recursos usando o comando:
eksctl create cluster -f clusterConfig.yaml
. A criação do cluster pode levar de 10 a 15 minutos. -
Depois que o cluster terminar de ser criado, você deverá adicionar seu endereço AWS CloudShell IP à lista de permissões. Para encontrar seu endereço AWS CloudShell IP, execute o seguinte comando:
curl http://checkip.amazonaws.com
Depois de ter o endereço IP público, você precisa 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 -
Para testar se você tem acesso aos nós, execute o seguinte comando:
kubectl get nodes
A saída do comando é:
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: Preparar seu cluster EKS para AWS Batch
Todas as etapas são obrigatórias e devem ser executadas em AWS CloudShell.
-
Crie um namespace dedicado para trabalhos 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
-
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 EOFSaída:
clusterrole.rbac.authorization.k8s.io/aws-batch-cluster-role created clusterrolebinding.rbac.authorization.k8s.io/aws-batch-cluster-role-binding created
Crie uma Kubernetes função com escopo de namespace para gerenciar e fazer o ciclo de vida dos AWS Batch pods e vinculá-los. 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 EOFSaí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 Kubernetes
aws-auth
de configuração para mapear as permissões anteriores do RBAC para a função vinculada ao serviço. AWS Batch$
eksctl create iamidentitymapping \ --cluster
my-test-cluster
\ --arn "arn:aws:iam::<your-account-ID>
:role/AWSServiceRoleForBatch" \ --usernameaws-batch
Saída:
2022-10-25 20:19:57 [ℹ] adding identity "arn:aws:iam::
<your-account-ID>
:role/AWSServiceRoleForBatch" to auth ConfigMapnota
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çãoaws-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 Amazon EKS
AWS Batch ambientes computacionais definem parâmetros de recursos computacionais para atender às suas necessidades de carga de trabalho em lotes. Em um ambiente computacional gerenciado, AWS Batch ajuda você a gerenciar a capacidade e os tipos de instância dos recursos computacionais (Kubernetesnós) dentro do seu cluster 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 EC2 sob demanda ou instâncias EC2 spot.
Agora que a função AWSServiceRoleForBatchvinculada ao serviço tem acesso ao seu cluster Amazon EKS, você pode criar AWS Batch recursos. Primeiro, crie um ambiente computacional que aponte para seu cluster do Amazon EKS.
-
Para
subnets
executareksctl get cluster
para obter as sub-redes usadas pelo cluster.my-test-cluster
-
Como
securityGroupIds
parâmetro, você pode usar o mesmo grupo de segurança do cluster 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 que
instanceRole
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
::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
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 conectar o ambiente computacional
Importante
É importante confirmar se o ambiente de computação está íntegro antes de continuar. A operação DescribeComputeEnvironmentsda API 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 AWS Batch gerenciados que se juntaram ao cluster 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: Crie 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.
-
O comando a seguir cria a regra de cache pull-through. Você pode
tutorial-prefix
substituir 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 -
Autentique-se 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.rproxy.govskope.caAgora você pode puxar uma imagem.
docker pull
<your-account-ID>
.dkr.ecr.us-east-1.amazonaws.com/my-prefix
/amazonlinux/amazonlinux:2 -
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 -
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 Job 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 tarefa 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
-
Há considerações sobre os parâmetros
cpu
ememory
. Para obter mais informações, consulte Considerações sobre memória e vCPU para o Amazon AWS Batch EKS.
Etapa 7: enviar um trabalho para execução
Execute o AWS CLI comando a seguir AWS CloudShell para enviar um novo Job e retornar o JobID exclusivo.
$
aws batch submit-job --job-queue
My-Eks-JQ1
\ --job-definitionMyJobOnEks_Sleep
- -job-nameMy-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: Exibir a saída do trabalho
Para verificar o status de um Job:
$
aws batch describe-jobs --job
<JobID-from-submit-response>
A startedAt
banda stoppedAt
deve 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
-
Para melhorar a visibilidade dos detalhes das operações, ative o log do ambiente de gerenciamento Amazon EKS. Para obter mais informações, consulte Logs do ambiente de gerenciamento do Amazon EKS no Guia do usuário do Amazon EKS.
-
A sobrecarga de Daemonsets e kubelets afeta os recursos de vCPU e memória disponíveis, especificamente a escalabilidade e o posicionamento do trabalho. Para obter mais informações, consulte Considerações sobre memória e vCPU para o Amazon AWS Batch EKS.
Etapa 10: Limpe os recursos do seu tutorial
Você será cobrado pela EC2 instância da Amazon enquanto ela estiver ativada. Você pode excluir a instância para parar de incorrer em cobranças.
Para excluir os recursos que você criou, faça o seguinte:
-
Abra o AWS Batch console em https://console.aws.amazon.com/batch/
. -
No painel de navegação, escolha Job queue.
-
Na tabela Fila de trabalhos, escolha a fila de trabalhos que você criou para o tutorial.
-
Em Ações, escolha Desativar. Depois que o estado da fila de trabalhos estiver desativado, você poderá escolher Excluir.
-
Depois que a fila de Job for excluída, no painel de navegação, escolha Ambientes de computação.
-
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.
-
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, talvez você queira explorar os seguintes tópicos:
-
Saiba mais sobre as melhores práticas.
-
Explore os componentes AWS Batch principais. Para obter mais informações, consulte Componentes do AWS Batch.
-
Saiba mais sobre os diferentes ambientes de computação disponíveis em AWS Batch.
-
Saiba mais sobre as filas de trabalhos e suas diferentes opções de agendamento.
-
Saiba mais sobre as definições de Job e as diferentes opções de configuração.
-
Saiba mais sobre os diferentes tipos de trabalhos.
Solução de problemas
Se os nós lançados por AWS Batch não tiverem acesso ao repositório 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á baixar a imagem e executar seu AWS Batch trabalho. Se você clicar no nome do pod lançado por 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 solucionar problemas com base no status do pod, consulte Como eu soluciono o status do pod no Amazon EKS