Criar nós autogerenciados com blocos de capacidade para ML - Amazon EKS

Ajudar a melhorar esta página

Quer contribuir para este guia do usuário? Role até o final desta página e selecione Editar esta página no GitHub. Suas contribuições ajudarão a tornar nosso guia do usuário melhor para todos.

Criar nós autogerenciados com blocos de capacidade para ML

Os blocos de capacidade para machine learning (ML) permitem que você reserve instâncias com GPU para uma data futura, a fim de dar suporte a workloads de ML de curta duração. Para obter mais informações, consulte Blocos de capacidade para ML no Guia do Usuário do Amazon EC2 para Instâncias Linux.

Considerações

Importante
  • Os blocos de capacidade só estão disponíveis para determinados tipos de instância do Amazon EC2 e Regiões da AWS. Para obter informações sobre compatibilidade, consulte Trabalhar com pré-requisitos de blocos de capacidade no Guia do usuário do Amazon EC2 para instâncias Linux.

  • No momento, os blocos de capacidade não podem ser usados com o Karpenter.

  • Se você criar o grupo de nós autogerenciados antes de a reserva de capacidade se tornar ativa, defina a capacidade desejada como 0.

  • Para permitir tempo suficiente para a drenagem adequada do(s) nó(s), sugerimos que você agende o dimensionamento para reduzir para zero mais de 30 minutos antes do horário de término da reserva do bloco de capacidade.

  • Para que os Pods sejam drenados facilmente, recomendamos definir o AWS Node Termination Handler conforme explicado nas próximas etapas.

Usar blocos de capacidade com nós autogerenciados

Você pode usar blocos de capacidade com o Amazon EKS para provisionar e escalar seus nós autogerenciados. As etapas a seguir fornecem um exemplo geral de visão geral. Os exemplos de modelos do AWS CloudFormation não abrangem todos os aspectos necessários em uma workload de produção. Normalmente, também convém um script de inicialização para unir o nó ao cluster, especificar a AMI acelerada do Amazon EKS e um perfil de instância apropriado para unir ao cluster. Para ter mais informações, consulte Criar nós autogerenciados do Amazon Linux.

  1. Crie um modelo de execução que seja aplicável à workload. Para obter mais informações, consulte Usar blocos de capacidade para workloads de machine learning no Guia do usuário do Amazon EC2 Auto Scaling.

    Certifique-se de que LaunchTemplateData inclua o seguinte:

    • InstanceMarketOptions com MarketType definido como "capacity-block"

    • CapacityReservationSpecification: CapacityReservationTarget com CapacityReservationId definido como bloco de capacidade (por exemplo:cr-02168da1478b509e0)

    • IamInstanceProfile com o Arn definido como o iam-instance-profile-arn aplicável

    • ImageId definido como o image-id aplicável

    • InstanceType definido como um tipo de instância compatível com blocos de capacidade (por exemplo: p5.48xlarge)

    • SecurityGroupIds definido como os IDs aplicáveis (por exemplo: sg-05b1d815d1EXAMPLE)

    • UserData definido como o user-data aplicável para seu grupo de nós autogerenciados

    Veja a seguir um trecho de um modelo do CloudFormation para criar um modelo de execução direcionado a um bloco de capacidade.

    NodeLaunchTemplate: Type: "AWS::EC2::LaunchTemplate" Properties: LaunchTemplateData: InstanceMarketOptions: MarketType: "capacity-block" CapacityReservationSpecification: CapacityReservationTarget: CapacityReservationId: "cr-02168da1478b509e0" IamInstanceProfile: Arn: iam-instance-profile-arn ImageId: image-id InstanceType: p5.48xlarge KeyName: key-name SecurityGroupIds: - sg-05b1d815d1EXAMPLE UserData: user-data

    Você deve passar a sub-rede na zona de disponibilidade na qual a reserva é feita porque os blocos de capacidade são zonais.

  2. Use o modelo de execução para criar um grupo de nós autogerenciados. Se você estiver criando o grupo de nós autogerenciados antes de a reserva de capacidade se tornar ativa, defina a capacidade desejada como 0. Ao criar o grupo de nós, certifique-se de especificar apenas a sub-rede correspondente à Zona de Disponibilidade na qual a capacidade está reservada.

    Veja abaixo um modelo do CloudFormation de exemplo que pode ser utilizado como referência ao criar um modelo que seja aplicável à sua workload. Esse exemplo obtém o LaunchTemplateId e a Version do recurso AWS::Amazon EC2::LaunchTemplate mostrado no exemplo anterior. Ele também obtém os valores paraDesiredCapacity, MaxSize, MinSize e VPCZoneIdentifier que são declarados em outro lugar no mesmo modelo.

    NodeGroup: Type: "AWS::AutoScaling::AutoScalingGroup" Properties: DesiredCapacity: !Ref NodeAutoScalingGroupDesiredCapacity LaunchTemplate: LaunchTemplateId: !Ref NodeLaunchTemplate Version: !GetAtt NodeLaunchTemplate.LatestVersionNumber MaxSize: !Ref NodeAutoScalingGroupMaxSize MinSize: !Ref NodeAutoScalingGroupMinSize VPCZoneIdentifier: !Ref Subnets Tags: - Key: Name PropagateAtLaunch: true Value: !Sub ${ClusterName}-${NodeGroupName}-Node - Key: !Sub kubernetes.io/cluster/${ClusterName} PropagateAtLaunch: true Value: owned
  3. Depois que o grupo de nós for criado com sucesso, certifique-se de registrar o NodeInstanceRole para o grupo de nós que foi criado. Você precisa disso para garantir que, quando o grupo de nós for escalado, os novos nós se juntem ao cluster e Kubernetes sejam capazes de reconhecer os nós. Para obter mais informações, consulte as instruções AWS Management Console em Criar nós autogerenciados do Amazon Linux.

  4. Recomendamos que você crie uma política de escalabilidade programada para o grupo do Auto Scaling que se alinhe aos horários de reserva do bloco de capacidade. Para obter mais informações, consulte Escalabilidade agendada para o Amazon EC2 Auto Scaling no Manual do usuário do Amazon EC2 Auto Scaling.

    Você pode usar todas as instâncias reservadas até 30 minutos antes do horário final do bloco de capacidade. As instâncias que ainda estiverem em execução nesse momento começarão a ser encerradas. Para permitir tempo suficiente para a drenagem adequada do(s) nó(s), sugerimos que você agende o dimensionamento para reduzir para zero mais de 30 minutos antes do horário de término da reserva do bloco de capacidade.

    Se, em vez disso, quiser aumentar a escala manualmente sempre que a reserva de capacidade chegar a Active, você precisará atualizar a capacidade desejada do grupo do Auto Scaling no horário de início da reserva do bloco de capacidade. Em seguida, você também precisaria reduzir a escala manualmente mais de 30 minutos antes do horário de término da reserva do bloco de capacidade.

  5. O grupo de nós agora está pronto para workloads e Pods para ser programado.

  6. Para que você Pods seja drenado normalmente, recomendamos que você configure o Manipulador do término do nó AWS. Esse manipulador poderá observar os eventos do ciclo de vida “ASG Scale-in” do Amazon EC2 Auto Scaling usando o EventBridge Kubernetes e permitir que o ajuste de escala automático execute as ações necessárias antes que a instância fique indisponível. Caso contrário, seus objetos Pods e Kubernetes ficarão presos em um estado pendente. Para obter mais informações, consulte Manipulador do término do nó da AWS no GitHub.

    Se você não configurar um Manipulador de término do nó, recomendamos que comece a drenar seus Pods manualmente antes de chegar à janela de 30 minutos, para que haja tempo suficiente para a drenagem adequada.